mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-23 14:00:56 +01:00
Make "phabricator.silent" disable build steps which rely on external services
Summary: Depends on D19084. Fixes T13078. When `phabricator.silent` is enabled, immediately fail the "HTTP Request", "CircleCI" and "Buildkite" build steps. This doesn't feel quite as clean as most of the other behavior of `phabricator.silent`, since these calls are not exactly notifications in the same way that email is, and failing to make these calls means that builds run differently (whereas failing to deliver email doesn't really do anything). However, I suspect that this behavior is almost always reasonable/correct, and that we can probably get away with it until this grey area between "notifications" and "external service calls" is more clearly defined. Test Plan: - Created a build with HTTP, CircleCI, and Buildkite steps. - Put install in `phabricator.silent` mode: all three steps failed with "declining, because silent" messages. - Put install back in normal mode: all three steps made HTTP requests. - Read updated documentation. Subscribers: PHID-OPKG-gm6ozazyms6q6i22gyam Maniphest Tasks: T13078 Differential Revision: https://secure.phabricator.com/D19085
This commit is contained in:
parent
a2453706ab
commit
f74e6bbf8d
5 changed files with 47 additions and 15 deletions
|
@ -37,6 +37,24 @@ final class PhabricatorCoreConfigOptions
|
||||||
$proto_doc_name = pht('User Guide: Prototype Applications');
|
$proto_doc_name = pht('User Guide: Prototype Applications');
|
||||||
$applications_app_href = '/applications/';
|
$applications_app_href = '/applications/';
|
||||||
|
|
||||||
|
$silent_description = $this->deformat(pht(<<<EOREMARKUP
|
||||||
|
This option allows you to stop Phabricator from sending data to most external
|
||||||
|
services: it will disable email, SMS, repository mirroring, remote builds,
|
||||||
|
Doorkeeper writes, and webhooks.
|
||||||
|
|
||||||
|
This option is intended to allow a Phabricator instance to be exported, copied,
|
||||||
|
imported, and run in a test environment without impacting users. For example,
|
||||||
|
if you are migrating to new hardware, you could perform a test migration first
|
||||||
|
with this flag set, make sure things work, and then do a production cutover
|
||||||
|
later with higher confidence and less disruption.
|
||||||
|
|
||||||
|
Without making use of this flag to silence the temporary test environment,
|
||||||
|
users would receive duplicate email during the time the test instance and old
|
||||||
|
production instance were both in operation.
|
||||||
|
EOREMARKUP
|
||||||
|
));
|
||||||
|
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
$this->newOption('phabricator.base-uri', 'string', null)
|
$this->newOption('phabricator.base-uri', 'string', null)
|
||||||
->setLocked(true)
|
->setLocked(true)
|
||||||
|
@ -232,21 +250,7 @@ final class PhabricatorCoreConfigOptions
|
||||||
pht('Run Normally'),
|
pht('Run Normally'),
|
||||||
))
|
))
|
||||||
->setSummary(pht('Stop Phabricator from sending any email, etc.'))
|
->setSummary(pht('Stop Phabricator from sending any email, etc.'))
|
||||||
->setDescription(
|
->setDescription($silent_description),
|
||||||
pht(
|
|
||||||
'This option allows you to stop Phabricator from sending '.
|
|
||||||
'any data to external services. Among other things, it will '.
|
|
||||||
'disable email, SMS, repository mirroring, and HTTP hooks.'.
|
|
||||||
"\n\n".
|
|
||||||
'This option is intended to allow a Phabricator instance to '.
|
|
||||||
'be exported, copied, imported, and run in a test environment '.
|
|
||||||
'without impacting users. For example, if you are migrating '.
|
|
||||||
'to new hardware, you could perform a test migration first, '.
|
|
||||||
'make sure things work, and then do a production cutover '.
|
|
||||||
'later with higher confidence and less disruption. Without '.
|
|
||||||
'this flag, users would receive duplicate email during the '.
|
|
||||||
'time the test instance and old production instance were '.
|
|
||||||
'both in operation.')),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -295,6 +295,18 @@ abstract class HarbormasterBuildStepImplementation extends Phobject {
|
||||||
->append($body);
|
->append($body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function logSilencedCall(
|
||||||
|
HarbormasterBuild $build,
|
||||||
|
HarbormasterBuildTarget $build_target,
|
||||||
|
$label) {
|
||||||
|
|
||||||
|
$build_target
|
||||||
|
->newLog($label, 'silenced')
|
||||||
|
->append(
|
||||||
|
pht(
|
||||||
|
'Declining to make service call because `phabricator.silent` is '.
|
||||||
|
'enabled in configuration.'));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -( Automatic Targets )-------------------------------------------------- */
|
/* -( Automatic Targets )-------------------------------------------------- */
|
||||||
|
|
|
@ -72,6 +72,11 @@ EOTEXT
|
||||||
HarbormasterBuildTarget $build_target) {
|
HarbormasterBuildTarget $build_target) {
|
||||||
$viewer = PhabricatorUser::getOmnipotentUser();
|
$viewer = PhabricatorUser::getOmnipotentUser();
|
||||||
|
|
||||||
|
if (PhabricatorEnv::getEnvConfig('phabricator.silent')) {
|
||||||
|
$this->logSilencedCall($build, $build_target, pht('Buildkite'));
|
||||||
|
throw new HarbormasterBuildFailureException();
|
||||||
|
}
|
||||||
|
|
||||||
$buildable = $build->getBuildable();
|
$buildable = $build->getBuildable();
|
||||||
|
|
||||||
$object = $buildable->getBuildableObject();
|
$object = $buildable->getBuildableObject();
|
||||||
|
|
|
@ -84,6 +84,11 @@ EOTEXT
|
||||||
HarbormasterBuildTarget $build_target) {
|
HarbormasterBuildTarget $build_target) {
|
||||||
$viewer = PhabricatorUser::getOmnipotentUser();
|
$viewer = PhabricatorUser::getOmnipotentUser();
|
||||||
|
|
||||||
|
if (PhabricatorEnv::getEnvConfig('phabricator.silent')) {
|
||||||
|
$this->logSilencedCall($build, $build_target, pht('CircleCI'));
|
||||||
|
throw new HarbormasterBuildFailureException();
|
||||||
|
}
|
||||||
|
|
||||||
$buildable = $build->getBuildable();
|
$buildable = $build->getBuildable();
|
||||||
|
|
||||||
$object = $buildable->getBuildableObject();
|
$object = $buildable->getBuildableObject();
|
||||||
|
|
|
@ -43,6 +43,12 @@ final class HarbormasterHTTPRequestBuildStepImplementation
|
||||||
HarbormasterBuildTarget $build_target) {
|
HarbormasterBuildTarget $build_target) {
|
||||||
|
|
||||||
$viewer = PhabricatorUser::getOmnipotentUser();
|
$viewer = PhabricatorUser::getOmnipotentUser();
|
||||||
|
|
||||||
|
if (PhabricatorEnv::getEnvConfig('phabricator.silent')) {
|
||||||
|
$this->logSilencedCall($build, $build_target, pht('HTTP Request'));
|
||||||
|
throw new HarbormasterBuildFailureException();
|
||||||
|
}
|
||||||
|
|
||||||
$settings = $this->getSettings();
|
$settings = $this->getSettings();
|
||||||
$variables = $build_target->getVariables();
|
$variables = $build_target->getVariables();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue