Unverified Commit c6fc0fc1 authored by Bin Meng's avatar Bin Meng Committed by Palmer Dabbelt
Browse files

gitlab-ci.yml: Add jobs to build OpenSBI firmware binaries

Add two GitLab jobs to build the OpenSBI firmware binaries.

The first job builds a Docker image with the packages requisite
to build OpenSBI, and stores this image in the GitLab registry.
The second job pulls the image from the registry and builds the
OpenSBI firmware binaries.

The docker image is only rebuilt if the GitLab YAML or the
Dockerfile is updated. The second job is only built when the
roms/opensbi/ submodule is updated, when a git-ref starts with
'opensbi' or when the last commit contains 'OpenSBI'. The files
generated are archived in the artifacts.zip file.

With OpenSBI v0.6, it took 2 minutes 56 seconds to build
the docker image, and 1 minute 24 seconds to generate the
artifacts.zip with the firmware binaries (filesize: 111KiB).

See: https://gitlab.com/lbmeng/qemu/pipelines/120520138



Suggested-by: default avatarPhilippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: default avatarBin Meng <bmeng.cn@gmail.com>
Signed-off-by: default avatarPalmer Dabbelt <palmerdabbelt@google.com>
parent b78c3296
Loading
Loading
Loading
Loading

.gitlab-ci-opensbi.yml

0 → 100644
+63 −0
Original line number Diff line number Diff line
docker-opensbi:
 stage: build
 rules: # Only run this job when the Dockerfile is modified
 - changes:
   - .gitlab-ci-opensbi.yml
   - .gitlab-ci.d/opensbi/Dockerfile
   when: always
 image: docker:19.03.1
 services:
 - docker:19.03.1-dind
 variables:
  GIT_DEPTH: 3
  IMAGE_TAG: $CI_REGISTRY_IMAGE:opensbi-cross-build
  # We don't use TLS
  DOCKER_HOST: tcp://docker:2375
  DOCKER_TLS_CERTDIR: ""
 before_script:
 - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
 script:
 - docker pull $IMAGE_TAG || true
 - docker build --cache-from $IMAGE_TAG --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
                                        --tag $IMAGE_TAG .gitlab-ci.d/opensbi
 - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
 - docker push $IMAGE_TAG

build-opensbi:
 rules: # Only run this job when ...
 - changes: # ... roms/opensbi/ is modified (submodule updated)
   - roms/opensbi/*
   when: always
 - if: '$CI_COMMIT_REF_NAME =~ /^opensbi/' # or the branch/tag starts with 'opensbi'
   when: always
 - if: '$CI_COMMIT_MESSAGE =~ /opensbi/i' # or last commit description contains 'OpenSBI'
   when: always
 artifacts:
   paths: # 'artifacts.zip' will contains the following files:
   - pc-bios/opensbi-riscv32-sifive_u-fw_jump.bin
   - pc-bios/opensbi-riscv32-virt-fw_jump.bin
   - pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin
   - pc-bios/opensbi-riscv64-virt-fw_jump.bin
   - opensbi32-virt-stdout.log
   - opensbi32-virt-stderr.log
   - opensbi64-virt-stdout.log
   - opensbi64-virt-stderr.log
   - opensbi32-sifive_u-stdout.log
   - opensbi32-sifive_u-stderr.log
   - opensbi64-sifive_u-stdout.log
   - opensbi64-sifive_u-stderr.log
 image: $CI_REGISTRY_IMAGE:opensbi-cross-build
 variables:
   GIT_DEPTH: 3
 script: # Clone the required submodules and build OpenSBI
 - git submodule update --init roms/opensbi
 - export JOBS=$(($(getconf _NPROCESSORS_ONLN) + 1))
 - echo "=== Using ${JOBS} simultaneous jobs ==="
 - make -j${JOBS} -C roms/opensbi clean
 - make -j${JOBS} -C roms opensbi32-virt 2>&1 1>opensbi32-virt-stdout.log | tee -a opensbi32-virt-stderr.log >&2
 - make -j${JOBS} -C roms/opensbi clean
 - make -j${JOBS} -C roms opensbi64-virt 2>&1 1>opensbi64-virt-stdout.log | tee -a opensbi64-virt-stderr.log >&2
 - make -j${JOBS} -C roms/opensbi clean
 - make -j${JOBS} -C roms opensbi32-sifive_u 2>&1 1>opensbi32-sifive_u-stdout.log | tee -a opensbi32-sifive_u-stderr.log >&2
 - make -j${JOBS} -C roms/opensbi clean
 - make -j${JOBS} -C roms opensbi64-sifive_u 2>&1 1>opensbi64-sifive_u-stdout.log | tee -a opensbi64-sifive_u-stderr.log >&2
+33 −0
Original line number Diff line number Diff line
#
# Docker image to cross-compile OpenSBI firmware binaries
#
FROM ubuntu:18.04

MAINTAINER Bin Meng <bmeng.cn@gmail.com>

# Install packages required to build OpenSBI
RUN apt update \
    && \
    \
    DEBIAN_FRONTEND=noninteractive \
    apt install --assume-yes --no-install-recommends \
        build-essential \
        ca-certificates \
        git \
        make \
        wget \
    && \
    \
    rm -rf /var/lib/apt/lists/*

# Manually install the kernel.org "Crosstool" based toolchains for gcc-8.3
RUN wget -O - \
    https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/x86_64/8.3.0/x86_64-gcc-8.3.0-nolibc-riscv32-linux.tar.xz \
    | tar -C /opt -xJ
RUN wget -O - \
    https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/x86_64/8.3.0/x86_64-gcc-8.3.0-nolibc-riscv64-linux.tar.xz \
    | tar -C /opt -xJ

# Export the toolchains to the system path
ENV PATH="/opt/gcc-8.3.0-nolibc/riscv32-linux/bin:${PATH}"
ENV PATH="/opt/gcc-8.3.0-nolibc/riscv64-linux/bin:${PATH}"
+1 −0
Original line number Diff line number Diff line
include:
  - local: '/.gitlab-ci-edk2.yml'
  - local: '/.gitlab-ci-opensbi.yml'

before_script:
 - apt-get update -qq