[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