mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-06 13:14:27 +00:00
ada61f1ee2
- Fix SiFive HiFive Unleashed board booting failure problem. - Enable SiFive fu540 PWM driver. - Support SiFive fu540: SPI boot. - Update OpenSBI used for RISC-V CI testing. - Revert "riscv: Allow use of reset drivers". - Revert "Revert "riscv: sifive: fu540: Add gpio-restart support"". - sysreset: syscon: - Don't assume default value for offset and mask property. - Support value property. - qemu: Add syscon reboot and poweroff support. - Fix SIFIVE debug serial dependency. - Fix linking error when building u-boot-spl with no SMP support. - AE350 use fdtdec_get_addr_size_auto_noparent to parse smc reg. - Make memory node available to SPL in hifive-unleashed-a00-u-boot.dtsi - SiFive fu540 avoid using hardcoded ram base and size.
463 lines
16 KiB
YAML
463 lines
16 KiB
YAML
variables:
|
||
windows_vm: vs2017-win2016
|
||
ubuntu_vm: ubuntu-18.04
|
||
macos_vm: macOS-10.15
|
||
ci_runner_image: trini/u-boot-gitlab-ci-runner:bionic-20200526-18Jun2020
|
||
# Add '-u 0' options for Azure pipelines, otherwise we get "permission
|
||
# denied" error when it tries to "useradd -m -u 1001 vsts_azpcontainer",
|
||
# since our $(ci_runner_image) user is not root.
|
||
container_option: -u 0
|
||
work_dir: /u
|
||
|
||
jobs:
|
||
- job: tools_only_windows
|
||
displayName: 'Ensure host tools build for Windows'
|
||
pool:
|
||
vmImage: $(windows_vm)
|
||
strategy:
|
||
matrix:
|
||
i686:
|
||
MSYS_DIR: msys32
|
||
BASE_REPO: msys2-ci-base-i686
|
||
x86_64:
|
||
MSYS_DIR: msys64
|
||
BASE_REPO: msys2-ci-base
|
||
steps:
|
||
- script: |
|
||
git clone https://github.com/msys2/$(BASE_REPO).git %CD:~0,2%\$(MSYS_DIR)
|
||
displayName: 'Install MSYS2'
|
||
- script: |
|
||
set PATH=%CD:~0,2%\$(MSYS_DIR)\usr\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem
|
||
%CD:~0,2%\$(MSYS_DIR)\usr\bin\pacman --noconfirm -Syyuu
|
||
displayName: 'Update MSYS2'
|
||
- script: |
|
||
set PATH=%CD:~0,2%\$(MSYS_DIR)\usr\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem
|
||
%CD:~0,2%\$(MSYS_DIR)\usr\bin\pacman --noconfirm --needed -S make gcc bison diffutils openssl-devel
|
||
displayName: 'Install Toolchain'
|
||
- script: |
|
||
set PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem
|
||
echo make tools-only_defconfig tools-only NO_SDL=1 > build-tools.sh
|
||
%CD:~0,2%\$(MSYS_DIR)\usr\bin\bash -lc "bash build-tools.sh"
|
||
displayName: 'Build Host Tools'
|
||
env:
|
||
# Tell MSYS2 we need a POSIX emulation layer
|
||
MSYSTEM: MSYS
|
||
# Tell MSYS2 not to ‘cd’ our startup directory to HOME
|
||
CHERE_INVOKING: yes
|
||
|
||
- job: tools_only_macOS
|
||
displayName: 'Ensure host tools build for macOS X'
|
||
pool:
|
||
vmImage: $(macos_vm)
|
||
steps:
|
||
- script: brew install make
|
||
displayName: Brew install dependencies
|
||
- script: |
|
||
gmake tools-only_config tools-only NO_SDL=1 \
|
||
HOSTCFLAGS="-I/usr/local/opt/openssl@1.1/include" \
|
||
HOSTLDFLAGS="-L/usr/local/opt/openssl@1.1/lib" \
|
||
-j$(sysctl -n hw.logicalcpu)
|
||
displayName: 'Perform tools-only build'
|
||
|
||
- job: cppcheck
|
||
displayName: 'Static code analysis with cppcheck'
|
||
pool:
|
||
vmImage: $(ubuntu_vm)
|
||
container:
|
||
image: $(ci_runner_image)
|
||
options: $(container_option)
|
||
steps:
|
||
- script: cppcheck -j$(nproc) --force --quiet --inline-suppr .
|
||
|
||
- job: htmldocs
|
||
displayName: 'Build HTML documentation'
|
||
pool:
|
||
vmImage: $(ubuntu_vm)
|
||
container:
|
||
image: $(ci_runner_image)
|
||
options: $(container_option)
|
||
steps:
|
||
- script: make htmldocs
|
||
|
||
- job: todo
|
||
displayName: 'Search for TODO within source tree'
|
||
pool:
|
||
vmImage: $(ubuntu_vm)
|
||
container:
|
||
image: $(ci_runner_image)
|
||
options: $(container_option)
|
||
steps:
|
||
- script: grep -r TODO .
|
||
- script: grep -r FIXME .
|
||
- script: grep -r HACK . | grep -v HACKKIT
|
||
|
||
- job: sloccount
|
||
displayName: 'Some statistics about the code base'
|
||
pool:
|
||
vmImage: $(ubuntu_vm)
|
||
container:
|
||
image: $(ci_runner_image)
|
||
options: $(container_option)
|
||
steps:
|
||
- script: sloccount .
|
||
|
||
- job: maintainers
|
||
displayName: 'Ensure all configs have MAINTAINERS entries'
|
||
pool:
|
||
vmImage: $(ubuntu_vm)
|
||
container:
|
||
image: $(ci_runner_image)
|
||
options: $(container_option)
|
||
steps:
|
||
- script: |
|
||
if [ `./tools/genboardscfg.py -f 2>&1 | wc -l` -ne 0 ]; then exit 1; fi
|
||
|
||
- job: tools_only
|
||
displayName: 'Ensure host tools build'
|
||
pool:
|
||
vmImage: $(ubuntu_vm)
|
||
container:
|
||
image: $(ci_runner_image)
|
||
options: $(container_option)
|
||
steps:
|
||
- script: |
|
||
make tools-only_config tools-only -j$(nproc)
|
||
|
||
- job: envtools
|
||
displayName: 'Ensure env tools build'
|
||
pool:
|
||
vmImage: $(ubuntu_vm)
|
||
container:
|
||
image: $(ci_runner_image)
|
||
options: $(container_option)
|
||
steps:
|
||
- script: |
|
||
make tools-only_config envtools -j$(nproc)
|
||
|
||
- job: utils
|
||
displayName: 'Run binman, buildman, dtoc, Kconfig and patman testsuites'
|
||
pool:
|
||
vmImage: $(ubuntu_vm)
|
||
steps:
|
||
- script: |
|
||
cat << EOF > build.sh
|
||
set -ex
|
||
cd ${WORK_DIR}
|
||
EOF
|
||
cat << "EOF" >> build.sh
|
||
git config --global user.name "Azure Pipelines"
|
||
git config --global user.email bmeng.cn@gmail.com
|
||
export USER=azure
|
||
virtualenv -p /usr/bin/python3 /tmp/venv
|
||
. /tmp/venv/bin/activate
|
||
pip install pyelftools pytest
|
||
export UBOOT_TRAVIS_BUILD_DIR=/tmp/sandbox_spl
|
||
export PYTHONPATH=${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt
|
||
export PATH=${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}
|
||
./tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w sandbox_spl
|
||
./tools/binman/binman --toolpath ${UBOOT_TRAVIS_BUILD_DIR}/tools test
|
||
./tools/buildman/buildman -t
|
||
./tools/dtoc/dtoc -t
|
||
./tools/patman/patman --test
|
||
make O=${UBOOT_TRAVIS_BUILD_DIR} testconfig
|
||
EOF
|
||
cat build.sh
|
||
# We cannot use "container" like other jobs above, as buildman
|
||
# seems to hang forever with pre-configured "container" environment
|
||
docker run -v $PWD:$(work_dir) $(ci_runner_image) /bin/bash $(work_dir)/build.sh
|
||
|
||
- job: nokia_rx51_test
|
||
displayName: 'Run tests for Nokia RX-51 (aka N900)'
|
||
pool:
|
||
vmImage: $(ubuntu_vm)
|
||
container:
|
||
image: $(ci_runner_image)
|
||
options: $(container_option)
|
||
steps:
|
||
- script: |
|
||
./tools/buildman/buildman --fetch-arch arm
|
||
export PATH=~/.buildman-toolchains/gcc-9.2.0-nolibc/arm-linux-gnueabi/bin/:$PATH
|
||
test/nokia_rx51_test.sh
|
||
|
||
- job: test_py
|
||
displayName: 'test.py'
|
||
pool:
|
||
vmImage: $(ubuntu_vm)
|
||
strategy:
|
||
matrix:
|
||
sandbox:
|
||
TEST_PY_BD: "sandbox"
|
||
sandbox_clang:
|
||
TEST_PY_BD: "sandbox"
|
||
OVERRIDE: "-O clang-10"
|
||
sandbox_spl:
|
||
TEST_PY_BD: "sandbox_spl"
|
||
TEST_PY_TEST_SPEC: "test_ofplatdata or test_handoff"
|
||
sandbox_flattree:
|
||
TEST_PY_BD: "sandbox_flattree"
|
||
evb_ast2500:
|
||
TEST_PY_BD: "evb-ast2500"
|
||
TEST_PY_ID: "--id qemu"
|
||
vexpress_ca15_tc2:
|
||
TEST_PY_BD: "vexpress_ca15_tc2"
|
||
TEST_PY_ID: "--id qemu"
|
||
vexpress_ca9x4:
|
||
TEST_PY_BD: "vexpress_ca9x4"
|
||
TEST_PY_ID: "--id qemu"
|
||
integratorcp_cm926ejs:
|
||
TEST_PY_BD: "integratorcp_cm926ejs"
|
||
TEST_PY_ID: "--id qemu"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
qemu_arm:
|
||
TEST_PY_BD: "qemu_arm"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
qemu_arm64:
|
||
TEST_PY_BD: "qemu_arm64"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
qemu_mips:
|
||
TEST_PY_BD: "qemu_mips"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
qemu_mipsel:
|
||
TEST_PY_BD: "qemu_mipsel"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
qemu_mips64:
|
||
TEST_PY_BD: "qemu_mips64"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
qemu_mips64el:
|
||
TEST_PY_BD: "qemu_mips64el"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
qemu_malta:
|
||
TEST_PY_BD: "malta"
|
||
TEST_PY_ID: "--id qemu"
|
||
TEST_PY_TEST_SPEC: "not sleep and not efi"
|
||
qemu_maltael:
|
||
TEST_PY_BD: "maltael"
|
||
TEST_PY_ID: "--id qemu"
|
||
TEST_PY_TEST_SPEC: "not sleep and not efi"
|
||
qemu_malta64:
|
||
TEST_PY_BD: "malta64"
|
||
TEST_PY_ID: "--id qemu"
|
||
TEST_PY_TEST_SPEC: "not sleep and not efi"
|
||
qemu_malta64el:
|
||
TEST_PY_BD: "malta64el"
|
||
TEST_PY_ID: "--id qemu"
|
||
TEST_PY_TEST_SPEC: "not sleep and not efi"
|
||
qemu_ppce500:
|
||
TEST_PY_BD: "qemu-ppce500"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
qemu_riscv32:
|
||
TEST_PY_BD: "qemu-riscv32"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
qemu_riscv64:
|
||
TEST_PY_BD: "qemu-riscv64"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
qemu_riscv32_spl:
|
||
TEST_PY_BD: "qemu-riscv32_spl"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
qemu_riscv64_spl:
|
||
TEST_PY_BD: "qemu-riscv64_spl"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
qemu_x86:
|
||
TEST_PY_BD: "qemu-x86"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
qemu_x86_64:
|
||
TEST_PY_BD: "qemu-x86_64"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
xilinx_zynq_virt:
|
||
TEST_PY_BD: "xilinx_zynq_virt"
|
||
TEST_PY_ID: "--id qemu"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
xilinx_versal_virt:
|
||
TEST_PY_BD: "xilinx_versal_virt"
|
||
TEST_PY_ID: "--id qemu"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
xtfpga:
|
||
TEST_PY_BD: "xtfpga"
|
||
TEST_PY_ID: "--id qemu"
|
||
TEST_PY_TEST_SPEC: "not sleep"
|
||
steps:
|
||
- script: |
|
||
cat << EOF > test.sh
|
||
set -ex
|
||
# make environment variables available as tests are running inside a container
|
||
export WORK_DIR="${WORK_DIR}"
|
||
export TEST_PY_BD="${TEST_PY_BD}"
|
||
export TEST_PY_ID="${TEST_PY_ID}"
|
||
export TEST_PY_TEST_SPEC="${TEST_PY_TEST_SPEC}"
|
||
export OVERRIDE="${OVERRIDE}"
|
||
EOF
|
||
cat << "EOF" >> test.sh
|
||
# the below corresponds to .gitlab-ci.yml "before_script"
|
||
cd ${WORK_DIR}
|
||
git clone --depth=1 git://github.com/swarren/uboot-test-hooks.git /tmp/uboot-test-hooks
|
||
ln -s travis-ci /tmp/uboot-test-hooks/bin/`hostname`
|
||
ln -s travis-ci /tmp/uboot-test-hooks/py/`hostname`
|
||
grub-mkimage --prefix=\"\" -o ~/grub_x86.efi -O i386-efi normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd
|
||
grub-mkimage --prefix=\"\" -o ~/grub_x64.efi -O x86_64-efi normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd
|
||
if [[ "${TEST_PY_BD}" == "qemu-riscv32_spl" ]]; then
|
||
wget -O - https://github.com/riscv/opensbi/releases/download/v0.8/opensbi-0.8-rv-bin.tar.xz | tar -C /tmp -xJ;
|
||
export OPENSBI=/tmp/opensbi-0.8-rv-bin/share/opensbi/ilp32/generic/firmware/fw_dynamic.bin;
|
||
fi
|
||
if [[ "${TEST_PY_BD}" == "qemu-riscv64_spl" ]]; then
|
||
wget -O - https://github.com/riscv/opensbi/releases/download/v0.8/opensbi-0.8-rv-bin.tar.xz | tar -C /tmp -xJ;
|
||
export OPENSBI=/tmp/opensbi-0.8-rv-bin/share/opensbi/lp64/generic/firmware/fw_dynamic.bin;
|
||
fi
|
||
# the below corresponds to .gitlab-ci.yml "script"
|
||
cd ${WORK_DIR}
|
||
export UBOOT_TRAVIS_BUILD_DIR=/tmp/${TEST_PY_BD};
|
||
tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w -E -W -e --board ${TEST_PY_BD} ${OVERRIDE}
|
||
cp ~/grub_x86.efi ${UBOOT_TRAVIS_BUILD_DIR}/
|
||
cp ~/grub_x64.efi ${UBOOT_TRAVIS_BUILD_DIR}/
|
||
cp /opt/grub/grubriscv64.efi ${UBOOT_TRAVIS_BUILD_DIR}/grub_riscv64.efi
|
||
cp /opt/grub/grubriscv32.efi ${UBOOT_TRAVIS_BUILD_DIR}/grub_riscv32.efi
|
||
cp /opt/grub/grubaa64.efi ${UBOOT_TRAVIS_BUILD_DIR}/grub_arm64.efi
|
||
cp /opt/grub/grubarm.efi ${UBOOT_TRAVIS_BUILD_DIR}/grub_arm.efi
|
||
virtualenv -p /usr/bin/python3 /tmp/venv
|
||
. /tmp/venv/bin/activate
|
||
pip install -r test/py/requirements.txt
|
||
export PATH=/opt/qemu/bin:/tmp/uboot-test-hooks/bin:${PATH};
|
||
export PYTHONPATH=/tmp/uboot-test-hooks/py/travis-ci;
|
||
# "${var:+"-k $var"}" expands to "" if $var is empty, "-k $var" if not
|
||
./test/py/test.py -ra --bd ${TEST_PY_BD} ${TEST_PY_ID} ${TEST_PY_TEST_SPEC:+"-k ${TEST_PY_TEST_SPEC}"} --build-dir "$UBOOT_TRAVIS_BUILD_DIR";
|
||
# the below corresponds to .gitlab-ci.yml "after_script"
|
||
rm -rf /tmp/uboot-test-hooks /tmp/venv
|
||
EOF
|
||
cat test.sh
|
||
# make current directory writeable to uboot user inside the container
|
||
# as sandbox testing need create files like spi flash images, etc.
|
||
# (TODO: clean up this in the future)
|
||
chmod 777 .
|
||
docker run -v $PWD:$(work_dir) $(ci_runner_image) /bin/bash $(work_dir)/test.sh
|
||
|
||
- job: build_the_world
|
||
displayName: 'Build the World'
|
||
pool:
|
||
vmImage: $(ubuntu_vm)
|
||
strategy:
|
||
# Use almost the same target division in .travis.yml, only merged
|
||
# 4 small build jobs (arc/microblaze/nds32/xtensa) into one.
|
||
matrix:
|
||
arc_microblaze_nds32_xtensa:
|
||
BUILDMAN: "arc microblaze nds32 xtensa"
|
||
arm11_arm7_arm920t_arm946es:
|
||
BUILDMAN: "arm11 arm7 arm920t arm946es"
|
||
arm926ejs:
|
||
BUILDMAN: "arm926ejs -x freescale,siemens,at91,kirkwood,spear,omap"
|
||
at91_non_armv7:
|
||
BUILDMAN: "at91 -x armv7"
|
||
at91_non_arm926ejs:
|
||
BUILDMAN: "at91 -x arm926ejs"
|
||
boundary_engicam_toradex:
|
||
BUILDMAN: "boundary engicam toradex"
|
||
arm_bcm:
|
||
BUILDMAN: "bcm -x mips"
|
||
nxp_arm32:
|
||
BUILDMAN: "freescale -x powerpc,m68k,aarch64,ls101,ls102,ls104,ls108,ls20,lx216"
|
||
nxp_ls101x:
|
||
BUILDMAN: "freescale&ls101"
|
||
nxp_ls102x:
|
||
BUILDMAN: "freescale&ls102"
|
||
nxp_ls104x:
|
||
BUILDMAN: "freescale&ls104"
|
||
nxp_ls108x:
|
||
BUILDMAN: "freescale&ls108"
|
||
nxp_ls20xx:
|
||
BUILDMAN: "freescale&ls20"
|
||
nxp_lx216x:
|
||
BUILDMAN: "freescale&lx216"
|
||
imx6:
|
||
BUILDMAN: "mx6 -x boundary,engicam,freescale,technexion,toradex"
|
||
imx:
|
||
BUILDMAN: "mx -x mx6,freescale,technexion,toradex"
|
||
keystone2_keystone3:
|
||
BUILDMAN: "k2 k3"
|
||
samsung_socfpga:
|
||
BUILDMAN: "samsung socfpga"
|
||
spear:
|
||
BUILDMAN: "spear"
|
||
sun4i:
|
||
BUILDMAN: "sun4i"
|
||
sun5i:
|
||
BUILDMAN: "sun5i"
|
||
sun6i:
|
||
BUILDMAN: "sun6i"
|
||
sun7i:
|
||
BUILDMAN: "sun7i"
|
||
sun8i_32bit:
|
||
BUILDMAN: "sun8i&armv7"
|
||
sun8i_64bit:
|
||
BUILDMAN: "sun8i&aarch64"
|
||
sun9i:
|
||
BUILDMAN: "sun9i"
|
||
sun50i:
|
||
BUILDMAN: "sun50i"
|
||
arm_catch_all:
|
||
BUILDMAN: "arm -x arm11,arm7,arm9,aarch64,at91,bcm,freescale,kirkwood,mvebu,siemens,tegra,uniphier,mx,samsung,sunxi,am33xx,omap,rk,toradex,socfpga,k2,k3,zynq"
|
||
sandbox_x86:
|
||
BUILDMAN: "sandbox x86"
|
||
technexion:
|
||
BUILDMAN: "technexion"
|
||
kirkwood:
|
||
BUILDMAN: "kirkwood"
|
||
mvebu:
|
||
BUILDMAN: "mvebu"
|
||
m68k:
|
||
BUILDMAN: "m68k"
|
||
mips:
|
||
BUILDMAN: "mips"
|
||
non_fsl_ppc:
|
||
BUILDMAN: "powerpc -x freescale"
|
||
mpc85xx_freescale:
|
||
BUILDMAN: "mpc85xx&freescale -x t208xrdb -x t4qds -x t102* -x p1_p2_rdb_pc -x p1010rdb -x corenet_ds -x b4860qds -x bsc91*"
|
||
t208xrdb_corenet_ds:
|
||
BUILDMAN: "t208xrdb corenet_ds"
|
||
fsl_ppc:
|
||
BUILDMAN: "t4qds b4860qds mpc83xx&freescale mpc86xx&freescale"
|
||
t102x:
|
||
BUILDMAN: "t102*"
|
||
p1_p2_rdb_pc:
|
||
BUILDMAN: "p1_p2_rdb_pc"
|
||
p1010rdb_bsc91:
|
||
BUILDMAN: "p1010rdb bsc91"
|
||
siemens:
|
||
BUILDMAN: "siemens"
|
||
tegra:
|
||
BUILDMAN: "tegra -x toradex"
|
||
am33xx_no_siemens:
|
||
BUILDMAN: "am33xx -x siemens"
|
||
omap:
|
||
BUILDMAN: "omap"
|
||
uniphier:
|
||
BUILDMAN: "uniphier"
|
||
aarch64_catch_all:
|
||
BUILDMAN: "aarch64 -x bcm,k3,tegra,ls1,ls2,lx216,mvebu,uniphier,sunxi,samsung,socfpga,rk,versal,zynq"
|
||
rockchip:
|
||
BUILDMAN: "rk"
|
||
sh:
|
||
BUILDMAN: "sh -x arm"
|
||
zynq:
|
||
BUILDMAN: "zynq&armv7"
|
||
zynqmp_versal:
|
||
BUILDMAN: "versal|zynqmp&aarch64"
|
||
riscv:
|
||
BUILDMAN: "riscv"
|
||
steps:
|
||
- script: |
|
||
cat << EOF > build.sh
|
||
set -ex
|
||
cd ${WORK_DIR}
|
||
# make environment variables available as tests are running inside a container
|
||
export BUILDMAN="${BUILDMAN}"
|
||
EOF
|
||
cat << "EOF" >> build.sh
|
||
if [[ "${BUILDMAN}" != "" ]]; then
|
||
ret=0;
|
||
tools/buildman/buildman -o /tmp -P -W ${BUILDMAN} ${OVERRIDE} || ret=$?;
|
||
if [[ $ret -ne 0 ]]; then
|
||
tools/buildman/buildman -o /tmp -seP ${BUILDMAN};
|
||
exit $ret;
|
||
fi;
|
||
fi
|
||
EOF
|
||
cat build.sh
|
||
docker run -v $PWD:$(work_dir) $(ci_runner_image) /bin/bash $(work_dir)/build.sh
|