🚀 v2.8.2 is out, with EFS, Ephemeral Registry support, and YOLO mode (tmpfs)!
Speed up docker builds with the ephemeral registry, share files across workflow jobs with EFS, and speed up your builds with tmpfs!
Check out the new documentation pages for:
Now for the full release notes:
Details
- Released on: .
- For more details: view release notes on GitHub.
- CloudFormation template: https://runs-on.s3.eu-west-1.amazonaws.com/cloudformation/template-v2.8.2.yaml
Summary
Support for EFS, TMPFS, and ECR ephemeral registry for fast docker builds. Also some bug fixes.
What's changed
EFS
- Embedded networking stack can now create an Elastic File System (EFS), and runners will auto-mount it at
/mnt/efsif theextraslabel includeefs. Useful to share artefacts across job runs, with classic filesystem primitives.
jobs:
with-efs:
runs-on: runs-on=${{ github.run_id }},runner=2cpu-linux-x64,extras=efs
steps:
- run: df -ah /mnt/efs
# 127.0.0.1:/ 8.0E 35G 8.0E 1% /mnt/efs
📝 Example use case for maintaining mirrors
For instance this can be used to maintain local mirrors of very large github repositories and avoid long checkout times for every job:env:
MIRRORS: "https://github.com/PostHog/posthog.git"
# can be ${{ github.ref }} if same repo as the workflow
REF: main
jobs:
with-efs:
runs-on: runs-on=${{ github.run_id }},runner=2cpu-linux-x64,extras=efs
steps:
- name: Setup / Refresh mirrors
run: |
for MIRROR in ${{ env.MIRRORS }}; do
full_repo_name=$(echo $MIRROR | cut -d/ -f4-)
MIRROR_DIR=/mnt/efs/mirrors/$full_repo_name
mkdir -p "$(dirname $MIRROR_DIR)"
test -d "${MIRROR_DIR}" || git clone --mirror ${MIRROR/https:\/\//https:\/\/x-access-token:${{ secrets.GITHUB_TOKEN }}@} "${MIRROR_DIR}"
( cd "$MIRROR_DIR" && \
git remote set-url origin ${MIRROR/https:\/\//https:\/\/x-access-token:${{ secrets.GITHUB_TOKEN }}@} && \
git fetch origin ${{ env.REF }} )
done
- name: Checkout from mirror
run: |
git clone file:///mnt/efs/mirrors/PostHog/posthog.git --branch ${{ env.REF }} --single-branch --depth 1 upstream
Ephemeral registry
- Support for an Ephemeral ECR registry: can now automatically create an ECR repository that can act as an ephemeral registry for pulling/pushing images and cache layers from your runners. Especially useful with the
type=registrybuildkit cache instruction. If theextraslabel includesecr-cache, the runners will automatically setup docker credentials for that registry at the start of the job.
jobs:
ecr-cache:
runs-on: runs-on=${{ github.run_id }},runner=2cpu-linux-x64,extras=ecr-cache
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- uses: docker/build-push-action@v4
env:
TAG: ${{ env.RUNS_ON_ECR_CACHE }}:my-app-latest
with:
context: .
push: true
tags: ${{ env.TAG }}
cache-from: type=registry,ref=${{ env.TAG }}
cache-to: type=registry,ref=${{ env.TAG }} }},mode=max,compression=zstd,compression-level=22
Tmpfs
Support for setting up a tmpfs volume (size: 100% of available RAM, so only to be used on high-memory instances), and binding the /tmp, /home/runner, and /var/lib/docker folders on it. /tmp and /home/runner are mounted as overlays, preserving their existing content.
Can speed up some IO-intensive workflows. Note that if tmpfs is active, instances with ephemeral disks won't have those mounted since it would conflict with the tmpfs volume.
jobs:
with-tmpfs:
runs-on: runs-on=${{ github.run_id }},family=r7,ram=16,extras=tmpfs
steps:
- run: df -ah /mnt/tmpfs
# tmpfs 16G 724K 16G 1% /mnt/tmpfs
- run: df -ah /home/runner
# overlay 16G 724K 16G 1% /home/runner
- run: df -ah /tmp
# overlay 16G 724K 16G 1% /tmp
- run: df -ah /var/lib/docker
# tmpfs 16G 724K 16G 1% /var/lib/docker
You can obviously combine options, i.e. extras=efs+tmpfs+ecr-cache+s3-cache is a valid label 😄
Instance-storage mounting changes
Until now, when an instance has locally attached NVMe SSDs available, they would be automatically formatted and mounted so that /var/lib/docker and /home/runner/_work directories would end up on the local disks. Since a lot of stuff (caches etc.) seem to end up within the /home/runner folder itself, the agent now uses the same strategy as for the new tmpfs mounts above (i.e. the whole /home/runner folder is mounted as an overlay on the local disk volume, as well as the /tmp folder. /var/lib/docker remains mounted as a normal filesystem on the local disk volume). Fixes #284.
Misc
- Move all RunsOn-specific config files into
/runs-onfolder on Linux. More coherent with Windows (C:\runs-on), and avoids polluting/optfolder. - Fix
app_versionin logs (was previously empty string due to incorrect env variable being used in v2.8.1). - Fix "Require any Amazon EC2 launch template not to auto-assign public IP addresses to network interfaces" from AWS Control Tower. When the
Privatemode is set toonly, no longer enable public ip auto-assignment in the launch templates. Thanks @temap!