f148739550aed1d70fd7081bad328671d1e84c04
[platform/kernel/u-boot.git] / .gitlab-ci.yml
1 # SPDX-License-Identifier: GPL-2.0+
2
3 # Grab our configured image.  The source for this is found at:
4 # https://gitlab.denx.de/u-boot/gitlab-ci-runner
5 image: trini/u-boot-gitlab-ci-runner:bionic-20200311-10Apr2020
6
7 # We run some tests in different order, to catch some failures quicker.
8 stages:
9   - testsuites
10   - test.py
11   - world build
12
13 .buildman_and_testpy_template: &buildman_and_testpy_dfn
14   tags: [ 'all' ]
15   stage: test.py
16   before_script:
17     # Clone uboot-test-hooks
18     - git clone --depth=1 git://github.com/swarren/uboot-test-hooks.git /tmp/uboot-test-hooks
19     - ln -s travis-ci /tmp/uboot-test-hooks/bin/`hostname`
20     - ln -s travis-ci /tmp/uboot-test-hooks/py/`hostname`
21     - grub-mkimage --prefix="" -o ~/grub_x86.efi -O i386-efi normal  echo lsefimmap lsefi lsefisystab efinet tftp minicmd
22     - grub-mkimage --prefix="" -o ~/grub_x64.efi -O x86_64-efi normal  echo lsefimmap lsefi lsefisystab efinet tftp minicmd
23     - cp /opt/grub/grubriscv64.efi ~/grub_riscv64.efi
24     - cp /opt/grub/grubriscv32.efi ~/grub_riscv32.efi
25     - cp /opt/grub/grubaa64.efi ~/grub_arm64.efi
26     - cp /opt/grub/grubarm.efi ~/grub_arm.efi
27     - if [[ "${TEST_PY_BD}" == "qemu-riscv32_spl" ]]; then
28         wget -O - https://github.com/riscv/opensbi/releases/download/v0.6/opensbi-0.6-rv32-bin.tar.xz | tar -C /tmp -xJ;
29         export OPENSBI=/tmp/opensbi-0.6-rv32-bin/platform/qemu/virt/firmware/fw_dynamic.bin;
30       fi
31     - if [[ "${TEST_PY_BD}" == "qemu-riscv64_spl" ]]; then
32         wget -O - https://github.com/riscv/opensbi/releases/download/v0.6/opensbi-0.6-rv64-bin.tar.xz | tar -C /tmp -xJ;
33         export OPENSBI=/tmp/opensbi-0.6-rv64-bin/platform/qemu/virt/firmware/fw_dynamic.bin;
34       fi
35
36   after_script:
37     - rm -rf /tmp/uboot-test-hooks /tmp/venv
38   script:
39     # From buildman, exit code 129 means warnings only.  If we've been asked to
40     # use clang only do one configuration.
41     - if [[ "${TEST_PY_BD}" != "" ]]; then
42         ret=0;
43         tools/buildman/buildman -o /tmp -P -E --board ${TEST_PY_BD} ${OVERRIDE}
44           || ret=$?;
45         if [[ $ret -ne 0 && $ret -ne 129 ]]; then
46           tools/buildman/buildman -o /tmp -seP --board ${TEST_PY_BD};
47           exit $ret;
48         fi;
49       fi
50     # "not a_test_which_does_not_exist" is a dummy -k parameter which will
51     # never prevent any test from running. That way, we can always pass
52     # "-k something" even when $TEST_PY_TEST_SPEC doesnt need a custom
53     # value.
54     - virtualenv -p /usr/bin/python3 /tmp/venv
55     - . /tmp/venv/bin/activate
56     - pip install -r test/py/requirements.txt
57     - export UBOOT_TRAVIS_BUILD_DIR=/tmp/.bm-work/${TEST_PY_BD};
58       export PATH=/opt/qemu/bin:/tmp/uboot-test-hooks/bin:${PATH};
59       export PYTHONPATH=/tmp/uboot-test-hooks/py/travis-ci;
60       if [[ "${TEST_PY_BD}" != "" ]]; then
61         ./test/py/test.py --bd ${TEST_PY_BD} ${TEST_PY_ID}
62           -k "${TEST_PY_TEST_SPEC:-not a_test_which_does_not_exist}"
63           --build-dir "$UBOOT_TRAVIS_BUILD_DIR";
64         ret=$?;
65         if [[ $ret -ne 0 ]]; then
66           exit $ret;
67         fi;
68       fi;
69
70 build all 32bit ARM platforms:
71   tags: [ 'all' ]
72   stage: world build
73   script:
74     - ret=0;
75       ./tools/buildman/buildman -o /tmp -P -E arm -x aarch64 || ret=$?;
76       if [[ $ret -ne 0 && $ret -ne 129 ]]; then
77         ./tools/buildman/buildman -o /tmp -seP;
78         exit $ret;
79       fi;
80
81 build all 64bit ARM platforms:
82   tags: [ 'all' ]
83   stage: world build
84   script:
85     - virtualenv -p /usr/bin/python3 /tmp/venv
86     - . /tmp/venv/bin/activate
87     - pip install pyelftools
88     - ret=0;
89       ./tools/buildman/buildman -o /tmp -P -E aarch64 || ret=$?;
90       if [[ $ret -ne 0 && $ret -ne 129 ]]; then
91         ./tools/buildman/buildman -o /tmp -seP;
92         exit $ret;
93       fi;
94
95 build all PowerPC platforms:
96   tags: [ 'all' ]
97   stage: world build
98   script:
99     - ret=0;
100       ./tools/buildman/buildman -o /tmp -P -E powerpc || ret=$?;
101       if [[ $ret -ne 0 && $ret -ne 129 ]]; then
102         ./tools/buildman/buildman -o /tmp -seP;
103         exit $ret;
104       fi;
105
106 build all other platforms:
107   tags: [ 'all' ]
108   stage: world build
109   script:
110     - ret=0;
111       ./tools/buildman/buildman -o /tmp -P -E -x arm,powerpc || ret=$?;
112       if [[ $ret -ne 0 && $ret -ne 129 ]]; then
113         ./tools/buildman/buildman -o /tmp -seP;
114         exit $ret;
115       fi;
116
117 # QA jobs for code analytics
118 # static code analysis with cppcheck (we can add --enable=all later)
119 cppcheck:
120   tags: [ 'all' ]
121   stage: testsuites
122   script:
123     - cppcheck --force --quiet --inline-suppr .
124
125 # search for TODO within source tree
126 grep TODO/FIXME/HACK:
127   tags: [ 'all' ]
128   stage: testsuites
129   script:
130     - grep -r TODO .
131     - grep -r FIXME .
132     # search for HACK within source tree and ignore HACKKIT board
133     - grep -r HACK . | grep -v HACKKIT
134
135 # build HTML documentation
136 htmldocs:
137   tags: [ 'all' ]
138   stage: testsuites
139   script:
140     - make htmldocs
141
142 # some statistics about the code base
143 sloccount:
144   tags: [ 'all' ]
145   stage: testsuites
146   script:
147     - sloccount .
148
149 # ensure all configs have MAINTAINERS entries
150 Check for configs without MAINTAINERS entry:
151   tags: [ 'all' ]
152   stage: testsuites
153   script:
154     - if [ `./tools/genboardscfg.py -f 2>&1 | wc -l` -ne 0 ]; then exit 1; fi
155
156 # Ensure host tools build
157 Build tools-only:
158   tags: [ 'all' ]
159   stage: testsuites
160   script:
161     - make tools-only_config tools-only -j$(nproc)
162
163 # Ensure env tools build
164 Build envtools:
165   tags: [ 'all' ]
166   stage: testsuites
167   script:
168     - make tools-only_config envtools -j$(nproc)
169
170 Run binman, buildman, dtoc, Kconfig and patman testsuites:
171   tags: [ 'all' ]
172   stage: testsuites
173   script:
174     - git config --global user.name "GitLab CI Runner";
175       git config --global user.email trini@konsulko.com;
176       export USER=gitlab;
177       virtualenv -p /usr/bin/python3 /tmp/venv;
178       . /tmp/venv/bin/activate;
179       pip install pyelftools pytest;
180       export UBOOT_TRAVIS_BUILD_DIR=/tmp/sandbox_spl;
181       export PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt";
182       export PATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}";
183       ./tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w sandbox_spl;
184       ./tools/binman/binman --toolpath ${UBOOT_TRAVIS_BUILD_DIR}/tools test;
185       ./tools/buildman/buildman -t;
186       ./tools/dtoc/dtoc -t;
187       ./tools/patman/patman --test;
188       make testconfig
189
190 # Test sandbox with test.py
191 sandbox test.py:
192   tags: [ 'all' ]
193   variables:
194     TEST_PY_BD: "sandbox"
195   <<: *buildman_and_testpy_dfn
196
197 sandbox with clang test.py:
198   tags: [ 'all' ]
199   variables:
200     TEST_PY_BD: "sandbox"
201     OVERRIDE: "-O clang-7"
202   <<: *buildman_and_testpy_dfn
203
204 sandbox_spl test.py:
205   tags: [ 'all' ]
206   variables:
207     TEST_PY_BD: "sandbox_spl"
208     TEST_PY_TEST_SPEC: "test_ofplatdata"
209   <<: *buildman_and_testpy_dfn
210
211 evb-ast2500 test.py:
212   tags: [ 'all' ]
213   variables:
214     TEST_PY_BD: "evb-ast2500"
215     TEST_PY_ID: "--id qemu"
216   <<: *buildman_and_testpy_dfn
217
218 sandbox_flattree test.py:
219   tags: [ 'all' ]
220   variables:
221     TEST_PY_BD: "sandbox_flattree"
222   <<: *buildman_and_testpy_dfn
223
224 vexpress_ca15_tc2 test.py:
225   tags: [ 'all' ]
226   variables:
227     TEST_PY_BD: "vexpress_ca15_tc2"
228     TEST_PY_ID: "--id qemu"
229   <<: *buildman_and_testpy_dfn
230
231 vexpress_ca9x4 test.py:
232   tags: [ 'all' ]
233   variables:
234     TEST_PY_BD: "vexpress_ca9x4"
235     TEST_PY_ID: "--id qemu"
236   <<: *buildman_and_testpy_dfn
237
238 integratorcp_cm926ejs test.py:
239   tags: [ 'all' ]
240   variables:
241     TEST_PY_BD: "integratorcp_cm926ejs"
242     TEST_PY_TEST_SPEC: "not sleep"
243     TEST_PY_ID: "--id qemu"
244   <<: *buildman_and_testpy_dfn
245
246 qemu_arm test.py:
247   tags: [ 'all' ]
248   variables:
249     TEST_PY_BD: "qemu_arm"
250     TEST_PY_TEST_SPEC: "not sleep"
251   <<: *buildman_and_testpy_dfn
252
253 qemu_arm64 test.py:
254   tags: [ 'all' ]
255   variables:
256     TEST_PY_BD: "qemu_arm64"
257     TEST_PY_TEST_SPEC: "not sleep"
258   <<: *buildman_and_testpy_dfn
259
260 qemu_mips test.py:
261   tags: [ 'all' ]
262   variables:
263     TEST_PY_BD: "qemu_mips"
264     TEST_PY_TEST_SPEC: "not sleep"
265   <<: *buildman_and_testpy_dfn
266
267 qemu_mipsel test.py:
268   tags: [ 'all' ]
269   variables:
270     TEST_PY_BD: "qemu_mipsel"
271     TEST_PY_TEST_SPEC: "not sleep"
272   <<: *buildman_and_testpy_dfn
273
274 qemu_mips64 test.py:
275   tags: [ 'all' ]
276   variables:
277     TEST_PY_BD: "qemu_mips64"
278     TEST_PY_TEST_SPEC: "not sleep"
279   <<: *buildman_and_testpy_dfn
280
281 qemu_mips64el test.py:
282   tags: [ 'all' ]
283   variables:
284     TEST_PY_BD: "qemu_mips64el"
285     TEST_PY_TEST_SPEC: "not sleep"
286   <<: *buildman_and_testpy_dfn
287
288 qemu-ppce500 test.py:
289   tags: [ 'all' ]
290   variables:
291     TEST_PY_BD: "qemu-ppce500"
292     TEST_PY_TEST_SPEC: "not sleep"
293   <<: *buildman_and_testpy_dfn
294
295 qemu-riscv32 test.py:
296   tags: [ 'all' ]
297   variables:
298     TEST_PY_BD: "qemu-riscv32"
299     TEST_PY_TEST_SPEC: "not sleep"
300   <<: *buildman_and_testpy_dfn
301
302 qemu-riscv64 test.py:
303   tags: [ 'all' ]
304   variables:
305     TEST_PY_BD: "qemu-riscv64"
306     TEST_PY_TEST_SPEC: "not sleep"
307   <<: *buildman_and_testpy_dfn
308
309 qemu-riscv32_spl test.py:
310   tags: [ 'all' ]
311   variables:
312     TEST_PY_BD: "qemu-riscv32_spl"
313     TEST_PY_TEST_SPEC: "not sleep"
314   <<: *buildman_and_testpy_dfn
315
316 qemu-riscv64_spl test.py:
317   tags: [ 'all' ]
318   variables:
319     TEST_PY_BD: "qemu-riscv64_spl"
320     TEST_PY_TEST_SPEC: "not sleep"
321   <<: *buildman_and_testpy_dfn
322
323 qemu-x86 test.py:
324   tags: [ 'all' ]
325   variables:
326     TEST_PY_BD: "qemu-x86"
327     TEST_PY_TEST_SPEC: "not sleep"
328   <<: *buildman_and_testpy_dfn
329
330 qemu-x86_64 test.py:
331   tags: [ 'all' ]
332   variables:
333     TEST_PY_BD: "qemu-x86_64"
334     TEST_PY_TEST_SPEC: "not sleep"
335   <<: *buildman_and_testpy_dfn
336
337 xilinx_zynq_virt test.py:
338   tags: [ 'all' ]
339   variables:
340     TEST_PY_BD: "xilinx_zynq_virt"
341     TEST_PY_TEST_SPEC: "not sleep"
342     TEST_PY_ID: "--id qemu"
343   <<: *buildman_and_testpy_dfn
344
345 xilinx_versal_virt test.py:
346   tags: [ 'all' ]
347   variables:
348     TEST_PY_BD: "xilinx_versal_virt"
349     TEST_PY_TEST_SPEC: "not sleep"
350     TEST_PY_ID: "--id qemu"
351   <<: *buildman_and_testpy_dfn
352
353 xtfpga test.py:
354   tags: [ 'all' ]
355   variables:
356     TEST_PY_BD: "xtfpga"
357     TEST_PY_TEST_SPEC: "not sleep"
358     TEST_PY_ID: "--id qemu"
359   <<: *buildman_and_testpy_dfn