]> git.droids-corp.org - dpdk.git/commitdiff
ci: add Fedora 35 container in GHA
authorDavid Marchand <david.marchand@redhat.com>
Mon, 4 Apr 2022 14:24:39 +0000 (16:24 +0200)
committerDavid Marchand <david.marchand@redhat.com>
Wed, 6 Apr 2022 18:57:33 +0000 (20:57 +0200)
Build DPDK with Fedora 35 containers.

GHA container support does not allow caching images and docker hub
seems to limit image pulls.
On the other hand, the Fedora project hub does not seem to limit them,
so prefer this hub.
Nevertheless, let's try to be good citizens and cache (once a day) a
prepared image for subsequent builds.
This preparation is done in a first prepare-container-images job.
The rpm-container-builds job then depends on it with a 'needs:' tag.

Differences with builds in Ubuntu GHA vm images:
- tasks are run as root in containers, no need for sudo,
- compiler must be explicitly installed,
- GHA artifacts can't contain a ':' in their name, and must be filtered,
- environment variables are not inherited and must be passed explicitly,

Signed-off-by: David Marchand <david.marchand@redhat.com>
Acked-by: Aaron Conole <aconole@redhat.com>
.ci/linux-build.sh
.ci/linux-setup.sh
.github/workflows/build.yml

index 69940dec8b1bc7468b679b74a148b93c88fe723d..774a1441bf2b94aae6d2a4549c4282a7c8089f5e 100755 (executable)
@@ -1,5 +1,8 @@
 #!/bin/sh -xe
 
+# Builds are run as root in containers, no need for sudo
+[ "$(id -u)" != '0' ] || alias sudo=
+
 on_error() {
     if [ $? = 0 ]; then
         exit
index ca35b4b38d671017b41a7f73ad1ec7b23934c3a6..f5ef6b1b9832a38667c48506a6690c96a5bd5675 100755 (executable)
@@ -1,5 +1,8 @@
 #!/bin/sh -xe
 
+# Builds are run as root in containers, no need for sudo
+[ "$(id -u)" != '0' ] || alias sudo=
+
 # need to install as 'root' since some of the unit tests won't run without it
 sudo python3 -m pip install --upgrade 'meson==0.49.2'
 
index 02819aa5de266bd74e3bb6cd91f493db4cebd757..22daaabb91659e7a1aeaa4b261719230fc8913d2 100644 (file)
@@ -10,7 +10,7 @@ defaults:
     shell: bash --noprofile --norc -exo pipefail {0}
 
 jobs:
-  build:
+  ubuntu-vm-builds:
     name: ${{ join(matrix.config.*, '-') }}
     runs-on: ${{ matrix.config.os }}
     env:
@@ -145,7 +145,145 @@ jobs:
       with:
         name: meson-logs-${{ join(matrix.config.*, '-') }}
         path: |
+          build/.ninja_log
+          build/gdb.log
+          build/meson-logs/meson-log.txt
           build/meson-logs/testlog.txt
+
+  prepare-container-images:
+    name: ${{ join(matrix.config.*, '-') }}
+    runs-on: ubuntu-latest
+
+    strategy:
+      fail-fast: false
+      matrix:
+        config:
+          - image: fedora:35
+
+    steps:
+    - name: Generate various keys
+      id: get_keys
+      run: |
+        echo -n '::set-output name=image::'
+        echo 'image-${{ matrix.config.image }}-'$(date -u +%Y-%m-%d)
+    - name: Retrieve image cache
+      id: image_cache
+      uses: actions/cache@v2
+      with:
+        path: ~/.image
+        key: ${{ steps.get_keys.outputs.image }}
+    - name: Pull and prepare a fresh image
+      if: steps.image_cache.outputs.cache-hit != 'true'
+      run: |
+        docker pull registry.fedoraproject.org/${{ matrix.config.image }}
+        docker run -d -i --rm --name dpdk \
+          registry.fedoraproject.org/${{ matrix.config.image }} \
+          bash -li
+    - name: Update
+      if: steps.image_cache.outputs.cache-hit != 'true'
+      run: docker exec -i dpdk dnf update -y
+    - name: Install packages
+      if: steps.image_cache.outputs.cache-hit != 'true'
+      run: docker exec -i dpdk dnf install -y ccache numactl-devel
+        python3-setuptools python3-wheel python3-pip python3-pyelftools
+        ninja-build libatomic libbpf-devel libfdt-devel libpcap-devel
+        openssl-devel rdma-core-devel zlib-devel
+    - name: Save image in cache
+      if: steps.image_cache.outputs.cache-hit != 'true'
+      run: |
+        docker commit dpdk dpdk-local
+        mkdir -p ~/.image
+        docker save -o ~/.image/${{ matrix.config.image }}.tar dpdk-local
+    - name: Stop image
+      if: steps.image_cache.outputs.cache-hit != 'true'
+      run: docker kill dpdk
+
+  rpm-container-builds:
+    needs: prepare-container-images
+    name: ${{ join(matrix.config.*, '-') }}
+    runs-on: ubuntu-latest
+
+    strategy:
+      fail-fast: false
+      matrix:
+        config:
+          - image: fedora:35
+            compiler: gcc
+            library: static
+          - image: fedora:35
+            compiler: gcc
+            library: shared
+          - image: fedora:35
+            compiler: clang
+            library: static
+          - image: fedora:35
+            compiler: clang
+            library: shared
+
+    steps:
+    - name: Checkout sources
+      uses: actions/checkout@v2
+    - name: Generate various keys
+      id: get_keys
+      run: |
+        echo -n '::set-output name=ccache::'
+        echo 'ccache-${{ matrix.config.image }}-${{ matrix.config.compiler }}-'$(date -u +%Y-w%W)
+        echo -n '::set-output name=image::'
+        echo 'image-${{ matrix.config.image }}-'$(date -u +%Y-%m-%d)
+        echo -n '::set-output name=logs::'
+        echo 'meson-logs-${{ join(matrix.config.*, '-') }}' | tr -d ':'
+    - name: Retrieve image cache
+      id: image_cache
+      uses: actions/cache@v2
+      with:
+        path: ~/.image
+        key: ${{ steps.get_keys.outputs.image }}
+    - name: Fail if no image (not supposed to happen)
+      if: steps.image_cache.outputs.cache-hit != 'true'
+      run: |
+        echo 'Image ${{ matrix.config.image }} is not cached.'
+        false
+    - name: Retrieve ccache cache
+      uses: actions/cache@v2
+      with:
+        path: ~/.ccache
+        key: ${{ steps.get_keys.outputs.ccache }}-${{ github.ref }}
+        restore-keys: |
+          ${{ steps.get_keys.outputs.ccache }}-refs/heads/main
+    - name: Prepare working directory
+      run: |
+        mkdir -p ~/.ccache
+        > ~/env
+        echo CC=ccache ${{ matrix.config.compiler }} >> ~/env
+        echo DEF_LIB=${{ matrix.config.library }} >> ~/env
+    - name: Load the cached image
+      run: |
+        docker load -i ~/.image/${{ matrix.config.image }}.tar
+        docker run -d -i --rm --name dpdk \
+          --mount type=bind,src=$HOME/.ccache,dst=/root/.ccache \
+          --mount type=bind,src=$(pwd),dst=/root/dpdk \
+          --env-file ~/env \
+          -w /root/dpdk \
+          dpdk-local
+          bash -li
+    - name: Update
+      run: docker exec -i dpdk dnf update -y || true
+    - name: Install packages
+      run: docker exec -i dpdk dnf install -y ccache numactl-devel
+        python3-setuptools python3-wheel python3-pip python3-pyelftools
+        ninja-build libatomic libbpf-devel libfdt-devel libpcap-devel
+        openssl-devel rdma-core-devel zlib-devel ${{ matrix.config.compiler }}
+    - name: Run setup
+      run: docker exec -i dpdk .ci/linux-setup.sh
+    - name: Build
+      run: docker exec -i dpdk .ci/linux-build.sh
+    - name: Stop image
+      run: docker kill dpdk
+    - name: Upload logs on failure
+      if: failure()
+      uses: actions/upload-artifact@v2
+      with:
+        name: ${{ steps.get_keys.outputs.logs }}
+        path: |
           build/.ninja_log
           build/meson-logs/meson-log.txt
-          build/gdb.log