xref: /OK3568_Linux_fs/buildroot/support/scripts/generate-gitlab-ci-yml (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/usr/bin/env bash
2*4882a593Smuzhiyunset -e
3*4882a593Smuzhiyunset -o pipefail
4*4882a593Smuzhiyun
5*4882a593Smuzhiyunmain() {
6*4882a593Smuzhiyun    local template="${1}"
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun    preamble "${template}"
9*4882a593Smuzhiyun    gen_tests
10*4882a593Smuzhiyun}
11*4882a593Smuzhiyun
12*4882a593Smuzhiyunpreamble() {
13*4882a593Smuzhiyun    local template="${1}"
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun    cat - "${template}" <<-_EOF_
16*4882a593Smuzhiyun	# This file is generated; do not edit!
17*4882a593Smuzhiyun	# Builds appear on https://gitlab.com/buildroot.org/buildroot/pipelines
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun	image: ${CI_JOB_IMAGE}
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun_EOF_
22*4882a593Smuzhiyun}
23*4882a593Smuzhiyun
24*4882a593Smuzhiyungen_tests() {
25*4882a593Smuzhiyun    local -a basics defconfigs runtimes
26*4882a593Smuzhiyun    local do_basics do_defconfigs do_runtime do_testpkg
27*4882a593Smuzhiyun    local defconfigs_ext cfg tst
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun    basics=( DEVELOPERS flake8 package )
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun    defconfigs=( $(cd configs; LC_ALL=C ls -1 *_defconfig) )
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun    runtimes=( $(./support/testing/run-tests -l 2>&1 \
34*4882a593Smuzhiyun                 | sed -r -e '/^test_run \((.*)\).*/!d; s//\1/' \
35*4882a593Smuzhiyun                 | LC_ALL=C sort)
36*4882a593Smuzhiyun             )
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun    if [ -n "${CI_COMMIT_TAG}" ]; then
39*4882a593Smuzhiyun        # When a tag is added to the Buildroot git tree, we want
40*4882a593Smuzhiyun        # to run the runtime tests and only test Qemu defconfigs.
41*4882a593Smuzhiyun        defconfigs=( $(cd configs; LC_ALL=C ls -1 qemu_*_defconfig) )
42*4882a593Smuzhiyun        do_basics=true
43*4882a593Smuzhiyun        do_defconfigs=base
44*4882a593Smuzhiyun        do_runtime=true
45*4882a593Smuzhiyun    elif [ "${CI_PIPELINE_SOURCE}" = "trigger" ]; then
46*4882a593Smuzhiyun        case "${BR_SCHEDULE_JOBS}" in
47*4882a593Smuzhiyun          (basic)
48*4882a593Smuzhiyun            do_basics=true
49*4882a593Smuzhiyun            do_defconfigs=check
50*4882a593Smuzhiyun            defconfigs_ext=_check
51*4882a593Smuzhiyun            ;;
52*4882a593Smuzhiyun          (defconfig)
53*4882a593Smuzhiyun            do_defconfigs=base
54*4882a593Smuzhiyun            ;;
55*4882a593Smuzhiyun          (runtime)
56*4882a593Smuzhiyun            do_runtime=true
57*4882a593Smuzhiyun            ;;
58*4882a593Smuzhiyun        esac
59*4882a593Smuzhiyun    else
60*4882a593Smuzhiyun        case "${CI_COMMIT_REF_NAME}" in
61*4882a593Smuzhiyun          (*-basics)
62*4882a593Smuzhiyun            do_basics=true
63*4882a593Smuzhiyun            do_defconfigs=check
64*4882a593Smuzhiyun            defconfigs_ext=_check
65*4882a593Smuzhiyun            ;;
66*4882a593Smuzhiyun          (*-defconfigs)
67*4882a593Smuzhiyun            do_defconfigs=base
68*4882a593Smuzhiyun            ;;
69*4882a593Smuzhiyun          (*-*_defconfig)
70*4882a593Smuzhiyun            defconfigs=( "${CI_COMMIT_REF_NAME##*-}" )
71*4882a593Smuzhiyun            do_defconfigs=base
72*4882a593Smuzhiyun            ;;
73*4882a593Smuzhiyun          (*-runtime-tests)
74*4882a593Smuzhiyun            do_runtime=true
75*4882a593Smuzhiyun            ;;
76*4882a593Smuzhiyun          (*-tests.*)
77*4882a593Smuzhiyun            runtimes=( $(./support/testing/run-tests -l 2>&1 \
78*4882a593Smuzhiyun                         | sed -r -e '/^test_run \((.*)\).*/!d; s//\1/' \
79*4882a593Smuzhiyun                         | LC_ALL=C sort \
80*4882a593Smuzhiyun                         | grep "^${CI_COMMIT_REF_NAME##*-}")
81*4882a593Smuzhiyun                     )
82*4882a593Smuzhiyun            do_runtime=true
83*4882a593Smuzhiyun            ;;
84*4882a593Smuzhiyun        esac
85*4882a593Smuzhiyun    fi
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun    # Retrieve defconfig for test-pkg from the git commit message (if any)
88*4882a593Smuzhiyun    if grep -q -E '^test-pkg config:$' <<<"${CI_COMMIT_DESCRIPTION}"; then
89*4882a593Smuzhiyun        sed -r -n -e '/^test-pkg config:$/{:a;n;p;ba;}' \
90*4882a593Smuzhiyun            <<<"${CI_COMMIT_DESCRIPTION}" \
91*4882a593Smuzhiyun            >defconfig.frag
92*4882a593Smuzhiyun        if [ ! -s defconfig.frag ]; then
93*4882a593Smuzhiyun            printf "Empty configuration fragment.\n" >&2; exit 1
94*4882a593Smuzhiyun        fi
95*4882a593Smuzhiyun        # Use --all since we expect the user having already pre-tested the
96*4882a593Smuzhiyun        # new package with the default subset of toolchains.
97*4882a593Smuzhiyun        ./utils/test-pkg \
98*4882a593Smuzhiyun            --all --prepare-only \
99*4882a593Smuzhiyun            --config-snippet defconfig.frag \
100*4882a593Smuzhiyun            --build-dir br-test-pkg >&2
101*4882a593Smuzhiyun        do_testpkg=( $(ls -1 br-test-pkg/*/.config 2>/dev/null |xargs -r dirname ) )
102*4882a593Smuzhiyun        if [ "${#do_testpkg[@]}" -eq 0 ]; then
103*4882a593Smuzhiyun            printf "Configuration fragment enables no test.\n" >&2; exit 1
104*4882a593Smuzhiyun        fi
105*4882a593Smuzhiyun    fi
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun    # If nothing else, at least do the basics to generate a valid pipeline
108*4882a593Smuzhiyun    if [    -z "${do_defconfigs}" \
109*4882a593Smuzhiyun         -a -z "${do_runtime}" \
110*4882a593Smuzhiyun         -a -z "${do_testpkg}" \
111*4882a593Smuzhiyun       ]
112*4882a593Smuzhiyun    then
113*4882a593Smuzhiyun        do_basics=true
114*4882a593Smuzhiyun    fi
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun    if ${do_basics:-false}; then
117*4882a593Smuzhiyun        for tst in "${basics[@]}"; do
118*4882a593Smuzhiyun            printf 'check-%s: { extends: .check-%s_base }\n' "${tst}" "${tst}"
119*4882a593Smuzhiyun        done
120*4882a593Smuzhiyun    fi
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun    if [ -n "${do_defconfigs}" ]; then
123*4882a593Smuzhiyun        for cfg in "${defconfigs[@]}"; do
124*4882a593Smuzhiyun            printf '%s%s: { extends: .defconfig_%s }\n' \
125*4882a593Smuzhiyun                   "${cfg}" "${defconfigs_ext}" "${do_defconfigs}"
126*4882a593Smuzhiyun        done
127*4882a593Smuzhiyun    fi
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun    if ${do_runtime:-false}; then
130*4882a593Smuzhiyun        printf '%s: { extends: .runtime_test_base }\n' "${runtimes[@]}"
131*4882a593Smuzhiyun    fi
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun    if [ -n "${do_testpkg}" ]; then
134*4882a593Smuzhiyun        printf '%s: { extends: .test_pkg }\n' "${do_testpkg[@]}"
135*4882a593Smuzhiyun    fi
136*4882a593Smuzhiyun}
137*4882a593Smuzhiyun
138*4882a593Smuzhiyunmain "${@}"
139