Commit 589769ce authored by intrigeri's avatar intrigeri
Browse files

Merge remote-tracking branch 'origin/master' into stable

parents c4d6588f ff2622ea
...@@ -8,7 +8,7 @@ msgstr "" ...@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: tails-l10n@boum.org\n" "Report-Msgid-Bugs-To: tails-l10n@boum.org\n"
"POT-Creation-Date: 2019-11-20 10:00+0000\n" "POT-Creation-Date: 2019-11-20 10:00+0000\n"
"PO-Revision-Date: 2019-12-28 11:25+0000\n" "PO-Revision-Date: 2019-12-28 18:25+0000\n"
"Last-Translator: drebs <drebs@riseup.net>\n" "Last-Translator: drebs <drebs@riseup.net>\n"
"Language-Team: \n" "Language-Team: \n"
"Language: pt\n" "Language: pt\n"
...@@ -33,7 +33,8 @@ msgstr "" ...@@ -33,7 +33,8 @@ msgstr ""
#. type: Plain text #. type: Plain text
msgid "All mailing lists are in English unless specified otherwise." msgid "All mailing lists are in English unless specified otherwise."
msgstr "" msgstr ""
"Todas as listas de e-mail são em inglês, a menos que seja dito o contrário." "Todas as listas de e-mail são em inglês, a menos que esteja indicado o "
"contrário."
#. type: Plain text #. type: Plain text
#, no-wrap #, no-wrap
...@@ -111,7 +112,7 @@ msgid "" ...@@ -111,7 +112,7 @@ msgid ""
"news.html>." "news.html>."
msgstr "" msgstr ""
"Arquivo público da lista amnesia-news: <https://lists.autistici.org/list/" "Arquivo público da lista amnesia-news: <https://lists.autistici.org/list/"
"amnesia-news.html/>." "amnesia-news.html>."
#. type: Plain text #. type: Plain text
#, no-wrap #, no-wrap
...@@ -180,7 +181,7 @@ msgid "" ...@@ -180,7 +181,7 @@ msgid ""
"project.html>." "project.html>."
msgstr "" msgstr ""
"Arquivo público da lista tails-project: <https://lists.autistici.org/list/" "Arquivo público da lista tails-project: <https://lists.autistici.org/list/"
"tails-project.html/>." "tails-project.html>."
#. type: Plain text #. type: Plain text
#, no-wrap #, no-wrap
...@@ -224,8 +225,8 @@ msgid "" ...@@ -224,8 +225,8 @@ msgid ""
"want to [[contribute code|contribute/how/code]]." "want to [[contribute code|contribute/how/code]]."
msgstr "" msgstr ""
"tails-dev@boum.org é a lista de e-mail onde o trabalho de desenvolvimento é " "tails-dev@boum.org é a lista de e-mail onde o trabalho de desenvolvimento é "
"coordenado e questões do design técnico são discutidas. Inscreva-se se você " "coordenado e questões de design técnico são discutidas. Inscreva-se se você "
"quer [[contribuir com código|contribute/how/code]]." "quiser [[contribuir com código|contribute/how/code]]."
#. type: Plain text #. type: Plain text
#, no-wrap #, no-wrap
...@@ -251,7 +252,7 @@ msgid "" ...@@ -251,7 +252,7 @@ msgid ""
"html>." "html>."
msgstr "" msgstr ""
"Arquivo público da lista tails-dev: <https://lists.autistici.org/list/tails-" "Arquivo público da lista tails-dev: <https://lists.autistici.org/list/tails-"
"dev.html/>." "dev.html>."
#. type: Plain text #. type: Plain text
#, no-wrap #, no-wrap
...@@ -294,7 +295,7 @@ msgid "" ...@@ -294,7 +295,7 @@ msgid ""
"[[test|contribute/how/testing]] new releases or features." "[[test|contribute/how/testing]] new releases or features."
msgstr "" msgstr ""
"tails-testers@boum.org é a lista de e-mails para pessoas que querem ajudar " "tails-testers@boum.org é a lista de e-mails para pessoas que querem ajudar "
"[[testando|contribute/how/testing]] novos lançamentos e funcionalidades." "[[testando|contribute/how/testing]] novos lançamentos ou funcionalidades."
#. type: Plain text #. type: Plain text
#, no-wrap #, no-wrap
...@@ -320,7 +321,7 @@ msgid "" ...@@ -320,7 +321,7 @@ msgid ""
"testers.html>." "testers.html>."
msgstr "" msgstr ""
"Arquivo público da lista tails-testers: <https://lists.autistici.org/list/" "Arquivo público da lista tails-testers: <https://lists.autistici.org/list/"
"tails-testers.html/>." "tails-testers.html>."
#. type: Plain text #. type: Plain text
#, no-wrap #, no-wrap
...@@ -362,8 +363,8 @@ msgid "" ...@@ -362,8 +363,8 @@ msgid ""
"tails-ux@boum.org is the list for matters related to [[user experience and " "tails-ux@boum.org is the list for matters related to [[user experience and "
"user interface|contribute/how/user_experience]]." "user interface|contribute/how/user_experience]]."
msgstr "" msgstr ""
"tails-ux@boum.org é a lista de e-mails para assuntos relacionados à " "tails-ux@boum.org é a lista de e-mails para assuntos relacionados a [["
"[[experência de usuário e interface de usuário|contribute/how/" "experência de usuário e interface de usuário|contribute/how/"
"user_experience]]." "user_experience]]."
#. type: Plain text #. type: Plain text
...@@ -389,7 +390,7 @@ msgid "" ...@@ -389,7 +390,7 @@ msgid ""
"Public archive of tails-ux: <https://lists.autistici.org/list/tails-ux.html>." "Public archive of tails-ux: <https://lists.autistici.org/list/tails-ux.html>."
msgstr "" msgstr ""
"Arquivo público da lista tails-ux: <https://lists.autistici.org/list/tails-" "Arquivo público da lista tails-ux: <https://lists.autistici.org/list/tails-"
"ux.html/>." "ux.html>."
#. type: Plain text #. type: Plain text
#, no-wrap #, no-wrap
...@@ -538,18 +539,17 @@ msgid "" ...@@ -538,18 +539,17 @@ msgid ""
"Team|contribute/working_together/roles/foundations_team]], write to\n" "Team|contribute/working_together/roles/foundations_team]], write to\n"
"<tails-foundations@boum.org>.\n" "<tails-foundations@boum.org>.\n"
msgstr "" msgstr ""
"Para entrar em contato com o [[Foundations\n"
"Team|contribute/working_together/roles/foundations_team]], escreva para\n"
"<tails-foundations@boum.org>.\n"
#. type: Plain text #. type: Plain text
#, fuzzy
#| msgid ""
#| "[[OpenPGP key|tails-accounting.key]] ([[details|doc/about/"
#| "openpgp_keys#accounting]])."
msgid "" msgid ""
"[[OpenPGP key|tails-foundations.key]] ([[details|doc/about/" "[[OpenPGP key|tails-foundations.key]] ([[details|doc/about/"
"openpgp_keys#foundations]])." "openpgp_keys#foundations]])."
msgstr "" msgstr ""
"[[Chave OpenPGP|tails-accounting.key]] ([[details|doc/about/" "[[Chave OpenPGP|tails-foundations.key]] ([[details|doc/about/"
"openpgp_keys#accounting]])." "openpgp_keys#foundations]])."
#. type: Plain text #. type: Plain text
#, no-wrap #, no-wrap
...@@ -584,8 +584,7 @@ msgid "<a id=\"tails-sysadmins\"></a>\n" ...@@ -584,8 +584,7 @@ msgid "<a id=\"tails-sysadmins\"></a>\n"
msgstr "<a id=\"tails-sysadmins\"></a>\n" msgstr "<a id=\"tails-sysadmins\"></a>\n"
#. type: Title - #. type: Title -
#, fuzzy, no-wrap #, no-wrap
#| msgid "tails-sysadmins\n"
msgid "tails-sysadmins\n" msgid "tails-sysadmins\n"
msgstr "tails-sysadmins\n" msgstr "tails-sysadmins\n"
...@@ -607,34 +606,30 @@ msgstr "" ...@@ -607,34 +606,30 @@ msgstr ""
"openpgp_keys#sysadmins]])." "openpgp_keys#sysadmins]])."
#. type: Plain text #. type: Plain text
#, fuzzy, no-wrap #, no-wrap
#| msgid "<a id=\"tails-accounting\"></a>\n"
msgid "<a id=\"tails-translations\"></a>\n" msgid "<a id=\"tails-translations\"></a>\n"
msgstr "<a id=\"tails-accounting\"></a>\n" msgstr "<a id=\"tails-translations\"></a>\n"
#. type: Title - #. type: Title -
#, fuzzy, no-wrap #, no-wrap
#| msgid "tails-sysadmins\n"
msgid "tails-translations\n" msgid "tails-translations\n"
msgstr "tails-sysadmins\n" msgstr "tails-translations\n"
#. type: Plain text #. type: Plain text
#, fuzzy, no-wrap #, no-wrap
#| msgid "If you want to operate a Tails mirror, write to <tails-mirrors@boum.org>.\n"
msgid "To talk about the [[Tails translation platform|contribute/how/translate/with_translation_platform]], write to <tails-translations@boum.org>.\n" msgid "To talk about the [[Tails translation platform|contribute/how/translate/with_translation_platform]], write to <tails-translations@boum.org>.\n"
msgstr "Se você quer operar um espelho do Tails, escreva para <tails-mirrors@boum.org>.\n" msgstr ""
"Para falar sobre a [[plataforma de tradução do Tails|contribute/how/"
"translate/with_translation_platform]], escreva para <tails-"
"translations@boum.org>.\n"
#. type: Plain text #. type: Plain text
#, fuzzy
#| msgid ""
#| "[[OpenPGP key|tails-accounting.key]] ([[details|doc/about/"
#| "openpgp_keys#accounting]])."
msgid "" msgid ""
"[[OpenPGP key|tails-translations.key]] ([[details|doc/about/" "[[OpenPGP key|tails-translations.key]] ([[details|doc/about/"
"openpgp_keys#translations]])." "openpgp_keys#translations]])."
msgstr "" msgstr ""
"[[Chave OpenPGP|tails-accounting.key]] ([[details|doc/about/" "[[Chave OpenPGP|tails-translations.key]] ([[details|doc/about/"
"openpgp_keys#accounting]])." "openpgp_keys#translations]])."
#. type: Plain text #. type: Plain text
#, no-wrap #, no-wrap
...@@ -642,8 +637,7 @@ msgid "<a id=\"tails\"></a>\n" ...@@ -642,8 +637,7 @@ msgid "<a id=\"tails\"></a>\n"
msgstr "<a id=\"tails\"></a>\n" msgstr "<a id=\"tails\"></a>\n"
#. type: Title - #. type: Title -
#, fuzzy, no-wrap #, no-wrap
#| msgid "tails\n"
msgid "tails\n" msgid "tails\n"
msgstr "tails\n" msgstr "tails\n"
...@@ -653,8 +647,8 @@ msgid "" ...@@ -653,8 +647,8 @@ msgid ""
"disclosures, you can write encrypted emails to <tails@boum.org>." "disclosures, you can write encrypted emails to <tails@boum.org>."
msgstr "" msgstr ""
"Para assuntos que não foram mencionados acima e para relatar " "Para assuntos que não foram mencionados acima e para relatar "
"vulnerabilidades, você pode enviar e-mail criptografados para <tails@boum." "vulnerabilidades, você pode enviar e-mails criptografados para "
"org>." "<tails@boum.org>."
#. type: Plain text #. type: Plain text
msgid "" msgid ""
...@@ -668,8 +662,7 @@ msgid "<a id=\"chat\"></a>\n" ...@@ -668,8 +662,7 @@ msgid "<a id=\"chat\"></a>\n"
msgstr "<a id=\"chat\"></a>\n" msgstr "<a id=\"chat\"></a>\n"
#. type: Title = #. type: Title =
#, fuzzy, no-wrap #, no-wrap
#| msgid "Chat rooms\n"
msgid "Chat rooms\n" msgid "Chat rooms\n"
msgstr "Bate papo\n" msgstr "Bate papo\n"
...@@ -681,8 +674,8 @@ msgid "" ...@@ -681,8 +674,8 @@ msgid ""
msgstr "" msgstr ""
"Você pode entrar nas nossas salas de [[bate papo de usuários|support/chat]] " "Você pode entrar nas nossas salas de [[bate papo de usuários|support/chat]] "
"e [[bate papo de desenvolvedores|contribute/chat]]. Apenas alguns " "e [[bate papo de desenvolvedores|contribute/chat]]. Apenas alguns "
"desenvolvedores Tails ficam por lá, então e-mail é a forma preferencial de " "desenvolvedores do Tails ficam por lá, então e-mail é a forma preferencial "
"contato para qualquer coisa que possa ser de interesse mais amplo da " "de contato para qualquer coisa que possa ser de interesse mais amplo da "
"comunidade." "comunidade."
#, fuzzy #, fuzzy
......
[[!meta title="Automated tests implementation details"]] [[!meta title="Automated tests implementation details"]]
See the [[design and implementation
documentation|contribute/working_together/roles/sysadmins/Jenkins]]
of our current setup.
For Jenkins resources, see [[blueprint/automated_builds_and_tests/resources]]. For Jenkins resources, see [[blueprint/automated_builds_and_tests/resources]].
[[!toc levels=2]] [[!toc levels=2]]
Generating jobs
===============
We use code that lay in three different Git repositories to generate
automatically the list of Jenkins jobs for branches that are active in
the Tails main Git repo.
The first brick is the Tails
[[!tails_gitweb_repo pythonlib]], which extracts the list of
active branches and output the needed informations. This list is parsed
by the `generate_tails_iso_jobs` script run by a cronjob and deployed by
our [[!tails_gitweb_repo puppet-tails]]
`tails::jenkins::iso_jobs_generator` manifest.
This script output yaml files compatible with
[jenkins-job-builder](http://docs.openstack.org/infra/jenkins-job-builder).
It creates one `project` for each active branches, which in turn uses
three JJB `job templates` to create the three jobs for each branch: the
ISO build one, and wrapper job that is used to start the ISO test jobs.
This changes are pushed to our [[!tails_gitweb_repo jenkins-jobs]] git
repo by the cronjob, and thanks to their automatic deployment in our
`tails::jenkins::master` and `tails::gitolite::hooks::jenkins_jobs`
manifests in our [[!tails_gitweb_repo puppet-tails]] repo, this new
changes are applied automatically to our Jenkins instance.
Restarting slave VMs between jobs
=================================
This question is tracked in [[!tails_ticket 9486]].
For [[!tails_ticket 5288]] to be robust enough, if the test suite doesn't
_always_ clean between itself properly (e.g. when tests simply hang
and timeout), we might want to restart `isotesterN.lizard` between
each each ISO testing job.
If such VMs are Jenkins slave, then we can't do it as part of the job
itself, but workarounds are possible, such as having a job restart and
wait for the VM, that triggers another job that actually starts the
tests. Or, instead of running `jenkins-slave` on those VMs, running
one instance thereof somewhere else (in a Docker container on
`jenkins.lizard`?) and then have "restart the testing VM and wait for
it to come up" be part of the testing job.
This was discussed at least there:
* <http://jenkins-ci.361315.n4.nabble.com/How-to-reboot-a-slave-during-a-build-td4628820.html>
* <https://stackoverflow.com/questions/5543413/reconfigure-and-reboot-a-hudson-jenkins-slave-as-part-of-a-build>
We achieve this VM reboot by using 3 chained jobs:
* First one is a wrapper and trigger 2 other jobs. It is executed on the
isotester the test job is supposed to be assigned to. It puts the
isotester in offline mode and starts the second job, blocking while
waiting for it to complete. This way this isotester is left reserved
while the second job run, and the isotester name can be passed as a build
parameter to the second job. This job is low prio so it waits for
other second and third type of jobs to be completed before starting its
own.
* The second job is executed on the master (which has 4 build
executors). This job ssh into the said isotester and issue the
reboot. It needs to wait a reasonable amount of time for the Jenkins
slave to be stopped by the shutdown process so that no jobs gets assigned
to this isotester meanwhile. Stoping this Jenkins slave daemon usually
takes a few seconds. During testing, 5 seconds proved to be enough of
a delay for that, and more would mean unnecessary lagging time. It then
put the node back online again. This job is higher prio so that it is
not lagging behind other wrapper jobs in the queue.
* The third job is the test job, run on the freshly started isotester.
This one is high prio too to get executed before any other wrapper
jobs. These jobs are set to run concurrently, so that if a first one is
already running, a more recent one triggered by a new build will still
be able to run and not be blocked by the first running one.
<a id="chain"></a> <a id="chain"></a>
Chaining jobs Chaining jobs
...@@ -111,30 +41,6 @@ These are all supported by JJB v0.9+. ...@@ -111,30 +41,6 @@ These are all supported by JJB v0.9+.
As we'll have to pass some parameters, the ParameterizedTrigger plugin As we'll have to pass some parameters, the ParameterizedTrigger plugin
is the best candidate for us. is the best candidate for us.
Passing parameters through jobs
===============================
We already specified what kind of informations we want to pass from the
build job to the test job.
The ParameterizedTiggerPlugin is the one usually used for that kind of
work.
We'll use it for some basic parameter passing through jobs, but given
the test jobs will need to know a lot of them from the build job, we'll
also use the EnvInject plugin we're already using:
* In the build job, a script will collect every necessary parameters
defined in the automated test blueprint and outputing them in a file
in the /build-artifacts/ directory.
* This file is the one used by the build job, to setup the variables it
needs (currently only $NOTIFY_TO).
* At the end of the build job, this file is archived with the other
artifacts.
* At the beginning of the chained test job, this file is imported in
the workspace along with the build artifacts. The EnvInject pre-build
step uses it to setup the necessary variables.
Define which $OLD_ISO to test against Define which $OLD_ISO to test against
===================================== =====================================
...@@ -173,21 +79,3 @@ In the end, we will by default use the same ISO for both `--old-iso` and ...@@ -173,21 +79,3 @@ In the end, we will by default use the same ISO for both `--old-iso` and
`--iso`, except for the branches used to prepare releases (`devel` and `--iso`, except for the branches used to prepare releases (`devel` and
`stable`), so that we know if the upgrades are broken long before the `stable`), so that we know if the upgrades are broken long before the
next release. next release.
Retrieving the ISOs for the test
================================
We'll need a way to retrieve the different ISO needed for the test.
For the ISO related to the upstream build job, this shouln't be a
problem with #9597. We can get it with either wget, or a python script
using python-jenkins. That was the point of this ticket.
For the last release ISO, we have several means:
* Using wget to get them from http://iso-history.tails.boum.org. This
website is password protected, but we could set up another private
vhost for the isotesters.
* Using the git-annex repo directly.
We'll use the first one, as it's easier to implement.
...@@ -198,6 +198,8 @@ Cons: ...@@ -198,6 +198,8 @@ Cons:
* High initial money investment * High initial money investment
* Hosting this is a hard sell for collocations. * Hosting this is a hard sell for collocations.
* On-going cost for hosting this cluster. * On-going cost for hosting this cluster.
* Needs some development work to fully benefit from the performance
improvements.
### Availability ### Availability
...@@ -259,13 +261,36 @@ and test ~40 branches. Even adding only 2 such boxes would ...@@ -259,13 +261,36 @@ and test ~40 branches. Even adding only 2 such boxes would
increase the maximum throughput of our CI by 69% and immensely lower increase the maximum throughput of our CI by 69% and immensely lower
latency during heavy load times. latency during heavy load times.
This is assuming perfect load distribution, which requires VMs that ### Required development work
The above benchmarks assume perfect load distribution, which requires
Jenkins slaves that
can run both build and test jobs. It works fine in local limited can run both build and test jobs. It works fine in local limited
testing but this is not what we have set up on lizard at the moment: testing but this is not what we have set up on lizard at the moment:
there's a risk that a failed test job leaves the system in a bad shape there's a risk that a failed test job leaves the system in a bad shape
and breaks the following build job as we don't reboot before build and breaks the following build job as we don't reboot after build
jobs. We might need to either make test jobs more robust on failure, jobs. We might need to either make test jobs more robust on failure
or to start rebooting VMs before build jobs as well. ([[!tails_ticket 17216]]),
or to start rebooting the Jenkins slaves after build jobs as well.
To utilize more fully such nodes, we may need to raise the number of
vCPUs allocated to TailsToaster. For example, assuming 8 hyperthreads
per box, and 2 VMs per box, with our current settings (2 vCPUs
allocated to TailsToaster and Cucumber eats another vCPU core):
- when running 1 single test suite job,
up to 3 hyperthreads out of 8 are used;
- when running 2 concurrent test suite jobs,
up to 2×3=6 hyperthreads out of 8 are used.
Raising this number may make the test suite run faster at least when
there's only 1 test suite job running. It might even make it faster,
in most scenarios, when 2 concurrent test suite jobs are running: they
generally won't be using that much CPU power at the same time. OTOH it
could introduce some test fragility.
We should first measure if it's worth the effort.
## Run builds and/or tests in the cloud ## Run builds and/or tests in the cloud
......
...@@ -78,7 +78,7 @@ To use these tools, please first install the dependencies: ...@@ -78,7 +78,7 @@ To use these tools, please first install the dependencies:
- Images on our website are compressed and cleaned using the - Images on our website are compressed and cleaned using the
[[compress-image.sh]] script. To run this script you need the [[compress-image.sh]] script. To run this script you need the
`optipng`, `advancecomp`, and `mat` packages. `trimage` and `mat2` packages.
## QR codes ## QR codes
......
...@@ -3,13 +3,8 @@ ...@@ -3,13 +3,8 @@
set -e set -e
set -u set -u
if [ ! -x /usr/bin/optipng ]; then if [ ! -x /usr/bin/trimage ]; then
echo "Please install the \"optipng\" package." >&2 echo "Please install the \"trimage\" package." >&2
exit 1
fi
if [ ! -x /usr/bin/advdef ]; then
echo "Please install the \"advancecomp\" package." >&2
exit 1 exit 1
fi fi
...@@ -19,8 +14,7 @@ if [ ! -x /usr/bin/mat2 ]; then ...@@ -19,8 +14,7 @@ if [ ! -x /usr/bin/mat2 ]; then
fi fi
for image in "${@}" ; do for image in "${@}" ; do
optipng -o6 "${image}"
advdef -z3 "${image}"
mat2 "${image}" mat2 "${image}"
mv "${image%.*}.cleaned.${image#*.}" "${image}" trimage -f "${image}"
mv "${image%.*}.cleaned.${image##*.}" "${image}"
done done
...@@ -317,10 +317,7 @@ Below, importance level is evaluated based on: ...@@ -317,10 +317,7 @@ Below, importance level is evaluated based on:
* signing keys are managed with the `tails_secrets_jenkins` Puppet module * signing keys are managed with the `tails_secrets_jenkins` Puppet module
- web server: - web server:
* some configuration in the manifest ([[!tails_ticket 7107]]) * some configuration in the manifest ([[!tails_ticket 7107]])
* design documentation: * design documentation: [[sysadmins/Jenkins]]
- [[sysadmins/automated_builds_in_Jenkins]]
- [[sysadmins/automated_tests_in_Jenkins]]
- [[blueprint/automated_builds_and_tests/jenkins]]
* importance: critical (as a key component of our development process) * importance: critical (as a key component of our development process)
## Mail ## Mail
......
[[!meta title="Automated ISO/IMG builds and tests on Jenkins"]]
[[!toc levels=1]]
Generating jobs
===============
We generate automatically a set of Jenkins jobs for branches that are
active in the Tails main Git repository.
The first brick extracts the list of active branches and output the
needed information:
- [[!tails_gitweb config/chroot_local-includes/usr/lib/python3/dist-packages/tailslib/git.py]]
- [[!tails_gitweb config/chroot_local-includes/usr/lib/python3/dist-packages/tailslib/jenkins.py]]
This list is parsed by the `generate_tails_iso_jobs` script run by
a cronjob and deployed by our [[!tails_gitweb_repo puppet-tails]]
`tails::jenkins::iso_jobs_generator` manifest.
This script output YAML files compatible with
[jenkins-job-builder](http://docs.openstack.org/infra/jenkins-job-builder).
It creates one `project` for each active branch, which in turn uses
several JJB `job templates` to create jobs for each branch:
- `build_Tails_ISO_*`
- `reproducibly_build_Tails_ISO_*`
- `test_Tails_ISO_*`
This changes are pushed to our [[!tails_gitweb_repo jenkins-jobs]] git
repo by the cronjob, and thanks to their automatic deployment in our
`tails::jenkins::master` and `tails::gitolite::hooks::jenkins_jobs`
manifests in our [[!tails_gitweb_repo puppet-tails]] repo, these new
changes are applied to our Jenkins instance.
Passing parameters through jobs
===============================
We pass information from build job to follow-up jobs (reproducibility
testing, test suite) via two means:
- the Parameterized Trigger plugin, whenever it's sufficient
- the EnvInject plugin, for more complex cases:
* In the build job, a script collects the needed information and
writes it to a file that's saved as a build artifact.
* This file is used by the build job itself, to setup the variables it
needs (currently only `$NOTIFY_TO`).
* Follow-up jobs imported this file in the workspace along with the
build artifacts, then use an EnvInject pre-build step to load it