Full rocker & bioc build #29
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This is a basic workflow to help you get started with Actions | |
name: Full rocker & bioc build | |
# Controls when the action will run. Triggers the workflow on push or pull request | |
# events but only for the master branch | |
on: | |
workflow_dispatch: | |
inputs: | |
rver: | |
default: "devel" | |
biocver: | |
default: "3.18" | |
outname: | |
default: "bioconductor_docker" | |
schedule: | |
- cron: '0 18 * * 5' | |
jobs: | |
bump: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Push patch bump | |
uses: nick-fields/retry@v2 | |
with: | |
timeout_minutes: 10 | |
max_attempts: 50 | |
shell: bash | |
command: | | |
set -x | |
git config --global --add safe.directory "$GITHUB_WORKSPACE" | |
git config user.name github-actions | |
git config user.email [email protected] | |
git pull origin main || git reset --hard origin/main | |
sed -r -i 's/(^ARG BIOCONDUCTOR_PATCH=)([0-9]+)$/echo "\1$((\2+1))"/ge' Dockerfile | |
git add Dockerfile | |
git commit -m "Bump BIOCONDUCTOR_PATCH" | |
git push | |
build: | |
strategy: | |
matrix: | |
arch: [amd64, arm64] | |
runs-on: ubuntu-latest | |
needs: bump | |
steps: | |
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it | |
- uses: actions/checkout@v3 | |
- name: Free root space | |
uses: almahmoud/free-root-space@main | |
with: | |
verbose: true | |
- name: Set defaults for schedule | |
id: defs | |
run: | | |
echo outname=$(echo ${{ github.event.inputs.outname || 'bioconductor_docker' }}) >> $GITHUB_OUTPUT | |
echo rver=$(echo ${{ github.event.inputs.rver || 'devel' }}) >> $GITHUB_OUTPUT | |
echo biocver=$(echo ${{ github.event.inputs.biocver || '3.18' }}) >> $GITHUB_OUTPUT | |
echo registryuser=$(echo ${{ github.repository_owner }} | awk '{print tolower($0)}') >> $GITHUB_OUTPUT | |
echo rockerintermediateprefix=$(echo "ghcr.io/${{ github.repository_owner }}/rocker" | awk '{print tolower($0)}') >> $GITHUB_OUTPUT | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v2 | |
with: | |
platforms: arm64 | |
if: matrix.arch == 'arm64' | |
- name: Login to GHCR | |
uses: docker/login-action@v2 | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Login to Dockerhub | |
uses: docker/login-action@v2 | |
with: | |
username: ${{ secrets.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKER_PASSWORD }} | |
- name: Extract metadata for container image | |
id: meta | |
uses: docker/metadata-action@v4 | |
with: | |
images: ${{ steps.defs.outputs.registryuser }}/${{ steps.defs.outputs.outname }} | |
tags: | | |
type=raw,value=${{ steps.defs.outputs.rver }}-${{ matrix.arch }} | |
- name: Set comma-separated list with all repository names | |
id: images | |
run: | | |
IMG=${{ steps.meta.outputs.tags }} | |
REPOLIST="docker.io/$IMG,ghcr.io/$IMG" | |
echo ghcr=$(echo "ghcr.io/$IMG") >> $GITHUB_OUTPUT | |
SUB="_docker" | |
# Also add alternative without _docker when in name | |
echo list=$(if [[ $REPOLIST == *$SUB* ]]; then echo "$REPOLIST,$(echo $REPOLIST | sed 's/_docker//g')"; else echo $REPOLIST; fi) >> $GITHUB_OUTPUT | |
## git clone rocker | |
git clone --depth 1 https://github.com/rocker-org/rocker-versioned2 | |
sed -i 's#rocker/r-ver:${{ steps.defs.outputs.rver }}#${{ steps.defs.outputs.rockerintermediateprefix }}-r-ver:${{ steps.defs.outputs.rver }}-${{ matrix.arch }}#g' rocker-versioned2/dockerfiles/rstudio_${{ steps.defs.outputs.rver }}.Dockerfile | |
sed -i 's#install_quarto.sh#install_quarto.sh || true#g' rocker-versioned2/dockerfiles/rstudio_${{ steps.defs.outputs.rver }}.Dockerfile | |
BIOC_MINOR=$(echo "${{ steps.defs.outputs.biocver }}" | awk -F'.' '{print $NF}') | |
echo "Bioconductor Version: ${{ steps.defs.outputs.biocver }}" | |
if [ "${{ steps.defs.outputs.rver }}" = "devel" ]; | |
then | |
if [ $((BIOC_MINOR%2)) -eq 0 ]; | |
then | |
echo "Using latest release R since Bioc devel version is even"; | |
sed -i 's#R_VERSION=${{ steps.defs.outputs.rver }}#R_VERSION=latest#g' rocker-versioned2/dockerfiles/r-ver_${{ steps.defs.outputs.rver }}.Dockerfile | |
else | |
echo "Using latest pre-release R since Bioc devel version is even"; | |
sed -i 's#R_VERSION=${{ steps.defs.outputs.rver }}#R_VERSION=patched#g' rocker-versioned2/dockerfiles/r-ver_${{ steps.defs.outputs.rver }}.Dockerfile | |
fi | |
fi | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v2 | |
with: | |
platforms: linux/${{ matrix.arch }} | |
- name: Build and load r-ver | |
uses: docker/build-push-action@v3 | |
with: | |
file: rocker-versioned2/dockerfiles/r-ver_${{ steps.defs.outputs.rver }}.Dockerfile | |
context: rocker-versioned2 | |
push: true | |
tags: ${{ steps.defs.outputs.rockerintermediateprefix }}-r-ver:${{ steps.defs.outputs.rver }}-${{ matrix.arch }} | |
platforms: linux/${{ matrix.arch }} | |
- name: Build and load rstudio | |
uses: docker/build-push-action@v3 | |
with: | |
file: rocker-versioned2/dockerfiles/rstudio_${{ steps.defs.outputs.rver }}.Dockerfile | |
context: rocker-versioned2 | |
push: true | |
tags: ${{ steps.defs.outputs.rockerintermediateprefix }}-rstudio:${{ steps.defs.outputs.rver }}-${{ matrix.arch }} | |
platforms: linux/${{ matrix.arch }} | |
- name: Build and push container image to all repos both arm64 and amd64 | |
uses: docker/build-push-action@v3 | |
with: | |
build-args: | | |
BASE_IMAGE=${{ steps.defs.outputs.rockerintermediateprefix }}-rstudio | |
arm64_tag=${{ steps.defs.outputs.rver }}-${{ matrix.arch }} | |
amd64_tag=${{ steps.defs.outputs.rver }}-${{ matrix.arch }} | |
BIOCONDUCTOR_VERSION=${{ steps.defs.outputs.biocver }} | |
file: Dockerfile | |
context: . | |
push: true | |
tags: ${{ steps.images.outputs.list }} | |
labels: ${{ steps.meta.outputs.labels }} | |
platforms: linux/${{ matrix.arch }} | |
test-built-containers: | |
strategy: | |
matrix: | |
arch: [arm64, amd64] | |
# The type of runner that the job will run on | |
runs-on: ubuntu-latest | |
needs: build | |
steps: | |
- name: Get image name | |
id: image | |
run: | | |
IMG=$(echo "${{ steps.defs.outputs.registryuser }}/${{ steps.defs.outputs.outname }}:${{ steps.defs.outputs.rver }}-${{ matrix.arch }}") | |
echo name=$IMG >> $GITHUB_OUTPUT | |
cat << EOF > test.Dockerfile | |
FROM $IMG as test | |
USER root | |
RUN mkdir -p /tmp/bioc_test && \ | |
apt list --installed | tee /tmp/bioc_test/aptlist && \ | |
Rscript -e "BiocManager::install(c('SummarizedExperiment','usethis','data.table','igraph','GEOquery'))" 2>&1 | tee /tmp/bioc_test/packages_install && \ | |
Rscript -e "BiocManager::install('gert'); require('gert')" 2>&1 | tee /tmp/bioc_test/gert_install | |
FROM scratch as export | |
COPY --from=test /tmp/bioc_test /tmp | |
EOF | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v2 | |
with: | |
platforms: arm64 | |
if: matrix.arch == 'arm64' | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v2 | |
with: | |
platforms: linux/${{ matrix.arch }} | |
- name: Login to GHCR | |
uses: docker/login-action@v2 | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Test via build | |
id: dockerbuild | |
uses: docker/build-push-action@v4 | |
with: | |
file: test.Dockerfile | |
context: . | |
push: false | |
load: false | |
outputs: type=tar,dest=/tmp/image.tar | |
tags: ${{ steps.image.outputs.name }} | |
- run: | | |
mkdir -p /tmp/contents | |
cd /tmp/contents | |
tar -xvf /tmp/image.tar | |
sudo ls tmp/* | xargs -i bash -c "echo 'cat {}' && cat {}" | |