Discussion:
[Buildroot] [PATCH 0/3] .gitlab-ci.yml: add trigger per job and per type of job
Ricardo Martincoski
2018-10-28 23:58:36 UTC
Permalink
Hello,

This series allows the user of GitLab pipeline to trigger some interesting
subsets of jobs by pushing temporary branches with names that match regexps:
- all defconfigs: /.*-defconfigs$/
- all runtime tests: /.*-runtime-tests$/
- one defconfig: /.*-defconfig_name$/
- one test case: /.*-test_case_name$/
The check-* jobs keep being triggered for all pushes: branches that match one of
the regexps above, branches that don't match them, and tags.
Pushing a tag still triggers all jobs.

The first patch adds the first two regexps.
The second patch prepares to add the per job trigger but don't change any
functionality.
The last patch actually adds the per defconfig and per runtime test triggers.


With only patch 1 applied, using a local branch named test1:

$ git tag tag1
$ git push gitlab tag1
results in 260 jobs
https://gitlab.com/RicardoMartincoski/buildroot/pipelines/34613530

$ git push gitlab test1
results in 4 jobs
https://gitlab.com/RicardoMartincoski/buildroot/pipelines/34613494

$ git push gitlab HEAD:test1-defconfigs
results in 192 jobs
https://gitlab.com/RicardoMartincoski/buildroot/pipelines/34613558

$ git push gitlab HEAD:test1-runtime-tests
results in 72 jobs
https://gitlab.com/RicardoMartincoski/buildroot/pipelines/34613616


With all patches applied, using a local branch named test3:

$ git tag tag3
$ git push gitlab tag3
results in 260 jobs
https://gitlab.com/RicardoMartincoski/buildroot/pipelines/34614775

$ git push gitlab test3
results in 4 jobs
https://gitlab.com/RicardoMartincoski/buildroot/pipelines/34614682

$ git push gitlab HEAD:test3-defconfigs
results in 192 jobs
https://gitlab.com/RicardoMartincoski/buildroot/pipelines/34614821

$ git push gitlab HEAD:test3-runtime-tests
results in 72 jobs
https://gitlab.com/RicardoMartincoski/buildroot/pipelines/34614415

$ git push gitlab HEAD:test3-tests.core.test_file_capabilities.TestFileCapabilities
results in 5 jobs
https://gitlab.com/RicardoMartincoski/buildroot/pipelines/34614380

$ git push gitlab HEAD:test3-qemu_arm_versatile_defconfig
results in 5 jobs
https://gitlab.com/RicardoMartincoski/buildroot/pipelines/34614400


Regards,
Ricardo

Ricardo Martincoski (3):
.gitlab-ci.yml: add trigger per type of job
Makefile: offload .gitlab-ci.yml generation
.gitlab-ci.yml: add trigger per job

.gitlab-ci.yml | 2050 +++++++++++++++++++++---
.gitlab-ci.yml.in | 2 +
Makefile | 4 +-
support/scripts/generate-gitlab-ci-yml | 37 +
4 files changed, 1834 insertions(+), 259 deletions(-)
create mode 100755 support/scripts/generate-gitlab-ci-yml
--
2.17.1
Ricardo Martincoski
2018-10-28 23:58:37 UTC
Permalink
Currently the user has 2 sets of jobs that can be triggered on a GitLab
pipeline.
- to trigger all defconfigs, all runtime tests and all check-* jobs:
$ git tag <name>
$ git push gitlab <name> # currently 260 jobs
- to trigger only the check-* jobs:
$ git push gitlab HEAD:<name> # currently 4 jobs

This is not much versatile, so the user ends up hand-editing the
.gitlab-ci.yml in order to trigger some subsets, even the common ones,
for instance all runtime tests.

Add 2 more subsets that can be triggered based on the name of the
branch pushed.
- to trigger all defconfigs and all check-* jobs:
$ git push gitlab HEAD:<name>-defconfigs # currently 192 jobs
- to trigger all runtime tests and all check-* jobs:
$ git push gitlab HEAD:<name>-runtime-tests # currently 72 jobs

Signed-off-by: Ricardo Martincoski <***@gmail.com>
Cc: Arnout Vandecappelle <***@mind.be>
---
.gitlab-ci.yml | 2 ++
.gitlab-ci.yml.in | 2 ++
2 files changed, 4 insertions(+)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8b9a1f175c..d84c283dbc 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -51,6 +51,7 @@ check-package:
only:
- triggers
- tags
+ - /-defconfigs$/
script: *defconfig_script
artifacts:
when: always
@@ -67,6 +68,7 @@ check-package:
only:
- triggers
- tags
+ - /-runtime-tests$/
# Keep build directories so the rootfs can be an artifact of the job. The
# runner will clean up those files for us.
# Multiply every emulator timeout by 10 to avoid sporadic failures in
diff --git a/.gitlab-ci.yml.in b/.gitlab-ci.yml.in
index db526c4b5a..ebca29ca1f 100644
--- a/.gitlab-ci.yml.in
+++ b/.gitlab-ci.yml.in
@@ -51,6 +51,7 @@ check-package:
only:
- triggers
- tags
+ - /-defconfigs$/
script: *defconfig_script
artifacts:
when: always
@@ -67,6 +68,7 @@ check-package:
only:
- triggers
- tags
+ - /-runtime-tests$/
# Keep build directories so the rootfs can be an artifact of the job. The
# runner will clean up those files for us.
# Multiply every emulator timeout by 10 to avoid sporadic failures in
--
2.17.1
Thomas Petazzoni
2018-12-09 20:29:21 UTC
Permalink
Hello,
Post by Ricardo Martincoski
Currently the user has 2 sets of jobs that can be triggered on a GitLab
pipeline.
$ git tag <name>
$ git push gitlab <name> # currently 260 jobs
$ git push gitlab HEAD:<name> # currently 4 jobs
This is not much versatile, so the user ends up hand-editing the
.gitlab-ci.yml in order to trigger some subsets, even the common ones,
for instance all runtime tests.
Add 2 more subsets that can be triggered based on the name of the
branch pushed.
$ git push gitlab HEAD:<name>-defconfigs # currently 192 jobs
$ git push gitlab HEAD:<name>-runtime-tests # currently 72 jobs
This commit was applied by Arnout a while ago:
https://git.buildroot.org/buildroot/commit/?id=f177fd66e47879a72bb678a2de7ce658410cc4b9.
But apparently, the notification was not sent to the mailing list, and
the patchwork state was not updated. This mail does the former, and I'm
going to the latter :-)

Thanks!

Thomas
--
Thomas Petazzoni, CTO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
Ricardo Martincoski
2018-10-28 23:58:38 UTC
Permalink
GitLab has severe limitations imposed to triggers.
Using a variable in a regexp is not allowed:
| only:
| - /-$CI_JOB_NAME$/
| - /-\$CI_JOB_NAME$/
| - /-%CI_JOB_NAME%$/
Using the key 'variables' always lead to an AND with 'refs', so:
| only:
| refs:
| - branches
| - tags
| variables:
| - $CI_JOB_NAME == $CI_COMMIT_REF_NAME
would make the push of a tag not to trigger all jobs anymore.
Inheritance is used only for the second level of keys, so:
|.runtime_test: &runtime_test
| only:
| - tags
|tests.package.test_python_txaio.TestPythonPy2Txaio:
| <<: *runtime_test
| only:
| - /-TestPythonPy2Txaio$/
would override the entire key 'only', making the push of a tag not to
trigger all jobs anymore.

So, in order to have a trigger per job and still allow the push of a tag
to trigger all jobs (all this in a follow up patch), the regexp for each
job must be hardcoded in the .gitlab-ci.yml and also the inherited
values for key 'only' must be repeated for every job.
This is not a big issue, .gitlab-ci.yml is already automatically
generated from a template and there will be no need to hand-editing it
when jobs are added or removed.

Since the logic to generate the yaml file from the template will become
more complex, move the commands from the main Makefile to a script.

Using Python or other advanced scripting language for that script would
be the most versatile solution, but that would bring another dependency
on the host machine, pyyaml if Python is used. So every developer that
needs to run 'make .gitlab-ci.yml' and also the docker image used in the
GitLab pipelines would need to have pyyaml pre-installed.
Instead of adding the mentioned dependency, keep using a bash script.

While moving the commands to the script:
- mimic the behavior of the previous make target and fail on any
command that fails, by using 'set -e';
- break the original lines in one command per line, making the diff for
any patch to be applied to this file to look nicer;
- keep the script as simple as possible, without functions, just a
script that executes from the top to bottom;
- do not perform validations on the input parameters, any command that
fails already makes the script to fail;
- do not add an usage message, the script is not intended to be called
directly.

This patch does not change functionality.

Signed-off-by: Ricardo Martincoski <***@gmail.com>
Cc: Arnout Vandecappelle <***@mind.be>
---
NOTE:
Example of alternative script in Python:
https://gitlab.com/RicardoMartincoski/buildroot/commit/a39b7da5e8b6585eb86ce1102dd5a020c9fdec42
The downside is that it would add a dependency, so when someone runs
'make .gitlab-ci.yml' it would fail like this if pyyaml is not installed
in the host machine:
https://gitlab.com/RicardoMartincoski/buildroot/-/jobs/112928495
---
Makefile | 4 +---
support/scripts/generate-gitlab-ci-yml | 20 ++++++++++++++++++++
2 files changed, 21 insertions(+), 3 deletions(-)
create mode 100755 support/scripts/generate-gitlab-ci-yml

diff --git a/Makefile b/Makefile
index a69af3b645..6a80809ad2 100644
--- a/Makefile
+++ b/Makefile
@@ -1155,9 +1155,7 @@ check-package:

.PHONY: .gitlab-ci.yml
.gitlab-ci.yml: .gitlab-ci.yml.in
- cp $< $@
- (cd configs; LC_ALL=C ls -1 *_defconfig) | sed 's/$$/: *defconfig/' >> $@
- set -o pipefail; ./support/testing/run-tests -l 2>&1 | sed -r -e '/^test_run \((.*)\).*/!d; s//\1: *runtime_test/' | LC_ALL=C sort >> $@
+ ./support/scripts/generate-gitlab-ci-yml $< $@

include docs/manual/manual.mk
-include $(foreach dir,$(BR2_EXTERNAL_DIRS),$(sort $(wildcard $(dir)/docs/*/*.mk)))
diff --git a/support/scripts/generate-gitlab-ci-yml b/support/scripts/generate-gitlab-ci-yml
new file mode 100755
index 0000000000..d824f669b5
--- /dev/null
+++ b/support/scripts/generate-gitlab-ci-yml
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+set -e
+set -o pipefail
+
+input="${1}"
+output="${2}"
+
+cp "${input}" "${output}"
+
+(
+ cd configs
+ LC_ALL=C ls -1 *_defconfig
+) \
+ | sed 's/$/: *defconfig/' \
+ >> "${output}"
+
+./support/testing/run-tests -l 2>&1 \
+ | sed -r -e '/^test_run \((.*)\).*/!d; s//\1: *runtime_test/' \
+ | LC_ALL=C sort \
+ >> "${output}"
--
2.17.1
Thomas Petazzoni
2018-12-09 20:32:39 UTC
Permalink
Hello,
Post by Ricardo Martincoski
GitLab has severe limitations imposed to triggers.
| - /-$CI_JOB_NAME$/
| - /-\$CI_JOB_NAME$/
| - /-%CI_JOB_NAME%$/
| - branches
| - tags
| - $CI_JOB_NAME == $CI_COMMIT_REF_NAME
would make the push of a tag not to trigger all jobs anymore.
|.runtime_test: &runtime_test
| - tags
| <<: *runtime_test
| - /-TestPythonPy2Txaio$/
would override the entire key 'only', making the push of a tag not to
trigger all jobs anymore.
So, in order to have a trigger per job and still allow the push of a tag
to trigger all jobs (all this in a follow up patch), the regexp for each
job must be hardcoded in the .gitlab-ci.yml and also the inherited
values for key 'only' must be repeated for every job.
This is not a big issue, .gitlab-ci.yml is already automatically
generated from a template and there will be no need to hand-editing it
when jobs are added or removed.
Since the logic to generate the yaml file from the template will become
more complex, move the commands from the main Makefile to a script.
Using Python or other advanced scripting language for that script would
be the most versatile solution, but that would bring another dependency
on the host machine, pyyaml if Python is used. So every developer that
needs to run 'make .gitlab-ci.yml' and also the docker image used in the
GitLab pipelines would need to have pyyaml pre-installed.
Instead of adding the mentioned dependency, keep using a bash script.
- mimic the behavior of the previous make target and fail on any
command that fails, by using 'set -e';
- break the original lines in one command per line, making the diff for
any patch to be applied to this file to look nicer;
- keep the script as simple as possible, without functions, just a
script that executes from the top to bottom;
- do not perform validations on the input parameters, any command that
fails already makes the script to fail;
- do not add an usage message, the script is not intended to be called
directly.
This patch does not change functionality.
I've applied after changing one thing, see below.
Post by Ricardo Martincoski
diff --git a/support/scripts/generate-gitlab-ci-yml b/support/scripts/generate-gitlab-ci-yml
new file mode 100755
index 0000000000..d824f669b5
--- /dev/null
+++ b/support/scripts/generate-gitlab-ci-yml
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+set -e
+set -o pipefail
+
+input="${1}"
+output="${2}"
+
+cp "${input}" "${output}"
+
+(
+ cd configs
+ LC_ALL=C ls -1 *_defconfig
+) \
+ | sed 's/$/: *defconfig/' \
+ >> "${output}"
+
+./support/testing/run-tests -l 2>&1 \
+ | sed -r -e '/^test_run \((.*)\).*/!d; s//\1: *runtime_test/' \
+ | LC_ALL=C sort \
+ >> "${output}"
I think it is more common for this kind of script to output on stdout,
and have the caller redirect to a file. It makes the script slightly
simpler, since you don't have to redirect to ${output}. So I've changed
to use this solution before applying.

Thanks!

Thomas
--
Thomas Petazzoni, CTO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
Ricardo Martincoski
2018-10-28 23:58:39 UTC
Permalink
This post might be inappropriate. Click to display it.
Thomas Petazzoni
2018-12-09 20:59:21 UTC
Permalink
Hello,
Post by Ricardo Martincoski
diff --git a/support/scripts/generate-gitlab-ci-yml b/support/scripts/generate-gitlab-ci-yml
index d824f669b5..9efa775f88 100755
--- a/support/scripts/generate-gitlab-ci-yml
+++ b/support/scripts/generate-gitlab-ci-yml
@@ -7,14 +7,31 @@ output="${2}"
cp "${input}" "${output}"
+d_only_in=$(
+ awk '/^\.defconfig:/{x=1;next}/^[^ ]/{x=0}x' "${input}" \
+ | awk '/^ only/{x=1;next}/^ [^ ]/{x=0}x'
+)
+d_only=$( \
+ printf ":\n <<: *defconfig\n only:\n%s\n - /-" "$d_only_in"
+)
+
(
cd configs
LC_ALL=C ls -1 *_defconfig
) \
- | sed 's/$/: *defconfig/' \
+ | awk -v o="$d_only" '{i=$0; gsub(/\./,"\\.",i); print $0 o i "$/"}' \
Post by Ricardo Martincoski
"${output}"
+r_only_in=$(
+ awk '/^\.runtime_test:/{x=1;next}/^[^ ]/{x=0}x' "${input}" \
+ | awk '/^ only/{x=1;next}/^ [^ ]/{x=0}x'
+)
+r_only=$(
+ printf ":\n <<: *runtime_test\n only:\n%s\n - /-" "$r_only_in"
+)
+
./support/testing/run-tests -l 2>&1 \
- | sed -r -e '/^test_run \((.*)\).*/!d; s//\1: *runtime_test/' \
+ | sed -r -e '/^test_run \((.*)\).*/!d; s//\1/' \
| LC_ALL=C sort \
+ | awk -v o="$r_only" '{i=$0; gsub(/\./,"\\.",i); print $0 o i "$/"}' \
Post by Ricardo Martincoski
"${output}"
I'm very confused by all this awk sorcery, and looking at the output, I
wonder if something simpler like this wouldn't be better:

diff --git a/support/scripts/generate-gitlab-ci-yml b/support/scripts/generate-gitlab-ci-yml
index 431911d370..110de0b207 100755
--- a/support/scripts/generate-gitlab-ci-yml
+++ b/support/scripts/generate-gitlab-ci-yml
@@ -10,8 +10,29 @@ cat "${input}"
cd configs
LC_ALL=C ls -1 *_defconfig
) \
- | sed 's/$/: *defconfig/'
+ | while read defconfig; do
+ cat <<EOF
+${defconfig}:
+ <<: *defconfig
+ only:
+ - triggers
+ - tags
+ - /-defconfigs\$/
+ - /-${defconfig}\$/
+EOF
+ done

./support/testing/run-tests -l 2>&1 \
- | sed -r -e '/^test_run \((.*)\).*/!d; s//\1: *runtime_test/' \
- | LC_ALL=C sort
+ | sed -r -e '/^test_run \((.*)\).*/!d; s//\1/' \
+ | LC_ALL=C sort \
+ | while read runtest; do
+ cat <<EOF
+${runtest}:
+ <<: *runtime_test
+ only:
+ - triggers
+ - tags
+ - /-runtime-tests\$/
+ - /-${runtest//./\\.}\$/
+EOF
+done

This produces an output that is exactly identical to the one done by
your awk magic, and I personally find this shell based implementation a
lot simpler and easier to read. What do you think ?

Best regards,

Thomas
--
Thomas Petazzoni, CTO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
Matthew Weber
2018-12-10 13:30:09 UTC
Permalink
Ricardo,

On Sun, Oct 28, 2018 at 6:59 PM Ricardo Martincoski
Post by Ricardo Martincoski
- when adding or changing a defconfig;
- when adding or changing a runtime test case;
- when fixing some bug on a use case tested by a runtime test case.
Thank you for adding this! I have been thinking about how to better
monitor my defconfigs I'm maintaining. Now I'll setup some jobs
against my fork.
Post by Ricardo Martincoski
Currently there are 3 subsets of jobs that can easily be triggered by
$ git push gitlab HEAD:<name> # currently 4 jobs
$ git push gitlab HEAD:<name>-defconfigs # currently 192 jobs
$ git push gitlab HEAD:<name>-runtime-tests # currently 72 jobs
When the user wants to trigger a single defconfig or runtime test job,
hand-editing the .gitlab-ci.yml and creating a temporary commit are
currently needed.
Add 2 more subsets that can be triggered based on the name of the
branch pushed.
$ git push gitlab HEAD:<name>-<defconfig name> # currently 5 jobs
$ git push gitlab HEAD:<name>-<test case name> # currently 5 jobs
The check-* jobs are fast, so there is no need to either add a per job
trigger for them or remove them from the trigger for a specific
defconfig or runtime test case.
While adding those new triggers, use the full name of the job as suffix.
$ git push gitlab HEAD:test1-tests.toolchain.test_external.TestExternalToolchainBuildrootuClibc
$ git push gitlab HEAD:test2-olimex_a20_olinuxino_lime_legacy_defconfig
But those branches are temporary, and this way the user don't need to
think much, just copy and paste the job name as suffix.
---
NOTE: I am almost sure that those 2 awk to extract the 'only' key could
be merged, but my experience in awk is limited.
---
.gitlab-ci.yml | 2048 +++++++++++++++++++++---
support/scripts/generate-gitlab-ci-yml | 21 +-
2 files changed, 1811 insertions(+), 258 deletions(-)
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d84c283dbc..c6fc755c9b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
- test-output/*.log
- test-output/*/.config
- test-output/*/images/*
-acmesystems_aria_g25_128mb_defconfig: *defconfig
-acmesystems_aria_g25_256mb_defconfig: *defconfig
-acmesystems_arietta_g25_128mb_defconfig: *defconfig
-acmesystems_arietta_g25_256mb_defconfig: *defconfig
-amarula_vyasa_rk3288_defconfig: *defconfig
-arcturus_ucls1012a_defconfig: *defconfig
-arcturus_ucp1020_defconfig: *defconfig
-arm_foundationv8_defconfig: *defconfig
-arm_juno_defconfig: *defconfig
-armadeus_apf27_defconfig: *defconfig
-armadeus_apf28_defconfig: *defconfig
-armadeus_apf51_defconfig: *defconfig
-asus_tinker_rk3288_defconfig: *defconfig
-at91sam9260eknf_defconfig: *defconfig
-at91sam9g20dfc_defconfig: *defconfig
-at91sam9g45m10ek_defconfig: *defconfig
-at91sam9rlek_defconfig: *defconfig
-at91sam9x5ek_defconfig: *defconfig
-at91sam9x5ek_dev_defconfig: *defconfig
-at91sam9x5ek_mmc_defconfig: *defconfig
-at91sam9x5ek_mmc_dev_defconfig: *defconfig
-atmel_sama5d27_som1_ek_mmc_dev_defconfig: *defconfig
-atmel_sama5d2_xplained_mmc_defconfig: *defconfig
-atmel_sama5d2_xplained_mmc_dev_defconfig: *defconfig
-atmel_sama5d3_xplained_defconfig: *defconfig
-atmel_sama5d3_xplained_dev_defconfig: *defconfig
-atmel_sama5d3_xplained_mmc_defconfig: *defconfig
-atmel_sama5d3_xplained_mmc_dev_defconfig: *defconfig
-atmel_sama5d3xek_defconfig: *defconfig
-atmel_sama5d4_xplained_defconfig: *defconfig
-atmel_sama5d4_xplained_dev_defconfig: *defconfig
-atmel_sama5d4_xplained_mmc_defconfig: *defconfig
-atmel_sama5d4_xplained_mmc_dev_defconfig: *defconfig
-bananapi_m1_defconfig: *defconfig
-bananapi_m2_plus_defconfig: *defconfig
-bananapi_m2_ultra_defconfig: *defconfig
-bananapi_m64_defconfig: *defconfig
-bananapro_defconfig: *defconfig
-beagleboardx15_defconfig: *defconfig
-beaglebone_defconfig: *defconfig
-beaglebone_qt5_defconfig: *defconfig
-chromebook_snow_defconfig: *defconfig
-ci20_defconfig: *defconfig
-csky_gx6605s_defconfig: *defconfig
-cubieboard2_defconfig: *defconfig
-engicam_imx6qdl_icore_defconfig: *defconfig
-engicam_imx6qdl_icore_qt5_defconfig: *defconfig
-engicam_imx6qdl_icore_rqs_defconfig: *defconfig
-engicam_imx6ul_geam_defconfig: *defconfig
-engicam_imx6ul_isiot_defconfig: *defconfig
-freescale_imx28evk_defconfig: *defconfig
-freescale_imx6dlsabreauto_defconfig: *defconfig
-freescale_imx6dlsabresd_defconfig: *defconfig
-freescale_imx6qsabreauto_defconfig: *defconfig
-freescale_imx6qsabresd_defconfig: *defconfig
-freescale_imx6sxsabresd_defconfig: *defconfig
-freescale_imx7dsabresd_defconfig: *defconfig
-freescale_imx8mqevk_defconfig: *defconfig
-freescale_p1025twr_defconfig: *defconfig
-freescale_t1040d4rdb_defconfig: *defconfig
-friendlyarm_nanopi_a64_defconfig: *defconfig
-friendlyarm_nanopi_neo2_defconfig: *defconfig
-galileo_defconfig: *defconfig
-grinn_chiliboard_defconfig: *defconfig
-grinn_liteboard_defconfig: *defconfig
-imx23evk_defconfig: *defconfig
-imx6-sabreauto_defconfig: *defconfig
-imx6-sabresd_defconfig: *defconfig
-imx6-sabresd_qt5_defconfig: *defconfig
-imx6slevk_defconfig: *defconfig
-imx6sx-sdb_defconfig: *defconfig
-imx6ulevk_defconfig: *defconfig
-imx6ulpico_defconfig: *defconfig
-imx7d-sdb_defconfig: *defconfig
-imx7dpico_defconfig: *defconfig
-lego_ev3_defconfig: *defconfig
-linksprite_pcduino_defconfig: *defconfig
-minnowboard_max-graphical_defconfig: *defconfig
-minnowboard_max_defconfig: *defconfig
-mx25pdk_defconfig: *defconfig
-mx51evk_defconfig: *defconfig
-mx53loco_defconfig: *defconfig
-mx6cubox_defconfig: *defconfig
-mx6sx_udoo_neo_defconfig: *defconfig
-mx6udoo_defconfig: *defconfig
-nanopi_m1_defconfig: *defconfig
-nanopi_m1_plus_defconfig: *defconfig
-nanopi_neo_defconfig: *defconfig
-nexbox_a95x_defconfig: *defconfig
-nitrogen6sx_defconfig: *defconfig
-nitrogen6x_defconfig: *defconfig
-nitrogen7_defconfig: *defconfig
-nitrogen8m_defconfig: *defconfig
-odroidc2_defconfig: *defconfig
-odroidxu4_defconfig: *defconfig
-olimex_a10_olinuxino_lime_defconfig: *defconfig
-olimex_a13_olinuxino_defconfig: *defconfig
-olimex_a20_olinuxino_lime2_defconfig: *defconfig
-olimex_a20_olinuxino_lime_defconfig: *defconfig
-olimex_a20_olinuxino_lime_legacy_defconfig: *defconfig
-olimex_a20_olinuxino_micro_defconfig: *defconfig
-olimex_a64_olinuxino_defconfig: *defconfig
-olimex_imx233_olinuxino_defconfig: *defconfig
-openblocks_a6_defconfig: *defconfig
-orangepi_lite_defconfig: *defconfig
-orangepi_one_defconfig: *defconfig
-orangepi_pc2_defconfig: *defconfig
-orangepi_pc_defconfig: *defconfig
-orangepi_pc_plus_defconfig: *defconfig
-orangepi_plus_defconfig: *defconfig
-orangepi_prime_defconfig: *defconfig
-orangepi_win_defconfig: *defconfig
-orangepi_zero_defconfig: *defconfig
-orangepi_zero_plus2_defconfig: *defconfig
-pandaboard_defconfig: *defconfig
-pc_x86_64_bios_defconfig: *defconfig
-pc_x86_64_efi_defconfig: *defconfig
-pine64_defconfig: *defconfig
-pine64_sopine_defconfig: *defconfig
-qemu_aarch64_virt_defconfig: *defconfig
-qemu_arm_versatile_defconfig: *defconfig
-qemu_arm_versatile_nommu_defconfig: *defconfig
-qemu_arm_vexpress_defconfig: *defconfig
-qemu_m68k_mcf5208_defconfig: *defconfig
-qemu_m68k_q800_defconfig: *defconfig
-qemu_microblazebe_mmu_defconfig: *defconfig
-qemu_microblazeel_mmu_defconfig: *defconfig
-qemu_mips32r2_malta_defconfig: *defconfig
-qemu_mips32r2el_malta_defconfig: *defconfig
-qemu_mips32r6_malta_defconfig: *defconfig
-qemu_mips32r6el_malta_defconfig: *defconfig
-qemu_mips64_malta_defconfig: *defconfig
-qemu_mips64el_malta_defconfig: *defconfig
-qemu_mips64r6_malta_defconfig: *defconfig
-qemu_mips64r6el_malta_defconfig: *defconfig
-qemu_nios2_10m50_defconfig: *defconfig
-qemu_or1k_defconfig: *defconfig
-qemu_ppc64_e5500_defconfig: *defconfig
-qemu_ppc64_pseries_defconfig: *defconfig
-qemu_ppc64le_pseries_defconfig: *defconfig
-qemu_ppc_g3beige_defconfig: *defconfig
-qemu_ppc_mpc8544ds_defconfig: *defconfig
-qemu_ppc_virtex_ml507_defconfig: *defconfig
-qemu_riscv64_virt_defconfig: *defconfig
-qemu_sh4_r2d_defconfig: *defconfig
-qemu_sh4eb_r2d_defconfig: *defconfig
-qemu_sparc64_sun4u_defconfig: *defconfig
-qemu_sparc_ss10_defconfig: *defconfig
-qemu_x86_64_defconfig: *defconfig
-qemu_x86_defconfig: *defconfig
-qemu_xtensa_lx60_defconfig: *defconfig
-qemu_xtensa_lx60_nommu_defconfig: *defconfig
-raspberrypi0_defconfig: *defconfig
-raspberrypi0w_defconfig: *defconfig
-raspberrypi2_defconfig: *defconfig
-raspberrypi3_64_defconfig: *defconfig
-raspberrypi3_defconfig: *defconfig
-raspberrypi3_qt5we_defconfig: *defconfig
-raspberrypi_defconfig: *defconfig
-riotboard_defconfig: *defconfig
-roseapplepi_defconfig: *defconfig
-s6lx9_microboard_defconfig: *defconfig
-sheevaplug_defconfig: *defconfig
-snps_aarch64_vdk_defconfig: *defconfig
-snps_arc700_axs101_defconfig: *defconfig
-snps_archs38_axs103_defconfig: *defconfig
-snps_archs38_haps_defconfig: *defconfig
-snps_archs38_hsdk_defconfig: *defconfig
-snps_archs38_vdk_defconfig: *defconfig
-socrates_cyclone5_defconfig: *defconfig
-solidrun_clearfog_defconfig: *defconfig
-solidrun_macchiatobin_mainline_defconfig: *defconfig
-solidrun_macchiatobin_marvell_defconfig: *defconfig
-stm32f429_disco_defconfig: *defconfig
-stm32f469_disco_defconfig: *defconfig
-toradex_apalis_imx6_defconfig: *defconfig
-ts4800_defconfig: *defconfig
-ts4900_defconfig: *defconfig
-ts5500_defconfig: *defconfig
-ts7680_defconfig: *defconfig
-wandboard_defconfig: *defconfig
-warp7_defconfig: *defconfig
-warpboard_defconfig: *defconfig
-zynq_microzed_defconfig: *defconfig
-zynq_zc706_defconfig: *defconfig
-zynq_zed_defconfig: *defconfig
-zynq_zybo_defconfig: *defconfig
-zynqmp_zcu106_defconfig: *defconfig
-tests.boot.test_atf.TestATFAllwinner: *runtime_test
-tests.boot.test_atf.TestATFMarvell: *runtime_test
-tests.boot.test_atf.TestATFVexpress: *runtime_test
-tests.core.test_file_capabilities.TestFileCapabilities: *runtime_test
-tests.core.test_hardening.TestFortifyConserv: *runtime_test
-tests.core.test_hardening.TestFortifyNone: *runtime_test
-tests.core.test_hardening.TestRelro: *runtime_test
-tests.core.test_hardening.TestRelroPartial: *runtime_test
-tests.core.test_hardening.TestSspNone: *runtime_test
-tests.core.test_hardening.TestSspStrong: *runtime_test
-tests.core.test_post_scripts.TestPostScripts: *runtime_test
-tests.core.test_rootfs_overlay.TestRootfsOverlay: *runtime_test
-tests.core.test_timezone.TestGlibcAllTimezone: *runtime_test
-tests.core.test_timezone.TestGlibcNonDefaultLimitedTimezone: *runtime_test
-tests.core.test_timezone.TestNoTimezone: *runtime_test
-tests.fs.test_ext.TestExt2: *runtime_test
-tests.fs.test_ext.TestExt2r1: *runtime_test
-tests.fs.test_ext.TestExt3: *runtime_test
-tests.fs.test_ext.TestExt4: *runtime_test
-tests.fs.test_iso9660.TestIso9660Grub2External: *runtime_test
-tests.fs.test_iso9660.TestIso9660Grub2ExternalCompress: *runtime_test
-tests.fs.test_iso9660.TestIso9660Grub2Internal: *runtime_test
-tests.fs.test_iso9660.TestIso9660SyslinuxExternal: *runtime_test
-tests.fs.test_iso9660.TestIso9660SyslinuxExternalCompress: *runtime_test
-tests.fs.test_iso9660.TestIso9660SyslinuxInternal: *runtime_test
-tests.fs.test_jffs2.TestJffs2: *runtime_test
-tests.fs.test_squashfs.TestSquashfs: *runtime_test
-tests.fs.test_ubi.TestUbi: *runtime_test
-tests.fs.test_yaffs2.TestYaffs2: *runtime_test
-tests.init.test_busybox.TestInitSystemBusyboxRo: *runtime_test
-tests.init.test_busybox.TestInitSystemBusyboxRoNet: *runtime_test
-tests.init.test_busybox.TestInitSystemBusyboxRw: *runtime_test
-tests.init.test_busybox.TestInitSystemBusyboxRwNet: *runtime_test
-tests.init.test_none.TestInitSystemNone: *runtime_test
-tests.init.test_systemd.TestInitSystemSystemdRoFull: *runtime_test
-tests.init.test_systemd.TestInitSystemSystemdRoIfupdown: *runtime_test
-tests.init.test_systemd.TestInitSystemSystemdRoNetworkd: *runtime_test
-tests.init.test_systemd.TestInitSystemSystemdRwFull: *runtime_test
-tests.init.test_systemd.TestInitSystemSystemdRwIfupdown: *runtime_test
-tests.init.test_systemd.TestInitSystemSystemdRwNetworkd: *runtime_test
-tests.package.test_dropbear.TestDropbear: *runtime_test
-tests.package.test_ipython.TestIPythonPy2: *runtime_test
-tests.package.test_ipython.TestIPythonPy3: *runtime_test
-tests.package.test_python.TestPython2: *runtime_test
-tests.package.test_python.TestPython3: *runtime_test
-tests.package.test_python_autobahn.TestPythonPy2Autobahn: *runtime_test
-tests.package.test_python_autobahn.TestPythonPy3Autobahn: *runtime_test
-tests.package.test_python_cryptography.TestPythonPy2Cryptography: *runtime_test
-tests.package.test_python_cryptography.TestPythonPy3Cryptography: *runtime_test
-tests.package.test_python_incremental.TestPythonPy2Incremental: *runtime_test
-tests.package.test_python_incremental.TestPythonPy3Incremental: *runtime_test
-tests.package.test_python_twisted.TestPythonPy2Twisted: *runtime_test
-tests.package.test_python_twisted.TestPythonPy3Twisted: *runtime_test
-tests.package.test_python_txaio.TestPythonPy2Txaio: *runtime_test
-tests.package.test_python_txaio.TestPythonPy3Txaio: *runtime_test
-tests.package.test_python_txtorcon.TestPythonPy2Txtorcon: *runtime_test
-tests.package.test_python_txtorcon.TestPythonPy3Txtorcon: *runtime_test
-tests.package.test_rust.TestRust: *runtime_test
-tests.package.test_rust.TestRustBin: *runtime_test
-tests.package.test_syslog_ng.TestSyslogNg: *runtime_test
-tests.toolchain.test_external.TestExternalToolchainBuildrootMusl: *runtime_test
-tests.toolchain.test_external.TestExternalToolchainBuildrootuClibc: *runtime_test
-tests.toolchain.test_external.TestExternalToolchainCCache: *runtime_test
-tests.toolchain.test_external.TestExternalToolchainCtngMusl: *runtime_test
-tests.toolchain.test_external.TestExternalToolchainLinaroArm: *runtime_test
-tests.toolchain.test_external.TestExternalToolchainSourceryArmv4: *runtime_test
-tests.toolchain.test_external.TestExternalToolchainSourceryArmv5: *runtime_test
-tests.toolchain.test_external.TestExternalToolchainSourceryArmv7: *runtime_test
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-acmesystems_aria_g25_128mb_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-acmesystems_aria_g25_256mb_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-acmesystems_arietta_g25_128mb_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-acmesystems_arietta_g25_256mb_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-amarula_vyasa_rk3288_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-arcturus_ucls1012a_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-arcturus_ucp1020_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-arm_foundationv8_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-arm_juno_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-armadeus_apf27_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-armadeus_apf28_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-armadeus_apf51_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-asus_tinker_rk3288_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-at91sam9260eknf_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-at91sam9g20dfc_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-at91sam9g45m10ek_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-at91sam9rlek_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-at91sam9x5ek_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-at91sam9x5ek_dev_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-at91sam9x5ek_mmc_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-at91sam9x5ek_mmc_dev_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-atmel_sama5d27_som1_ek_mmc_dev_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-atmel_sama5d2_xplained_mmc_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-atmel_sama5d2_xplained_mmc_dev_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-atmel_sama5d3_xplained_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-atmel_sama5d3_xplained_dev_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-atmel_sama5d3_xplained_mmc_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-atmel_sama5d3_xplained_mmc_dev_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-atmel_sama5d3xek_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-atmel_sama5d4_xplained_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-atmel_sama5d4_xplained_dev_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-atmel_sama5d4_xplained_mmc_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-atmel_sama5d4_xplained_mmc_dev_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-bananapi_m1_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-bananapi_m2_plus_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-bananapi_m2_ultra_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-bananapi_m64_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-bananapro_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-beagleboardx15_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-beaglebone_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-beaglebone_qt5_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-chromebook_snow_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-ci20_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-csky_gx6605s_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-cubieboard2_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-engicam_imx6qdl_icore_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-engicam_imx6qdl_icore_qt5_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-engicam_imx6qdl_icore_rqs_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-engicam_imx6ul_geam_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-engicam_imx6ul_isiot_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-freescale_imx28evk_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-freescale_imx6dlsabreauto_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-freescale_imx6dlsabresd_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-freescale_imx6qsabreauto_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-freescale_imx6qsabresd_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-freescale_imx6sxsabresd_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-freescale_imx7dsabresd_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-freescale_imx8mqevk_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-freescale_p1025twr_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-freescale_t1040d4rdb_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-friendlyarm_nanopi_a64_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-friendlyarm_nanopi_neo2_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-galileo_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-grinn_chiliboard_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-grinn_liteboard_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-imx23evk_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-imx6-sabreauto_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-imx6-sabresd_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-imx6-sabresd_qt5_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-imx6slevk_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-imx6sx-sdb_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-imx6ulevk_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-imx6ulpico_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-imx7d-sdb_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-imx7dpico_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-lego_ev3_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-linksprite_pcduino_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-minnowboard_max-graphical_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-minnowboard_max_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-mx25pdk_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-mx51evk_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-mx53loco_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-mx6cubox_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-mx6sx_udoo_neo_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-mx6udoo_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-nanopi_m1_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-nanopi_m1_plus_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-nanopi_neo_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-nexbox_a95x_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-nitrogen6sx_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-nitrogen6x_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-nitrogen7_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-nitrogen8m_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-odroidc2_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-odroidxu4_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-olimex_a10_olinuxino_lime_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-olimex_a13_olinuxino_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-olimex_a20_olinuxino_lime2_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-olimex_a20_olinuxino_lime_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-olimex_a20_olinuxino_lime_legacy_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-olimex_a20_olinuxino_micro_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-olimex_a64_olinuxino_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-olimex_imx233_olinuxino_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-openblocks_a6_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-orangepi_lite_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-orangepi_one_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-orangepi_pc2_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-orangepi_pc_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-orangepi_pc_plus_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-orangepi_plus_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-orangepi_prime_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-orangepi_win_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-orangepi_zero_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-orangepi_zero_plus2_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-pandaboard_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-pc_x86_64_bios_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-pc_x86_64_efi_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-pine64_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-pine64_sopine_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_aarch64_virt_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_arm_versatile_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_arm_versatile_nommu_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_arm_vexpress_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_m68k_mcf5208_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_m68k_q800_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_microblazebe_mmu_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_microblazeel_mmu_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_mips32r2_malta_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_mips32r2el_malta_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_mips32r6_malta_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_mips32r6el_malta_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_mips64_malta_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_mips64el_malta_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_mips64r6_malta_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_mips64r6el_malta_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_nios2_10m50_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_or1k_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_ppc64_e5500_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_ppc64_pseries_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_ppc64le_pseries_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_ppc_g3beige_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_ppc_mpc8544ds_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_ppc_virtex_ml507_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_riscv64_virt_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_sh4_r2d_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_sh4eb_r2d_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_sparc64_sun4u_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_sparc_ss10_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_x86_64_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_x86_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_xtensa_lx60_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-qemu_xtensa_lx60_nommu_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-raspberrypi0_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-raspberrypi0w_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-raspberrypi2_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-raspberrypi3_64_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-raspberrypi3_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-raspberrypi3_qt5we_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-raspberrypi_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-riotboard_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-roseapplepi_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-s6lx9_microboard_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-sheevaplug_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-snps_aarch64_vdk_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-snps_arc700_axs101_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-snps_archs38_axs103_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-snps_archs38_haps_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-snps_archs38_hsdk_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-snps_archs38_vdk_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-socrates_cyclone5_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-solidrun_clearfog_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-solidrun_macchiatobin_mainline_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-solidrun_macchiatobin_marvell_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-stm32f429_disco_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-stm32f469_disco_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-toradex_apalis_imx6_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-ts4800_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-ts4900_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-ts5500_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-ts7680_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-wandboard_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-warp7_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-warpboard_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-zynq_microzed_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-zynq_zc706_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-zynq_zed_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-zynq_zybo_defconfig$/
+ <<: *defconfig
+ - triggers
+ - tags
+ - /-defconfigs$/
+ - /-zynqmp_zcu106_defconfig$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.boot\.test_atf\.TestATFAllwinner$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.boot\.test_atf\.TestATFMarvell$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.boot\.test_atf\.TestATFVexpress$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.core\.test_file_capabilities\.TestFileCapabilities$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.core\.test_hardening\.TestFortifyConserv$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.core\.test_hardening\.TestFortifyNone$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.core\.test_hardening\.TestRelro$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.core\.test_hardening\.TestRelroPartial$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.core\.test_hardening\.TestSspNone$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.core\.test_hardening\.TestSspStrong$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.core\.test_post_scripts\.TestPostScripts$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.core\.test_rootfs_overlay\.TestRootfsOverlay$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.core\.test_timezone\.TestGlibcAllTimezone$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.core\.test_timezone\.TestGlibcNonDefaultLimitedTimezone$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.core\.test_timezone\.TestNoTimezone$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.fs\.test_ext\.TestExt2$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.fs\.test_ext\.TestExt2r1$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.fs\.test_ext\.TestExt3$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.fs\.test_ext\.TestExt4$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.fs\.test_iso9660\.TestIso9660Grub2External$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.fs\.test_iso9660\.TestIso9660Grub2ExternalCompress$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.fs\.test_iso9660\.TestIso9660Grub2Internal$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.fs\.test_iso9660\.TestIso9660SyslinuxExternal$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.fs\.test_iso9660\.TestIso9660SyslinuxExternalCompress$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.fs\.test_iso9660\.TestIso9660SyslinuxInternal$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.fs\.test_jffs2\.TestJffs2$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.fs\.test_squashfs\.TestSquashfs$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.fs\.test_ubi\.TestUbi$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.fs\.test_yaffs2\.TestYaffs2$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.init\.test_busybox\.TestInitSystemBusyboxRo$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.init\.test_busybox\.TestInitSystemBusyboxRoNet$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.init\.test_busybox\.TestInitSystemBusyboxRw$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.init\.test_busybox\.TestInitSystemBusyboxRwNet$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.init\.test_none\.TestInitSystemNone$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.init\.test_systemd\.TestInitSystemSystemdRoFull$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.init\.test_systemd\.TestInitSystemSystemdRoIfupdown$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.init\.test_systemd\.TestInitSystemSystemdRoNetworkd$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.init\.test_systemd\.TestInitSystemSystemdRwFull$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.init\.test_systemd\.TestInitSystemSystemdRwIfupdown$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.init\.test_systemd\.TestInitSystemSystemdRwNetworkd$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_dropbear\.TestDropbear$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_ipython\.TestIPythonPy2$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_ipython\.TestIPythonPy3$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_python\.TestPython2$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_python\.TestPython3$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_python_autobahn\.TestPythonPy2Autobahn$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_python_autobahn\.TestPythonPy3Autobahn$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_python_cryptography\.TestPythonPy2Cryptography$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_python_cryptography\.TestPythonPy3Cryptography$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_python_incremental\.TestPythonPy2Incremental$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_python_incremental\.TestPythonPy3Incremental$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_python_twisted\.TestPythonPy2Twisted$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_python_twisted\.TestPythonPy3Twisted$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_python_txaio\.TestPythonPy2Txaio$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_python_txaio\.TestPythonPy3Txaio$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_python_txtorcon\.TestPythonPy2Txtorcon$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_python_txtorcon\.TestPythonPy3Txtorcon$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_rust\.TestRust$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_rust\.TestRustBin$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.package\.test_syslog_ng\.TestSyslogNg$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.toolchain\.test_external\.TestExternalToolchainBuildrootMusl$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.toolchain\.test_external\.TestExternalToolchainBuildrootuClibc$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.toolchain\.test_external\.TestExternalToolchainCCache$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.toolchain\.test_external\.TestExternalToolchainCtngMusl$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.toolchain\.test_external\.TestExternalToolchainLinaroArm$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.toolchain\.test_external\.TestExternalToolchainSourceryArmv4$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.toolchain\.test_external\.TestExternalToolchainSourceryArmv5$/
+ <<: *runtime_test
+ - triggers
+ - tags
+ - /-runtime-tests$/
+ - /-tests\.toolchain\.test_external\.TestExternalToolchainSourceryArmv7$/
diff --git a/support/scripts/generate-gitlab-ci-yml b/support/scripts/generate-gitlab-ci-yml
index d824f669b5..9efa775f88 100755
--- a/support/scripts/generate-gitlab-ci-yml
+++ b/support/scripts/generate-gitlab-ci-yml
@@ -7,14 +7,31 @@ output="${2}"
cp "${input}" "${output}"
+d_only_in=$(
+ awk '/^\.defconfig:/{x=1;next}/^[^ ]/{x=0}x' "${input}" \
+ | awk '/^ only/{x=1;next}/^ [^ ]/{x=0}x'
+)
+d_only=$( \
+ printf ":\n <<: *defconfig\n only:\n%s\n - /-" "$d_only_in"
+)
+
(
cd configs
LC_ALL=C ls -1 *_defconfig
) \
- | sed 's/$/: *defconfig/' \
+ | awk -v o="$d_only" '{i=$0; gsub(/\./,"\\.",i); print $0 o i "$/"}' \
Post by Ricardo Martincoski
"${output}"
+r_only_in=$(
+ awk '/^\.runtime_test:/{x=1;next}/^[^ ]/{x=0}x' "${input}" \
+ | awk '/^ only/{x=1;next}/^ [^ ]/{x=0}x'
+)
+r_only=$(
+ printf ":\n <<: *runtime_test\n only:\n%s\n - /-" "$r_only_in"
+)
+
./support/testing/run-tests -l 2>&1 \
- | sed -r -e '/^test_run \((.*)\).*/!d; s//\1: *runtime_test/' \
+ | sed -r -e '/^test_run \((.*)\).*/!d; s//\1/' \
| LC_ALL=C sort \
+ | awk -v o="$r_only" '{i=$0; gsub(/\./,"\\.",i); print $0 o i "$/"}' \
Post by Ricardo Martincoski
"${output}"
--
2.17.1
_______________________________________________
buildroot mailing list
http://lists.busybox.net/mailman/listinfo/buildroot
--
Matthew Weber | Pr. Software Engineer | Commercial Avionics

COLLINS AEROSPACE

400 Collins Road NE, Cedar Rapids, Iowa 52498, USA

Tel: +1 319 295 7349 | FAX: +1 319 263 6099

***@collins.com | collinsaerospace.com



CONFIDENTIALITY WARNING: This message may contain proprietary and/or
privileged information of Collins Aerospace and its affiliated
companies. If you are not the intended recipient, please 1) Do not
disclose, copy, distribute or use this message or its contents. 2)
Advise the sender by return email. 3) Delete all copies (including all
attachments) from your computer. Your cooperation is greatly
appreciated.
Thomas Petazzoni
2018-10-31 09:13:14 UTC
Permalink
Hello Ricardo,
Post by Ricardo Martincoski
This series allows the user of GitLab pipeline to trigger some interesting
- all defconfigs: /.*-defconfigs$/
- all runtime tests: /.*-runtime-tests$/
- one defconfig: /.*-defconfig_name$/
- one test case: /.*-test_case_name$/
The check-* jobs keep being triggered for all pushes: branches that match one of
the regexps above, branches that don't match them, and tags.
Pushing a tag still triggers all jobs.
The first patch adds the first two regexps.
The second patch prepares to add the per job trigger but don't change any
functionality.
The last patch actually adds the per defconfig and per runtime test triggers.
Thanks for working on this! Overall, it looks good to me. The only
thing that I find a bit disturbing is that the "generic" tests (i.e
check-package and al.) are always done, even if you specifically ask to
only run a specific defconfig build or a specific runtime test.
Post by Ricardo Martincoski
$ git push gitlab HEAD:test3-qemu_arm_versatile_defconfig
results in 5 jobs
https://gitlab.com/RicardoMartincoski/buildroot/pipelines/34614400
is a bit weird, because one would expect to have only a single job,
building qemu_arm_versatile_defconfig.

Not directly related to patch series, but related to gitlab CI testing,
I have a few questions where you could possibly help.

Currently:

- at every push, gitlab CI is doing the "generic" tests. This happens
for all branches, because it takes place for every push. This looks
good to me, the only change I'd like to make is to redirect the
e-mail notifications to the mailing list.

- every week, a cronjob does a trigger:

curl -X POST -F token=SOMETHING -F ref=master
https://gitlab.com/api/v4/projects/2648174/trigger/pipeline

First, this does not test all branches, which could trivially be
fixed by doing several triggers, one per branch with different
ref=<value>.

However, the output at
https://gitlab.com/buildroot.org/buildroot/pipelines is not very
nice, as everything is fixed together: we cannot distinguish easily the
pipelines that ran just the generic tests or the ones who ran the
runtime tests and defconfig tests. Ideally, it would be nice to have
separately the results for the runtime tests and defconfig tests.

So, with your feature, I'm wondering if instead of using this explicit
trigger mechanism, we shouldn't have a cronjob that pushes branches
with a name that will trigger what we want, i.e something like this
(pseudo-code):

# perhaps we could automatically grab this from
# http://autobuild.buildroot.net/branches
BRANCHES="2018.02.x 2018.08.x master"

timestamp=$(date +%s)
for branch in ${BRANCHES} ; do
git push gitlab ${branch}:${branch}-defconfigs-${timestamp}
git push gitlab ${branch}:${branch}-runtime-tests-${timestamp}
done

This would give us separate branch names for every test, which would
make the output in https://gitlab.com/buildroot.org/buildroot/pipelines
a lot more readable.

What do you think about this? Is this a good idea? Do you see other
solutions with what Gitlab CI provides?

Best regards,

Thomas
--
Thomas Petazzoni, CTO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
Ricardo Martincoski
2018-11-02 04:22:55 UTC
Permalink
Hello Thomas,
Post by Thomas Petazzoni
Post by Ricardo Martincoski
This series allows the user of GitLab pipeline to trigger some interesting
- all defconfigs: /.*-defconfigs$/
- all runtime tests: /.*-runtime-tests$/
- one defconfig: /.*-defconfig_name$/
- one test case: /.*-test_case_name$/
The check-* jobs keep being triggered for all pushes: branches that match one of
the regexps above, branches that don't match them, and tags.
Pushing a tag still triggers all jobs.
The first patch adds the first two regexps.
The second patch prepares to add the per job trigger but don't change any
functionality.
The last patch actually adds the per defconfig and per runtime test triggers.
Thanks for working on this! Overall, it looks good to me. The only
thing that I find a bit disturbing is that the "generic" tests (i.e
check-package and al.) are always done, even if you specifically ask to
only run a specific defconfig build or a specific runtime test.
Post by Ricardo Martincoski
$ git push gitlab HEAD:test3-qemu_arm_versatile_defconfig
results in 5 jobs
https://gitlab.com/RicardoMartincoski/buildroot/pipelines/34614400
is a bit weird, because one would expect to have only a single job,
building qemu_arm_versatile_defconfig.
Yes. It's a bit weird. I did like this to avoid messing with the generic tests
running on every push.

The correct solution to get ride of them IMO is to create yet another specific
regexp for the generic tests.
/-generic-tests(-[\d+])?$/
There are only 4 and they run fast, so I think there is no need for per job
trigger for them.
Notice that it implies in not running any jobs for ordinary pushes.

But maybe even the generic tests running on every push is too much.
Automatically running them once a day seems reasonable to me.

And whenever the gut feeling tells that a patch or patch series can break any of
them (or even when a runtime test or defconfig should be run to detect possible
regressions) we would still be allowed to manually trigger them by using the
special branch names, even before the patch is applied to the main repo.
And if the asked test fails with the patch, asking the same test for the current
master is also easy, so we can be sure the patch being tested is the culprit,
not any other commit that was applied to master after the last cronjob ran.
Post by Thomas Petazzoni
Not directly related to patch series, but related to gitlab CI testing,
I have a few questions where you could possibly help.
- at every push, gitlab CI is doing the "generic" tests. This happens
for all branches, because it takes place for every push. This looks
good to me, the only change I'd like to make is to redirect the
e-mail notifications to the mailing list.
So maybe it could also be a cronjob, running once a day.
Post by Thomas Petazzoni
curl -X POST -F token=SOMETHING -F ref=master
https://gitlab.com/api/v4/projects/2648174/trigger/pipeline
First, this does not test all branches, which could trivially be
fixed by doing several triggers, one per branch with different
ref=<value>.
However, the output at
https://gitlab.com/buildroot.org/buildroot/pipelines is not very
nice, as everything is fixed together: we cannot distinguish easily the
pipelines that ran just the generic tests or the ones who ran the
runtime tests and defconfig tests. Ideally, it would be nice to have
separately the results for the runtime tests and defconfig tests.
So, with your feature, I'm wondering if instead of using this explicit
trigger mechanism, we shouldn't have a cronjob that pushes branches
with a name that will trigger what we want, i.e something like this
# perhaps we could automatically grab this from
# http://autobuild.buildroot.net/branches
BRANCHES="2018.02.x 2018.08.x master"
timestamp=$(date +%s)
Maybe 'date +%Y%m%d' is more friendly for those like me that don't know which
day it is by just looking at a number of seconds since epoch :-)
But I don't care much.
Post by Thomas Petazzoni
for branch in ${BRANCHES} ; do
git push gitlab ${branch}:${branch}-defconfigs-${timestamp}
git push gitlab ${branch}:${branch}-runtime-tests-${timestamp}
done
So perhaps these are more suitable regexps:
/-defconfigs(-[\d+])?$/
/-runtime-tests(-[\d+])?$/
Post by Thomas Petazzoni
This would give us separate branch names for every test, which would
make the output in https://gitlab.com/buildroot.org/buildroot/pipelines
a lot more readable.
Indeed. The GUI has a small column for this and will display only
master-runt...
when the mouse pointer is not hovering the name, but it gives a good idea what
the pipeline did tested.
Post by Thomas Petazzoni
What do you think about this? Is this a good idea? Do you see other
solutions with what Gitlab CI provides?
I think it is a good idea.
I don't see any better solution using only Gitlab.

Using different branches for each pipeline that cronjob triggers have 2 small
downsides I can think of:
- we lose the 'latest' label from the 'Pipeline' column because all pipelines
will have it. I don't think it adds much info anyway.
- the list of stale branches will grow. That shouldn't bring problems, and we
can always remove branches from time to time (yearly?) if we like. Removing a
branch does not seem to remove the associated pipelines.

So, +1 to adopt this.


Regards,
Ricardo
Loading...