Skip to content

Build Container Images #47

Build Container Images

Build Container Images #47

Workflow file for this run

name: Build Container Images
on:
workflow_dispatch:
push:
paths:
- "**/Dockerfile"
schedule:
- cron: '0 0 */2 * *'
# Avoids Github UI bugs https://github.com/orgs/community/discussions/45969
env:
BUILDX_NO_DEFAULT_ATTESTATIONS: 1
jobs:
ghcrbuild:
strategy:
fail-fast: false
matrix:
type: [builder, user]
ubuntu: [focal, jammy]
platform: [linux/amd64]
biocversion: ['3.18']
name: Build container images for GHCR
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Extract metadata for container image
id: meta
uses: docker/metadata-action@v4
with:
images: ghcr.io/${{ github.repository }}-${{ matrix.type }}
tags: |
type=raw,value=${{ matrix.ubuntu }}
- name: Extract container name without tag
id: vars
run: |
echo container=$(echo '${{ steps.meta.outputs.tags }}' | awk -F':' '{print $1}') >> $GITHUB_OUTPUT
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
with:
platforms: arm64
if: contains(steps.versions.outputs.platform, 'arm64')
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
with:
platforms: ${{matrix.platform}}
- name: Login to GHCR
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push container image to ghcr
id: build
uses: docker/build-push-action@v4
with:
build-args: |
UBUNTU_TAG=${{matrix.ubuntu}}
BIOC_VERSION=${{matrix.biocversion}}
file: ${{ matrix.type }}.Dockerfile
labels: ${{ steps.meta.outputs.labels }}
outputs: type=image,name=${{ steps.vars.outputs.container }},push-by-digest=true,name-canonical=true,push=true
platforms: ${{matrix.platform}}
provenance: false
- name: Prepare Dockerfile to extract R version with emulator
run: |
mkdir -p ${{matrix.ubuntu}}-${{matrix.platform}}
cat << "EOF" > ${{matrix.ubuntu}}-${{matrix.platform}}-r.Dockerfile
FROM ${{ steps.vars.outputs.container }}@${{ steps.build.outputs.digest }} as extract
RUN mkdir /r2utmp && R --version > /r2utmp/rver && cat /etc/os-release > /r2utmp/os-release
FROM scratch as export
COPY --from=extract /r2utmp/* /
EOF
- name: Build and push container image to ghcr
uses: docker/build-push-action@v4
with:
file: ${{matrix.ubuntu}}-${{matrix.platform}}-r.Dockerfile
context: .
push: false
load: false
provenance: false
outputs: type=tar,dest=${{matrix.ubuntu}}-${{matrix.platform}}/r.tar
tags: ${{ steps.meta.outputs.tags }}-r
platforms: ${{ matrix.platform }}
- name: Extract rversion
id: versions
run: |
cd ${{matrix.ubuntu}}-${{matrix.platform}}
tar -xvf r.tar
echo rver=$(cat rver | awk 'NR==1{print $3}') >> $GITHUB_OUTPUT
echo osver=$(awk -F= '/VERSION_ID/ {gsub("\"", "", $2); print $2}' os-release) >> $GITHUB_OUTPUT
- name: Export digest by ubuntu, r, and bioc versions
run: |
digest="${{ steps.build.outputs.digest }}"
mkdir -p /tmp/digests/${{matrix.type}}/${{matrix.ubuntu}}
touch "/tmp/digests/${{matrix.type}}/${{matrix.ubuntu}}/${digest#sha256:}"
mkdir -p /tmp/digests/${{matrix.type}}/${{matrix.ubuntu}}-r-${{steps.versions.outputs.rver}}
touch "/tmp/digests/${{matrix.type}}/${{matrix.ubuntu}}-r-${{steps.versions.outputs.rver}}/${digest#sha256:}"
mkdir -p /tmp/digests/${{matrix.type}}/${{steps.versions.outputs.osver}}
touch "/tmp/digests/${{matrix.type}}/${{steps.versions.outputs.osver}}/${digest#sha256:}"
mkdir -p /tmp/digests/${{matrix.type}}/${{steps.versions.outputs.osver}}-r-${{steps.versions.outputs.rver}}
touch "/tmp/digests/${{matrix.type}}/${{steps.versions.outputs.osver}}-r-${{steps.versions.outputs.rver}}/${digest#sha256:}"
mkdir -p /tmp/digests/${{matrix.type}}/${{matrix.ubuntu}}-bioc-${{matrix.biocversion}}
touch "/tmp/digests/${{matrix.type}}/${{matrix.ubuntu}}-bioc-${{matrix.biocversion}}/${digest#sha256:}"
mkdir -p /tmp/digests/${{matrix.type}}/${{matrix.ubuntu}}-bioc-${{matrix.biocversion}}-r-${{steps.versions.outputs.rver}}
touch "/tmp/digests/${{matrix.type}}/${{matrix.ubuntu}}-bioc-${{matrix.biocversion}}-r-${{steps.versions.outputs.rver}}/${digest#sha256:}"
mkdir -p /tmp/digests/${{matrix.type}}/${{steps.versions.outputs.osver}}-bioc-${{matrix.biocversion}}
touch "/tmp/digests/${{matrix.type}}/${{steps.versions.outputs.osver}}-bioc-${{matrix.biocversion}}/${digest#sha256:}"
mkdir -p /tmp/digests/${{matrix.type}}/${{steps.versions.outputs.osver}}-bioc-${{matrix.biocversion}}-r-${{steps.versions.outputs.rver}}
touch "/tmp/digests/${{matrix.type}}/${{steps.versions.outputs.osver}}-bioc-${{matrix.biocversion}}-r-${{steps.versions.outputs.rver}}/${digest#sha256:}"
- name: Upload digests
uses: actions/upload-artifact@v3
with:
name: r2udigests-${{ github.run_id }}
path: /tmp/digests/**
if-no-files-found: error
retention-days: 1
merge:
runs-on: ubuntu-latest
needs:
- ghcrbuild
if: always()
strategy:
fail-fast: false
matrix:
ubuntu: [focal, jammy]
type: [builder, user]
steps:
- name: Download digests
uses: actions/download-artifact@v3
with:
name: r2udigests-${{ github.run_id }}
path: /tmp/digests
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
with:
platforms: ${{matrix.platform}}
- name: Login to GHCR
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata for container image
id: meta
uses: docker/metadata-action@v4
with:
images: ghcr.io/${{ github.repository }}-${{ matrix.type }}
tags: |
type=raw,value=${{ matrix.ubuntu }}
- name: Extract container name without tag
id: vars
run: |
echo container=$(echo '${{ steps.meta.outputs.tags }}' | awk -F':' '{print $1}') >> $GITHUB_OUTPUT
- name: Create manifest list and push
run: |
cd /tmp/digests/${{matrix.type}}
ls --hide=digestdirs > digestdirs
cat digestdirs | xargs -i bash -c 'docker buildx imagetools create -t ${{steps.vars.outputs.container}}:{} $(for f in {}/*; do basename "$f"; done | xargs printf "${{steps.vars.outputs.container}}@sha256:%s ")'