mirror of
https://github.com/containers/skopeo.git
synced 2025-10-20 18:33:14 +00:00
Multi-arch github-action workflow unification
This is a port from the podman and buildah repository workflows. It's purpose is to build and push multi-arch images containing the latest upstream, testing, and stable versions of skopeo. It fully replaces the last remaining use of Travis in this repo, for substantially the same purpose. In a future commit, I intend to de-duplicate this workflow from podman and buildah, such that all three share a common set of details. Until then, any changes will need to be manually duplicated across all three repos. Signed-off-by: Chris Evich <cevich@redhat.com>
This commit is contained in:
206
.github/workflow/multi-arch-build.yaml
vendored
Normal file
206
.github/workflow/multi-arch-build.yaml
vendored
Normal file
@@ -0,0 +1,206 @@
|
||||
---
|
||||
|
||||
# Please see contrib/skopeoimage/README.md for details on the intentions
|
||||
# of this workflow.
|
||||
#
|
||||
# BIG FAT WARNING: This workflow is duplicated across containers/skopeo,
|
||||
# containers/buildah, and containers/podman. ANY AND
|
||||
# ALL CHANGES MADE HERE MUST BE MANUALLY DUPLICATED
|
||||
# TO THE OTHER REPOS.
|
||||
|
||||
name: build multi-arch images
|
||||
|
||||
on:
|
||||
# Upstream skopeo tends to be very active, with many merges per day.
|
||||
# Only run this daily via cron schedule, or manually, not by branch push.
|
||||
schedule:
|
||||
- cron: '0 8 * * *'
|
||||
# allows to run this workflow manually from the Actions tab
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
multi:
|
||||
name: multi-arch Skopeo build
|
||||
env:
|
||||
SKOPEO_QUAY_REGISTRY: quay.io/skopeo
|
||||
CONTAINERS_QUAY_REGISTRY: quay.io/containers
|
||||
# list of architectures for build
|
||||
PLATFORMS: linux/amd64,linux/s390x,linux/ppc64le,linux/arm64
|
||||
|
||||
# build several images (upstream, testing, stable) in parallel
|
||||
strategy:
|
||||
# By default, failure of one matrix item cancels all others
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# Builds are located under contrib/skopeoimage/<source> directory
|
||||
source:
|
||||
- upstream
|
||||
- testing
|
||||
- stable
|
||||
runs-on: ubuntu-latest
|
||||
# internal registry caches build for inspection before push
|
||||
services:
|
||||
registry:
|
||||
image: quay.io/libpod/registry:2
|
||||
ports:
|
||||
- 5000:5000
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v1
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
with:
|
||||
driver-opts: network=host
|
||||
install: true
|
||||
|
||||
- name: Build and locally push Skopeo
|
||||
uses: docker/build-push-action@v2
|
||||
with:
|
||||
context: contrib/skopeoimage/${{ matrix.source }}
|
||||
file: ./contrib/skopeoimage/${{ matrix.source }}/Dockerfile
|
||||
platforms: ${{ env.PLATFORMS }}
|
||||
push: true
|
||||
tags: localhost:5000/skopeo/${{ matrix.source }}
|
||||
|
||||
# Simple verification that stable images work, and
|
||||
# also grab version number use in forming the FQIN.
|
||||
- name: amd64 container sniff test
|
||||
if: matrix.source == 'stable'
|
||||
id: sniff_test
|
||||
run: |
|
||||
VERSION_OUTPUT="$(docker run localhost:5000/skopeo/${{ matrix.source }} \
|
||||
skopeo --storage-driver=vfs version)"
|
||||
echo "$VERSION_OUTPUT"
|
||||
VERSION=$(grep -Em1 '^Version: ' <<<"$VERSION_OUTPUT" | awk '{print $2}')
|
||||
test -n "$VERSION"
|
||||
echo "::set-output name=version::${VERSION}"
|
||||
|
||||
- name: Generate skopeo reg. image FQIN(s)
|
||||
id: skopeo_reg
|
||||
run: |
|
||||
if [[ "${{ matrix.source }}" == 'stable' ]]; then
|
||||
# The `skopeo version` in image just built
|
||||
VERSION='v${{ steps.sniff_test.outputs.version }}'
|
||||
# workaround vim syntax-highlight bug: '
|
||||
# Image tags previously pushed to quay
|
||||
ALLTAGS=$(skopeo list-tags \
|
||||
docker://$SKOPEO_QUAY_REGISTRY/stable | \
|
||||
jq -r '.Tags[]')
|
||||
|
||||
# New version? Push quay.io/skopeo/stable:vX.X.X and :latest
|
||||
if ! fgrep -qx "$VERSION" <<<"$ALLTAGS"; then
|
||||
# Assume version-tag is also the most up to date (i.e. "latest")
|
||||
FQIN="$SKOPEO_QUAY_REGISTRY/stable:$VERSION,$SKOPEO_QUAY_REGISTRY/stable:latest"
|
||||
else # Not a new version-tagged image
|
||||
# Assume other contents changed, so this is the "new" latest.
|
||||
FQIN="$SKOPEO_QUAY_REGISTRY/stable:latest"
|
||||
fi
|
||||
elif [[ "${{ matrix.source }}" == 'testing' ]]; then
|
||||
# Assume some contents changed, always push latest testing.
|
||||
FQIN="$SKOPEO_QUAY_REGISTRY/testing:latest"
|
||||
elif [[ "${{ matrix.source }}" == 'upstream' ]]; then
|
||||
# Assume some contents changed, always push latest upstream.
|
||||
FQIN="$SKOPEO_QUAY_REGISTRY/upstream:latest"
|
||||
else
|
||||
echo "::error::Unknown matrix item '${{ matrix.source }}'"
|
||||
exit 1
|
||||
fi
|
||||
echo "::warning::Pushing $FQIN"
|
||||
echo "::set-output name=fqin::${FQIN}"
|
||||
echo '::set-output name=push::true'
|
||||
|
||||
# This is substantially similar to the above logic,
|
||||
# but only handles $CONTAINERS_QUAY_REGISTRY for
|
||||
# the stable "latest" and named-version tagged images.
|
||||
- name: Generate containers reg. image FQIN(s)
|
||||
if: matrix.source == 'stable'
|
||||
id: containers_reg
|
||||
run: |
|
||||
VERSION='v${{ steps.sniff_test.outputs.version }}'
|
||||
# workaround vim syntax-highlight bug: '
|
||||
ALLTAGS=$(skopeo list-tags \
|
||||
docker://$CONTAINERS_QUAY_REGISTRY/skopeo | \
|
||||
jq -r '.Tags[]')
|
||||
|
||||
# New version? Push quay.io/containers/skopeo:vX.X.X and latest
|
||||
if ! fgrep -qx "$VERSION" <<<"$ALLTAGS"; then
|
||||
FQIN="$CONTAINERS_QUAY_REGISTRY/skopeo:$VERSION,$CONTAINERS_QUAY_REGISTRY/skopeo:latest"
|
||||
else # Not a new version-tagged image, only update latest.
|
||||
FQIN="$CONTAINERS_QUAY_REGISTRY/skopeo:latest"
|
||||
fi
|
||||
echo "::warning::Pushing $FQIN"
|
||||
echo "::set-output name=fqin::${FQIN}"
|
||||
echo '::set-output name=push::true'
|
||||
|
||||
- name: Define LABELS multi-line env. var. value
|
||||
run: |
|
||||
# This is a really hacky/strange workflow idiom, required
|
||||
# for setting multi-line $LABELS value for consumption in
|
||||
# a future step.
|
||||
# https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#multiline-strings
|
||||
cat << EOF | tee -a $GITHUB_ENV
|
||||
LABELS<<DELIMITER
|
||||
org.opencontainers.image.source=https://github.com/${{ github.repository }}.git
|
||||
org.opencontainers.image.revision=${{ github.sha }}
|
||||
org.opencontainers.image.created=$(date -u --iso-8601=seconds)
|
||||
DELIMITER
|
||||
EOF
|
||||
|
||||
# Separate steps to login and push for skopeo and containers quay
|
||||
# repositories are required, because 2 sets of credentials are used and `docker
|
||||
# login` as well as `skopeo login` do not support having 2 different
|
||||
# credential sets for 1 registry.
|
||||
# At the same time reuse of non-shell steps is not supported by Github Actions
|
||||
# via anchors or composite actions
|
||||
|
||||
# Push to 'skopeo' Quay repo for stable, testing. and upstream
|
||||
- name: Login to 'skopeo' Quay registry
|
||||
uses: docker/login-action@v1
|
||||
if: steps.skopeo_reg.outputs.push == 'true'
|
||||
with:
|
||||
registry: ${{ env.SKOPEO_QUAY_REGISTRY }}
|
||||
# N/B: Secrets are not passed to workflows that are triggered
|
||||
# by a pull request from a fork
|
||||
username: ${{ secrets.SKOPEO_QUAY_USERNAME }}
|
||||
password: ${{ secrets.SKOPEO_QUAY_PASSWORD }}
|
||||
|
||||
- name: Push images to 'skopeo' Quay
|
||||
uses: docker/build-push-action@v2
|
||||
if: steps.skopeo_reg.outputs.push == 'true'
|
||||
with:
|
||||
cache-from: type=registry,ref=localhost:5000/skopeo/${{ matrix.source }}
|
||||
cache-to: type=inline
|
||||
context: contrib/skopeoimage/${{ matrix.source }}
|
||||
file: ./contrib/skopeoimage/${{ matrix.source }}/Dockerfile
|
||||
platforms: ${{ env.PLATFORMS }}
|
||||
push: true
|
||||
tags: ${{ steps.skopeo_reg.outputs.fqin }}
|
||||
labels: |
|
||||
${{ env.LABELS }}
|
||||
|
||||
# Push to 'containers' Quay repo only stable skopeo
|
||||
- name: Login to 'containers' Quay registry
|
||||
if: steps.containers_reg.outputs.push == 'true'
|
||||
uses: docker/login-action@v1
|
||||
with:
|
||||
registry: ${{ env.CONTAINERS_QUAY_REGISTRY}}
|
||||
username: ${{ secrets.CONTAINERS_QUAY_USERNAME }}
|
||||
password: ${{ secrets.CONTAINERS_QUAY_PASSWORD }}
|
||||
|
||||
- name: Push images to 'containers' Quay
|
||||
if: steps.containers_reg.outputs.push == 'true'
|
||||
uses: docker/build-push-action@v2
|
||||
with:
|
||||
cache-from: type=registry,ref=localhost:5000/skopeo/${{ matrix.source }}
|
||||
cache-to: type=inline
|
||||
context: contrib/skopeoimage/${{ matrix.source }}
|
||||
file: ./contrib/skopeoimage/${{ matrix.source }}/Dockerfile
|
||||
platforms: ${{ env.PLATFORMS }}
|
||||
push: true
|
||||
tags: ${{ steps.containers_reg.outputs.fqin }}
|
||||
labels: |
|
||||
${{ env.LABELS }}
|
||||
Reference in New Issue
Block a user