Skip to content

tc multiarch

tc multiarch #238

Workflow file for this run

name: ci
on:
workflow_dispatch:
push:
pull_request:
schedule:
- cron: '0 0 * * *' # every day at midnight
#Global vars
env:
ARCHS: linux/amd64,linux/386 #,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x
BUILD_DOCKER_FILE_UBUNTU_FOCAL: ci/Dockerfile-ubuntu-focal-for-pmacct
BUILD_DOCKER_TAG_UBUNTU_FOCAL: builder_ubuntu_focal
BUILD_DOCKER_FILE_UBUNTU_JAMMY: ci/Dockerfile-ubuntu-jammy-for-pmacct
BUILD_DOCKER_TAG_UBUNTU_JAMMY: builder_ubuntu_jammy
BUILD_DOCKER_FILE_ROCKYLINUX_8: ci/Dockerfile-rockylinux-8-for-pmacct
BUILD_DOCKER_TAG_ROCKYLINUX_8: builder_rockylinux8
BUILD_DOCKER_FILE_ROCKYLINUX_9: ci/Dockerfile-rockylinux-9-for-pmacct
BUILD_DOCKER_TAG_ROCKYLINUX_9: builder_rockylinux9
jobs:
### Step 1: build container images
builder-ubuntu-focal-docker:
runs-on: ubuntu-22.04
steps:
- name: Checkout pmacct
uses: actions/checkout@v2
with:
path: pmacct
- name: Build docker image for Ubuntu Focal
run: |
cd pmacct
git config --global --add safe.directory $GITHUB_WORKSPACE
git config --global --add safe.directory $GITHUB_WORKSPACE/src/external_libs/libcdada
git rev-parse HEAD
docker buildx build --platform $ARCHS -f $BUILD_DOCKER_FILE_UBUNTU_FOCAL -t $BUILD_DOCKER_TAG_UBUNTU_FOCAL .
mkdir -p /tmp/docker/
docker save -o /tmp/docker/$BUILD_DOCKER_TAG_UBUNTU_FOCAL.tar $BUILD_DOCKER_TAG_UBUNTU_FOCAL
- name: Artifact docker image
uses: actions/[email protected]
with:
name: builder_ubuntu_focal
retention-days: 1
path: |
/tmp/docker
builder-ubuntu-jammy-docker:
runs-on: ubuntu-22.04
steps:
- name: Checkout pmacct
uses: actions/checkout@v2
with:
path: pmacct
- name: Build docker image for Ubuntu Jammy
run: |
cd pmacct
git config --global --add safe.directory $GITHUB_WORKSPACE
git config --global --add safe.directory $GITHUB_WORKSPACE/src/external_libs/libcdada
git rev-parse HEAD
docker buildx build --platform $ARCHS -f $BUILD_DOCKER_FILE_UBUNTU_JAMMY -t $BUILD_DOCKER_TAG_UBUNTU_JAMMY .
mkdir -p /tmp/docker/
docker save -o /tmp/docker/$BUILD_DOCKER_TAG_UBUNTU_JAMMY.tar $BUILD_DOCKER_TAG_UBUNTU_JAMMY
- name: Artifact docker image
uses: actions/[email protected]
with:
name: builder_ubuntu_jammy
retention-days: 1
path: |
/tmp/docker
builder-rockylinux8-docker:
runs-on: ubuntu-22.04
steps:
- name: Checkout pmacct
uses: actions/checkout@v2
with:
path: pmacct
- name: Build docker image for Rocky Linux 8
run: |
cd pmacct
git config --global --add safe.directory $GITHUB_WORKSPACE
git config --global --add safe.directory $GITHUB_WORKSPACE/src/external_libs/libcdada
git rev-parse HEAD
docker buildx build --platform $ARCHS -f $BUILD_DOCKER_FILE_ROCKYLINUX_8 -t $BUILD_DOCKER_TAG_ROCKYLINUX_8 .
mkdir -p /tmp/docker/
docker save -o /tmp/docker/builder_rockylinux8.tar $BUILD_DOCKER_TAG_ROCKYLINUX_8
- name: Artifact docker image
uses: actions/[email protected]
with:
name: builder_rockylinux8
retention-days: 1
path: |
/tmp/docker
builder-rockylinux9-docker:
runs-on: ubuntu-22.04
steps:
- name: Checkout pmacct
uses: actions/checkout@v2
with:
path: pmacct
- name: Build docker image for Rocky Linux 9
run: |
cd pmacct
git config --global --add safe.directory $GITHUB_WORKSPACE
git config --global --add safe.directory $GITHUB_WORKSPACE/src/external_libs/libcdada
git rev-parse HEAD
docker buildx build --platform $ARCHS -f $BUILD_DOCKER_FILE_ROCKYLINUX_9 -t $BUILD_DOCKER_TAG_ROCKYLINUX_9 .
mkdir -p /tmp/docker/
docker save -o /tmp/docker/builder_rockylinux9.tar $BUILD_DOCKER_TAG_ROCKYLINUX_9
- name: Artifact docker image
uses: actions/[email protected]
with:
name: builder_rockylinux9
retention-days: 1
path: |
/tmp/docker
### Step 2: permutations
build-and-test:
needs: [builder-ubuntu-focal-docker, builder-ubuntu-jammy-docker, builder-rockylinux8-docker, builder-rockylinux9-docker]
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
builder-name: [builder_ubuntu_focal, builder_ubuntu_jammy, builder_rockylinux8, builder_rockylinux9]
CONFIG_FLAGS: [
"",
"--enable-debug",
"--enable-debug --enable-jansson",
"--enable-debug --enable-jansson --enable-kafka",
"--enable-debug --enable-jansson --enable-kafka --enable-avro --enable-serdes",
"--enable-debug --enable-jansson --enable-zmq",
"--enable-debug --enable-jansson --enable-zmq --enable-kafka",
"--enable-debug --enable-mysql --enable-pgsql --enable-sqlite3 --enable-kafka --enable-geoipv2 --enable-jansson --enable-rabbitmq --enable-ndpi --enable-zmq --enable-avro --enable-serdes --enable-redis --enable-unyte-udp-notif",
"--enable-debug --enable-zmq",
"--enable-jansson",
"--enable-jansson --enable-kafka",
"--enable-jansson --enable-kafka --enable-avro --enable-serdes",
"--enable-jansson --enable-zmq",
"--enable-jansson --enable-zmq --enable-kafka",
"--enable-mysql --enable-pgsql --enable-sqlite3 --enable-kafka --enable-geoipv2 --enable-jansson --enable-rabbitmq --enable-ndpi --enable-zmq --enable-avro --enable-serdes --enable-redis --enable-unyte-udp-notif",
"--enable-zmq"]
env:
CONFIG_FLAGS: ${{ matrix.CONFIG_FLAGS }}
steps:
- name: Info
run: |
echo "Builder: ${{ matrix.builder-name }}"
echo "CONFIG_FLAGS: ${{ matrix.CONFIG_FLAGS }}"
- name: Create /tmp/docker folder to copy the docker registry (artifact)
run: |
mkdir -p /tmp/docker
- uses: actions/download-artifact@v2
with:
name: ${{ matrix.builder-name }}
path: /tmp/docker
- name: List contents of /tmp/docker
run: |
ls -la /tmp/docker
- name: Checkout pmacct
uses: actions/[email protected]
with:
fetch-depth: 0
path: pmacct
- name: Build in '${{ matrix.builder-name }}' with '${{ matrix.CONFIG_FLAGS }}'
run: |
cd pmacct
git config --global --add safe.directory $GITHUB_WORKSPACE
git config --global --add safe.directory $GITHUB_WORKSPACE/src/external_libs/libcdada
git rev-parse HEAD
docker load -i /tmp/docker/${{ matrix.builder-name }}.tar
CONTAINER_ID=$(docker run --rm -it -d -v `pwd`:`pwd` -w `pwd` -e CONFIG_FLAGS ${{ matrix.builder-name }}:latest)
echo "Launched container id:" $CONTAINER_ID
docker exec -i $CONTAINER_ID ./ci/script.sh
docker stop $CONTAINER_ID
### Step 3: official docker image generation
pmacct-docker:
runs-on: ubuntu-22.04
steps:
- name: Checkout pmacct
uses: actions/checkout@v1 #Don't use v2 messes everything
with:
path: pmacct
- name: Build containers
run: |
git config --global --add safe.directory $GITHUB_WORKSPACE
git config --global --add safe.directory $GITHUB_WORKSPACE/src/external_libs/libcdada
git rev-parse HEAD
echo "Fix mess with tags in actions/checkout..."
git fetch -f && git fetch -f --tags
echo "Deducing PMACCT_VERSION..."
PMACCT_VERSION=$(git describe --abbrev=0 --match="v*")
echo "PMACCT_VERSION=$PMACCT_VERSION"
echo "Building the base container..."
docker buildx build --platform $ARCHS --build-arg NUM_WORKERS=$CI_NUM_WORKERS --build-arg DEPS_DONT_CHECK_CERTIFICATE=$CI_DEPS_DONT_CHECK_CERTIFICATE -f docker/base/Dockerfile -t base:_build .
echo "Building daemon containers..."
docker buildx build --platform $ARCHS -f docker/pmacctd/Dockerfile -t pmacctd:_build .
docker buildx build --platform $ARCHS -f docker/nfacctd/Dockerfile -t nfacctd:_build .
docker buildx build --platform $ARCHS -f docker/sfacctd/Dockerfile -t sfacctd:_build .
docker buildx build --platform $ARCHS -f docker/uacctd/Dockerfile -t uacctd:_build .
docker buildx build --platform $ARCHS -f docker/pmbgpd/Dockerfile -t pmbgpd:_build .
docker buildx build --platform $ARCHS -f docker/pmbmpd/Dockerfile -t pmbmpd:_build .
docker buildx build --platform $ARCHS -f docker/pmtelemetryd/Dockerfile -t pmtelemetryd:_build .
echo "Saving images as artifacts..."
mkdir -p /tmp/docker/
docker save -o /tmp/docker/pmacct_docker_images.tar base:_build pmacctd:_build nfacctd:_build sfacctd:_build uacctd:_build pmbgpd:_build pmbmpd:_build pmtelemetryd:_build
- name: Docker (compose) smoke test
run: |
echo "Running smoke test using docker-compose..."
TAG=_build docker-compose -f ci/smoke-test/docker-compose.yml up -d
sleep 10
echo "Check that all containers are up and running, without restarts ..."
if [[ "$(docker inspect `docker ps -aq` | grep RestartCount | grep -v '\"RestartCount\": 0')" != "" ]]; then
echo "Some containers restarted!" && docker inspect `docker ps -aq` && /bin/false
fi
echo "Stopping containers..."
TAG=_build docker-compose -f ci/smoke-test/docker-compose.yml down
- name: Export pmacct docker images as an artifact
uses: actions/[email protected]
with:
name: pmacct_docker_images
retention-days: 1
path: |
/tmp/docker
### Step 4: Upload images to dockerhub (bleeding-edge, latest and releases)
publish-dockerhub:
needs: [pmacct-docker, build-and-test]
runs-on: ubuntu-22.04
if: github.event_name != 'pull_request'
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
steps:
- uses: actions/download-artifact@v2
with:
name: pmacct_docker_images
path: /tmp/docker
- name: Import pmacct docker images in the local registry
run: |
docker load -i /tmp/docker/pmacct_docker_images.tar
- name: Checkout pmacct
uses: actions/checkout@v1 #Don't use v2 messes everything
with:
path: pmacct
- name: Build and upload containers
run: |
echo "Fix mess with tags in actions/checkout..."
git fetch -f && git fetch -f --tags
echo "Deducing PMACCT_VERSION..."
PMACCT_VERSION=$(git describe --abbrev=0 --match="v*")
echo "PMACCT_VERSION=$PMACCT_VERSION"
echo "Uploading to dockerhub ...";
echo ${DOCKER_PASSWORD} | docker login -u ${DOCKER_USERNAME} --password-stdin;
#Always push bleeding-edge when pushed to master
GIT_IS_BLEEDING_EDGE=$( (git branch --all --contains HEAD | grep master ) || echo "")
echo "GIT_IS_BLEEDING_EDGE=$GIT_IS_BLEEDING_EDGE"
if [ "$GIT_IS_BLEEDING_EDGE" != "" ]; then
echo "Uploading 'bleeding-edge' tag for `git describe`...";
docker buildx tag --platform $ARCHS base:_build ${DOCKER_USERNAME}/base:bleeding-edge;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/base:bleeding-edge;
docker buildx tag --platform $ARCHS pmacctd:_build ${DOCKER_USERNAME}/pmacctd:bleeding-edge;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/pmacctd:bleeding-edge;
docker buildx tag --platform $ARCHS nfacctd:_build ${DOCKER_USERNAME}/nfacctd:bleeding-edge;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/nfacctd:bleeding-edge;
docker buildx tag --platform $ARCHS sfacctd:_build ${DOCKER_USERNAME}/sfacctd:bleeding-edge;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/sfacctd:bleeding-edge;
docker buildx tag --platform $ARCHS uacctd:_build ${DOCKER_USERNAME}/uacctd:bleeding-edge;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/uacctd:bleeding-edge;
docker buildx tag --platform $ARCHS pmbgpd:_build ${DOCKER_USERNAME}/pmbgpd:bleeding-edge;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/pmbgpd:bleeding-edge;
docker buildx tag --platform $ARCHS pmbmpd:_build ${DOCKER_USERNAME}/pmbmpd:bleeding-edge;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/pmbmpd:bleeding-edge;
docker buildx tag --platform $ARCHS pmtelemetryd:_build ${DOCKER_USERNAME}/pmtelemetryd:bleeding-edge;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/pmtelemetryd:bleeding-edge;
fi
#Upload vX.Y.Z only of it's a release commit
GIT_RELEASE_TAG=$(git describe --exact-match --match "v*" || echo "")
echo "GIT_RELEASE_TAG=$GIT_RELEASE_TAG"
if [ "$GIT_RELEASE_TAG" != "" ]; then
echo "Uploading '$PMACCT_VERSION' tag for `git describe`...";
docker buildx tag --platform $ARCHS base:_build ${DOCKER_USERNAME}/base:${PMACCT_VERSION};
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/base:${PMACCT_VERSION};
docker buildx tag --platform $ARCHS pmacctd:_build ${DOCKER_USERNAME}/pmacctd:${PMACCT_VERSION};
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/pmacctd:${PMACCT_VERSION};
docker buildx tag --platform $ARCHS nfacctd:_build ${DOCKER_USERNAME}/nfacctd:${PMACCT_VERSION};
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/nfacctd:${PMACCT_VERSION};
docker buildx tag --platform $ARCHS sfacctd:_build ${DOCKER_USERNAME}/sfacctd:${PMACCT_VERSION};
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/sfacctd:${PMACCT_VERSION};
docker buildx tag --platform $ARCHS uacctd:_build ${DOCKER_USERNAME}/uacctd:${PMACCT_VERSION};
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/uacctd:${PMACCT_VERSION};
docker buildx tag --platform $ARCHS pmbgpd:_build ${DOCKER_USERNAME}/pmbgpd:${PMACCT_VERSION};
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/pmbgpd:${PMACCT_VERSION};
docker buildx tag --platform $ARCHS pmbmpd:_build ${DOCKER_USERNAME}/pmbmpd:${PMACCT_VERSION};
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/pmbmpd:${PMACCT_VERSION};
docker buildx tag --platform $ARCHS pmtelemetryd:_build ${DOCKER_USERNAME}/pmtelemetryd:${PMACCT_VERSION};
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/pmtelemetryd:${PMACCT_VERSION};
fi
#Upload "latest" if the release version is the highest
if [ "$GIT_RELEASE_TAG" != "" ]; then
GIT_LAST_TAG=$(git tag --sort=v:refname | tail -n 1);
echo "GIT_LAST_TAG=$GIT_LAST_TAG"
if [ "$GIT_RELEASE_TAG" == "$GIT_LAST_TAG" ]; then
echo "Uploading 'latest' tag for `git describe`...";
docker buildx tag --platform $ARCHS base:_build ${DOCKER_USERNAME}/base:latest;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/base:latest;
docker buildx tag --platform $ARCHS pmacctd:_build ${DOCKER_USERNAME}/pmacctd:latest;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/pmacctd:latest;
docker buildx tag --platform $ARCHS nfacctd:_build ${DOCKER_USERNAME}/nfacctd:latest;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/nfacctd:latest;
docker buildx tag --platform $ARCHS sfacctd:_build ${DOCKER_USERNAME}/sfacctd:latest;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/sfacctd:latest;
docker buildx tag --platform $ARCHS uacctd:_build ${DOCKER_USERNAME}/uacctd:latest;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/uacctd:latest;
docker buildx tag --platform $ARCHS pmbgpd:_build ${DOCKER_USERNAME}/pmbgpd:latest;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/pmbgpd:latest;
docker buildx tag --platform $ARCHS pmbmpd:_build ${DOCKER_USERNAME}/pmbmpd:latest;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/pmbmpd:latest;
docker buildx tag --platform $ARCHS pmtelemetryd:_build ${DOCKER_USERNAME}/pmtelemetryd:latest;
docker buildx push --platform $ARCHS ${DOCKER_USERNAME}/pmtelemetryd:latest;
fi
fi