Skip to content

Build Container Image for Naive BBS #212

Build Container Image for Naive BBS

Build Container Image for Naive BBS #212

Workflow file for this run

name: Build Container Image for Naive BBS
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
BUILDKIT_STEP_LOG_MAX_SIZE: 50000000
jobs:
ghcrbuild:
strategy:
fail-fast: false
matrix:
ubuntu: [jammy]
platform: [linux/amd64]
branch: [devel, release]
name: Build container images for GHCR
runs-on: ubuntu-latest
steps:
- name: Free root space
uses: almahmoud/free-root-space@main
with:
verbose: true
- uses: actions/checkout@v3
- name: Extract metadata for container image
id: meta
uses: docker/metadata-action@v4
with:
images: ghcr.io/${{ github.repository }}
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: CYCLE=${{matrix.branch}}
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
USER root
RUN mkdir /bioctmp && /bbs_r_start -e 'BiocManager::version()' | grep '\[1\]' | awk -F"'" '{print $2}' > /bioctmp/biocver && /bbs_r_start --slave -e 'cat(paste(version$major, version$minor, sep = "."))' > /bioctmp/rver && cat /etc/os-release > /bioctmp/os-release
FROM scratch as export
COPY --from=extract /bioctmp/* /
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) >> $GITHUB_OUTPUT
echo biocver=$(cat biocver) >> $GITHUB_OUTPUT
echo osver=$(awk -F= '/VERSION_ID/ {gsub("\"", "", $2); print $2}' os-release) >> $GITHUB_OUTPUT
BASEPREFIX=""
if [ '${{matrix.branch}}' == 'devel' ]; then BASEPREFIX="devel-"; fi
echo baseprefix=$BASEPREFIX >> $GITHUB_OUTPUT
- name: Export digest by ubuntu and r versions
run: |
R_VER_EXPECTED=$(curl https://bioconductor.org/config.yaml | yq e '.r_ver_for_bioc_ver."${{steps.versions.outputs.biocver}}"')
R_VER_FOUND="${{steps.versions.outputs.rver}}"
R_FOUND_MAJOR_MINOR=${R_VER_FOUND%.*}
if [ "$R_FOUND_MAJOR_MINOR" != "$R_VER_EXPECTED" ]; then
echo "Mismatched versions found '$R_VER_FOUND' and expected '$R_VER_EXPECTED'"
exit 1
fi
digest="${{ steps.build.outputs.digest }}"
mkdir -p /tmp/digests/${{steps.versions.outputs.baseprefix}}${{matrix.ubuntu}}
touch "/tmp/digests/${{steps.versions.outputs.baseprefix}}${{matrix.ubuntu}}/${digest#sha256:}"
mkdir -p /tmp/digests/${{steps.versions.outputs.baseprefix}}${{matrix.ubuntu}}-bioc-${{steps.versions.outputs.biocver}}
touch "/tmp/digests/${{steps.versions.outputs.baseprefix}}${{matrix.ubuntu}}-bioc-${{steps.versions.outputs.biocver}}/${digest#sha256:}"
mkdir -p /tmp/digests/${{steps.versions.outputs.baseprefix}}${{matrix.ubuntu}}-bioc-${{steps.versions.outputs.biocver}}-r-${{steps.versions.outputs.rver}}
touch "/tmp/digests/${{steps.versions.outputs.baseprefix}}${{matrix.ubuntu}}-bioc-${{steps.versions.outputs.biocver}}-r-${{steps.versions.outputs.rver}}/${digest#sha256:}"
mkdir -p /tmp/digests/${{steps.versions.outputs.baseprefix}}${{steps.versions.outputs.osver}}
touch "/tmp/digests/${{steps.versions.outputs.baseprefix}}${{steps.versions.outputs.osver}}/${digest#sha256:}"
mkdir -p /tmp/digests/${{steps.versions.outputs.baseprefix}}${{steps.versions.outputs.osver}}-bioc-${{steps.versions.outputs.biocver}}
touch "/tmp/digests/${{steps.versions.outputs.baseprefix}}${{steps.versions.outputs.osver}}-bioc-${{steps.versions.outputs.biocver}}/${digest#sha256:}"
mkdir -p /tmp/digests/${{steps.versions.outputs.baseprefix}}${{steps.versions.outputs.osver}}-bioc-${{steps.versions.outputs.biocver}}-r-${{steps.versions.outputs.rver}}
touch "/tmp/digests/${{steps.versions.outputs.baseprefix}}${{steps.versions.outputs.osver}}-bioc-${{steps.versions.outputs.biocver}}-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: [jammy]
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 }}
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
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 ")'