Skip to content

Bump docker/metadata-action from 4 to 5 #154

Bump docker/metadata-action from 4 to 5

Bump docker/metadata-action from 4 to 5 #154

Workflow file for this run

name: Build and Test
on:
pull_request:
jobs:
generate-matrix:
runs-on: ubuntu-latest
outputs:
build_matrix: ${{ steps.matrix.outputs.build_matrix }}
docker_test_matrix: ${{ steps.matrix.outputs.docker_test_matrix }}
podman_test_matrix: ${{ steps.matrix.outputs.podman_test_matrix }}
steps:
- name: Generate Build Matrix
id: matrix
run: |
PLATFORMS=(linux/386 linux/amd64 linux/arm/v7 linux/arm64 linux/ppc64le) # linux/s390x)
BASES=(core core18 core20 core22)
BUILD_MATRIX=
DOCKER_TEST_MATRIX=
PODMAN_TEST_MATRIX=
for base in ${BASES[@]}; do
channel=latest/stable
runner=ubuntu-latest
case $base in
core)
os=xenial
channel=4.x/stable
experimenal=true
runner=ubuntu-20.04
;;
core18)
os=bionic
channel=5.x/stable
;;
core20)
os=focal
;;
core22)
os=jammy
;;
esac
for platform in ${PLATFORMS[@]}; do
[ "$platform" = "linux/386" ] && [ "$base" != "core" ] && [ "$base" != "core18" ] && continue
[ "$platform" = "linux/s390" ] && ( [ "$base" = "core" ] || [ "$base" = "core18" ] ) && continue
experimental=false
[ "$platform" = "linux/s390" ] && experimental=true
BUILD_MATRIX="${BUILD_MATRIX:+$BUILD_MATRIX,}{\"platform\":\"$platform\",\"base\":{\"snap\":\"$base\",\"os\":\"$os\"},\"experimental\":\"$experimental\"}"
DOCKER_TEST_MATRIX="${DOCKER_TEST_MATRIX:+$DOCKER_TEST_MATRIX,}{\"platform\":\"$platform\",\"channel\":\"$channel\",\"base\":\"$base\",\"runner\":\"$runner\",\"experimental\":$experimental}"
done
PODMAN_TEST_MATRIX="${PODMAN_TEST_MATRIX:+$PODMAN_TEST_MATRIX,}{\"platform\":\"linux/amd64\",\"channel\":\"$channel\",\"base\":\"$base\",\"runner\":\"$runner\"}"
done
echo "build_matrix={\"include\":[$BUILD_MATRIX]}" >> $GITHUB_OUTPUT
echo "docker_test_matrix={\"include\":[$DOCKER_TEST_MATRIX]}" >> $GITHUB_OUTPUT
echo "podman_test_matrix={\"include\":[$PODMAN_TEST_MATRIX]}" >> $GITHUB_OUTPUT
build:
name: Build PR
runs-on: ubuntu-latest
needs: generate-matrix
strategy:
matrix: ${{ fromJson(needs.generate-matrix.outputs.build_matrix) }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
platforms: ${{ matrix.platform }}
tags: test-image
push: false
outputs: type=docker,dest=test-image.tar
build-args:
BASE_OS=${{ matrix.base.os }}
- name: Save container image
id: save_image
run: |
echo image_name="$(echo "${{matrix.base.snap}}-${{matrix.platform}}.tar" | sed 's|/|_|g')" >> $GITHUB_OUTPUT
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.save_image.outputs.image_name }}
path: ./test-image.tar
test-build-snap-docker:
name: Test Build Snap with Docker
runs-on: ${{matrix.runner}}
needs: [ generate-matrix, build ]
continue-on-error: ${{ matrix.experimental }}
strategy:
matrix: ${{ fromJson(needs.generate-matrix.outputs.docker_test_matrix) }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Enable Docker experimental
run: |
echo '{"experimental": true}' | sudo tee /etc/docker/daemon.json > /dev/null
sudo systemctl restart docker
- name: Load container image
id: load_image
run: |
echo image_name="$(echo "${{matrix.base}}-${{matrix.platform}}.tar" | sed 's|/|_|g')" >> $GITHUB_OUTPUT
- uses: actions/download-artifact@v4
with:
name: ${{ steps.load_image.outputs.image_name }}
path: ./artifacts
- name: Test build a Snap
id: build
run: |
docker image load -i ./artifacts/test-image.tar
docker run --rm --tty --privileged \
--platform "${{ matrix.platform }}" \
--env USE_SNAPCRAFT_CHANNEL="${{ matrix.channel }}" \
--volume "$GITHUB_WORKSPACE/tests/${{ matrix.base }}":"/data" \
--workdir "/data" \
test-image snapcraft
test-build-snap-podman:
name: Test Build Snap with Podman
runs-on: ${{matrix.runner}}
needs: [ generate-matrix, build ]
continue-on-error: true
strategy:
matrix: ${{ fromJson(needs.generate-matrix.outputs.podman_test_matrix) }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Load container image
id: load_image
run: |
echo image_name="$(echo "${{matrix.base}}-${{matrix.platform}}.tar" | sed 's|/|_|g')" >> $GITHUB_OUTPUT
- uses: actions/download-artifact@v4
with:
name: ${{ steps.load_image.outputs.image_name }}
path: ./artifacts
- name: Test build a Snap
id: build
run: |
sudo podman image load -i ./artifacts/test-image.tar
sudo podman run --rm --tty --privileged --systemd always \
--env USE_SNAPCRAFT_CHANNEL="${{ matrix.channel }}" \
--volume "$GITHUB_WORKSPACE/tests/${{ matrix.base }}":"/data" \
--workdir "/data" \
localhost/latest snapcraft
test-set-channel-docker:
name: Test Set Channel with Docker
runs-on: ${{matrix.runner}}
needs: [ generate-matrix, build ]
continue-on-error: ${{ matrix.experimental }}
strategy:
matrix: ${{ fromJson(needs.generate-matrix.outputs.docker_test_matrix) }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Enable Docker experimental
run: |
echo '{"experimental": true}' | sudo tee /etc/docker/daemon.json > /dev/null
sudo systemctl restart docker
- name: Load container image
id: load_image
run: |
echo image_name="$(echo "${{matrix.base}}-${{matrix.platform}}.tar" | sed 's|/|_|g')" >> $GITHUB_OUTPUT
- uses: actions/download-artifact@v4
with:
name: ${{ steps.load_image.outputs.image_name }}
path: ./artifacts
- name: Test changing channel
run: |
docker image load -i ./artifacts/test-image.tar
USE_SNAPCRAFT_CHANNEL="$(echo -n ${{ matrix.channel }} | sed -e 's/stable/candidate/')"
echo ::group
docker run --rm --tty --privileged \
--platform "${{ matrix.platform }}" \
--env USE_SNAPCRAFT_CHANNEL="$USE_SNAPCRAFT_CHANNEL" \
test-image snap info snapcraft --color=never 2>&1 | tee output.txt
echo ::endgroup
CHANNEL="$(cat output.txt | \
tr '\r\n' '\n' | \
awk 'BEGIN { FS = ":" }; /^tracking:/ { gsub(/ /, "", $2); print $2 }'
)"
echo "Snapcraft channel in use: $CHANNEL"
[ -n "$CHANNEL" ] && [ "$CHANNEL" = "$USE_SNAPCRAFT_CHANNEL" ]
test-set-channel-podman:
name: Test Set Channel with Podman
runs-on: ${{matrix.runner}}
needs: [ generate-matrix, build ]
continue-on-error: true
strategy:
matrix: ${{ fromJson(needs.generate-matrix.outputs.podman_test_matrix) }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Load container image
id: load_image
run: |
echo image_name="$(echo "${{matrix.base}}-${{matrix.platform}}.tar" | sed 's|/|_|g')" >> $GITHUB_OUTPUT
- uses: actions/download-artifact@v4
with:
name: ${{ steps.load_image.outputs.image_name }}
path: ./artifacts
- name: Test changing channel
run: |
sudo podman image load -i ./artifacts/test-image.tar
USE_SNAPCRAFT_CHANNEL="$(echo -n ${{ matrix.channel }} | sed -e 's/stable/candidate/')"
echo ::group
sudo podman run --rm --tty --privileged --systemd always \
--env USE_SNAPCRAFT_CHANNEL="$USE_SNAPCRAFT_CHANNEL" \
localhost/latest snap info snapcraft --color=never 2>&1 | tee output.txt
echo ::endgroup
CHANNEL="$(cat output.txt | \
tr '\r\n' '\n' | \
awk 'BEGIN { FS = ":" }; /^tracking:/ { gsub(/ /, "", $2); print $2 }'
)"
echo "Snapcraft channel in use: $CHANNEL"
[ -n "$CHANNEL" ] && [ "$CHANNEL" = "$USE_SNAPCRAFT_CHANNEL" ]
test-failure-docker:
name: Test Failures with Docker (expected)
runs-on: ${{matrix.runner}}
needs: [ generate-matrix, build ]
continue-on-error: ${{ matrix.experimental }}
strategy:
matrix: ${{ fromJson(needs.generate-matrix.outputs.docker_test_matrix) }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Enable Docker experimental
run: |
echo '{"experimental": true}' | sudo tee /etc/docker/daemon.json > /dev/null
sudo systemctl restart docker
- name: Load container image
id: load_image
run: |
echo image_name="$(echo "${{matrix.base}}-${{matrix.platform}}.tar" | sed 's|/|_|g')" >> $GITHUB_OUTPUT
- uses: actions/download-artifact@v4
with:
name: ${{ steps.load_image.outputs.image_name }}
path: ./artifacts
- name: Test failure to build a Snap
id: build
run: |
docker image load -i ./artifacts/test-image.tar
sed -Ei 's/command: bin\/hello/command: bin\/does-not-exist/' tests/${{ matrix.base }}/snap/snapcraft.yaml
if docker run --rm --tty --privileged \
--platform "${{ matrix.platform }}" \
--env USE_SNAPCRAFT_CHANNEL="${{ matrix.channel }}" \
--volume "$GITHUB_WORKSPACE/tests/${{ matrix.base }}":"/data" \
--workdir "/data" \
test-image snapcraft
then
echo "Snapcraft build should have failed"
exit 1
fi
test-failure-podman:
name: Test Failures with Podman (expected)
runs-on: ${{matrix.runner}}
needs: [ generate-matrix, build ]
continue-on-error: true
strategy:
matrix: ${{ fromJson(needs.generate-matrix.outputs.podman_test_matrix) }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Load container image
id: load_image
run: |
echo image_name="$(echo "${{matrix.base}}-${{matrix.platform}}.tar" | sed 's|/|_|g')" >> $GITHUB_OUTPUT
- uses: actions/download-artifact@v4
with:
name: ${{ steps.load_image.outputs.image_name }}
path: ./artifacts
- name: Test failure to build a Snap
id: build
run: |
sudo podman image load -i ./artifacts/test-image.tar
sed -Ei 's/command: bin\/hello/command: bin\/does-not-exist/' tests/${{ matrix.base }}/snap/snapcraft.yaml
if sudo podman run --rm --tty --privileged --systemd always \
--env USE_SNAPCRAFT_CHANNEL="${{ matrix.channel }}" \
--volume "$GITHUB_WORKSPACE/tests/${{ matrix.base }}":"/data" \
--workdir "/data" \
localhost/latest snapcraft
then
echo "Snapcraft build should have failed"
exit 1
fi