Message ID | 354f4577a7b6d3b1e5570a7c678e2d60bcf866e7.1624911306.git.yann.morin.1998@free.fr |
---|---|
State | Superseded |
Headers | show |
Series | gitlab-ci: allow running test-pkg (branch yem/test-pkg-in-gitlab-ci) | expand |
Hi Yann, all, some typo fixes. On Mon, Jun 28, 2021 at 10:16 PM Yann E. MORIN <yann.morin.1998@free.fr> wrote: > > From: Romain Naour <romain.naour@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@gmail.com> > Cc: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> > [yann.morin.1998@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@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@busybox.net > http://lists.busybox.net/mailman/listinfo/buildroot
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 "${@}"