[Buildroot] [PATCH 4/4 v5] utils/test-pkg: add gitlab-ci support
Yegor Yefremov
yegorslists at googlemail.com
Tue Jul 13 11:29:10 UTC 2021
Hi Yann, all,
some typo fixes.
On Mon, Jun 28, 2021 at 10:16 PM Yann E. MORIN <yann.morin.1998 at free.fr> wrote:
>
> From: Romain Naour <romain.naour at gmail.com>
>
> The gitlab-ci support in test-pkg allows to parallelize the test-pkg
> work into several gitlab jobs. It's much faster than local serialized
> testing.
>
> To triger this, a developper will have to add, to the latest commit of
s/triger/trigger and s/developper/developer
> their branch, a token on its own line, followd by a configuration
s/followd/followed
> fragment, e.g.:
>
> test-pkg config:
> SOME_OPTION=y
> # OTHER_OPTION is not set
> SOME_VARIABLE="some value"
>
> This configuration fragment is used as input to test-pkg.
>
> To be able to generate one job per test to run, we need the list of
> tests in the parent pipeline, and the individual .config files (one per
remove a comma after "pipeline"
> test) in the child pipeline. We use the newly-introduce --prepare-only
s/newly-introduce/newly-introduced
> mode to test-pkg, and collect all the generated .config files as
> artefacts; those are inherited in the child pipeline via the
> "needs::pipeline" and "needs::job" directives. This is a bit tricky,
remove a comma after tricky
Best regards,
Yegor
> and is best described by the Gitlab-CI documentation [0].
>
> We also list those .config files to generate the actual list of jobs to
> run in the child pipeline.
>
> Notes:
> - if the user provides an empty fragment, this is considered an error:
> indeed, without a fragment (and the package name), there is no way
> to know what to test;
> - if that fragment yields an empty list of tests, then there is
> nothing to test either, so that is also considered an error.
>
> [0] https://docs.gitlab.com/ee/ci/yaml/README.html#artifact-downloads-to-child-pipelines
>
> Signed-off-by: Romain Naour <romain.naour at gmail.com>
> Cc: Arnout Vandecappelle (Essensium/Mind) <arnout at mind.be>
> [yann.morin.1998 at free.fr:
> - split the change to test-pkg to its own patch
> - generate the actual yml snippet in support/scripts/generate-gitlab-ci-yml,
> listing the .config files created by test-pkg
> - some code-style-candies...
> ]
> Signed-off-by: Yann E. MORIN <yann.morin.1998 at free.fr>
>
> ---
> v5: Split the change to test-pkg to its own patch
> List the .config files
> Also store the missing.config files as artefacts
>
> v4: reworked by Yann:
> tst-pkg only lists, does not generate the yml code
> The yml code is generated by support/scripts/generate-gitlab-ci-yml
> Empty fragment is an error
> Fragment that yierlds no test is also an error
>
> v3: Implement Arnout's review: http://lists.busybox.net/pipermail/buildroot/2021-May/310656.html
> Enable artifacts download from child-pipeline
>
> v2: Rework this patch following Arnout review
> use CI_COMMIT_DESCRIPTION
> remove .config from artifacts but keep images directory since
> it can be useful for further issue investigation
> use the "br-test-pkg" prefix for test-pkg jobs
> ---
> .gitlab-ci.yml | 5 +++++
> support/misc/gitlab-ci.yml.in | 22 +++++++++++++++++++++
> support/scripts/generate-gitlab-ci-yml | 27 +++++++++++++++++++++++++-
> 3 files changed, 53 insertions(+), 1 deletion(-)
>
> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
> index e85ac32033..bf9f2dca6c 100644
> --- a/.gitlab-ci.yml
> +++ b/.gitlab-ci.yml
> @@ -11,8 +11,11 @@ generate-gitlab-ci-yml:
> stage: generate-gitlab-ci
> script: ./support/scripts/generate-gitlab-ci-yml support/misc/gitlab-ci.yml.in > generated-gitlab-ci.yml
> artifacts:
> + when: always
> paths:
> - generated-gitlab-ci.yml
> + - br-test-pkg/*/.config
> + - br-test-pkg/*/missing.config
>
> buildroot-pipeline:
> stage: build
> @@ -21,3 +24,5 @@ buildroot-pipeline:
> - artifact: generated-gitlab-ci.yml
> job: generate-gitlab-ci-yml
> strategy: depend
> + variables:
> + PARENT_PIPELINE_ID: $CI_PIPELINE_ID
> diff --git a/support/misc/gitlab-ci.yml.in b/support/misc/gitlab-ci.yml.in
> index 1ee3772154..be7951b3d2 100644
> --- a/support/misc/gitlab-ci.yml.in
> +++ b/support/misc/gitlab-ci.yml.in
> @@ -80,3 +80,25 @@
> - test-output/*/.config
> - test-output/*/images/*
>
> +.test_pkg:
> + stage: build
> + before_script:
> + - OUTPUT_DIR=${CI_JOB_NAME}
> + script:
> + - echo "Configure Buildroot for ${OUTPUT_DIR}"
> + - make O=${OUTPUT_DIR} syncconfig
> + - make O=${OUTPUT_DIR} savedefconfig
> + - echo 'Build buildroot'
> + - *run_make
> + needs:
> + - pipeline: $PARENT_PIPELINE_ID
> + job: generate-gitlab-ci-yml
> + artifacts:
> + when: always
> + expire_in: 2 weeks
> + paths:
> + - build.log
> + - br-test-pkg/*/.config
> + - br-test-pkg/*/defconfig
> + - br-test-pkg/*/build/build-time.log
> + - br-test-pkg/*/build/packages-file-list*.txt
> diff --git a/support/scripts/generate-gitlab-ci-yml b/support/scripts/generate-gitlab-ci-yml
> index 3f498e08fd..063c5081da 100755
> --- a/support/scripts/generate-gitlab-ci-yml
> +++ b/support/scripts/generate-gitlab-ci-yml
> @@ -23,7 +23,7 @@ _EOF_
>
> gen_tests() {
> local -a basics defconfigs runtimes
> - local do_basics do_defconfigs do_runtime
> + local do_basics do_defconfigs do_runtime do_testpkg
> local defconfigs_ext cfg tst
>
> basics=( DEVELOPERS flake8 package )
> @@ -77,9 +77,30 @@ gen_tests() {
> esac
> fi
>
> + # Retrieve defconfig for test-pkg from the git commit message (if any)
> + if grep -q -E '^test-pkg config:$' <<<"${CI_COMMIT_DESCRIPTION}"; then
> + sed -r -n -e '/^test-pkg config:$/{:a;n;p;ba;}' \
> + <<<"${CI_COMMIT_DESCRIPTION}" \
> + >defconfig.frag
> + if [ ! -s defconfig.frag ]; then
> + printf "Empty configuration fragment.\n" >&2; exit 1
> + fi
> + # Use --all since we expect the user having already pre-tested the
> + # new package with the default subset of toolchains.
> + ./utils/test-pkg \
> + --all --prepare-only \
> + --config-snippet defconfig.frag \
> + --build-dir br-test-pkg >&2
> + do_testpkg=( $(ls -1 br-test-pkg/*/.config 2>/dev/null |xargs -r dirname ) )
> + if [ "${#do_testpkg[@]}" -eq 0 ]; then
> + printf "Configuration fragment enables no test.\n" >&2; exit 1
> + fi
> + fi
> +
> # If nothing else, at least do the basics to generate a valid pipeline
> if [ -z "${do_defconfigs}" \
> -a -z "${do_runtime}" \
> + -a -z "${do_testpkg}" \
> ]
> then
> do_basics=true
> @@ -101,6 +122,10 @@ gen_tests() {
> if ${do_runtime:-false}; then
> printf '%s: { extends: .runtime_test_base }\n' "${runtimes[@]}"
> fi
> +
> + if [ -n "${do_testpkg}" ]; then
> + printf '%s: { extends: .test_pkg }\n' "${do_testpkg[@]}"
> + fi
> }
>
> main "${@}"
> --
> 2.25.1
>
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
More information about the buildroot
mailing list