80f47fcfff
## Issue Addressed N/A ## Proposed Changes Add some caching to the test suite and to the aarch64 cross-compile in the docker build. ## Additional Info Cache hits only occur if the Cargo.lock file is unchanged, Github Actions runner OS matches, and the cache is "in scope". Some documentation on github actions cache scoping is here: https://docs.github.com/en/free-pro-team@latest/actions/guides/caching-dependencies-to-speed-up-workflows#matching-a-cache-key I'm not sure how frequently we'll get cache hits, I imagine only on smaller PR's or updates to the same PR. And there is a cache size limit that we may end up reaching quickly. But Github actions handles evictions if we go over that limit. Not sure how much of an impact this will end up having but I don't really see a downside to trying it out. Co-authored-by: realbigsean <seananderson33@gmail.com>
113 lines
4.8 KiB
YAML
113 lines
4.8 KiB
YAML
name: docker
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- unstable
|
|
- stable
|
|
|
|
env:
|
|
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
|
|
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
|
IMAGE_NAME: sigp/lighthouse
|
|
|
|
jobs:
|
|
extract-branch-name:
|
|
runs-on: ubuntu-18.04
|
|
steps:
|
|
- name: Extract branch name
|
|
run: echo "::set-output name=BRANCH_NAME::$(echo ${GITHUB_REF#refs/heads/})"
|
|
id: extract_branch
|
|
outputs:
|
|
BRANCH_NAME: ${{ steps.extract_branch.outputs.BRANCH_NAME }}
|
|
build-docker-arm64:
|
|
runs-on: ubuntu-18.04
|
|
needs: [extract-branch-name]
|
|
# We need to enable experimental docker features in order to use `docker buildx`
|
|
env:
|
|
DOCKER_CLI_EXPERIMENTAL: enabled
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Cache cargo directory
|
|
uses: actions/cache@v2
|
|
with:
|
|
path: |
|
|
~/.cargo/registry/index/
|
|
~/.cargo/registry/cache/
|
|
~/.cargo/git/db/
|
|
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
|
- name: Cache target aarch64 release directory
|
|
uses: actions/cache@v2
|
|
with:
|
|
path: target/aarch64-unknown-linux-gnu/release
|
|
key: ${{ runner.os }}-target-aarch64-release-portable-${{ hashFiles('**/Cargo.lock') }}
|
|
- name: Dockerhub login
|
|
run: |
|
|
echo "${DOCKER_PASSWORD}" | docker login --username ${DOCKER_USERNAME} --password-stdin
|
|
- uses: actions-rs/toolchain@v1
|
|
with:
|
|
toolchain: stable
|
|
- name: Cross build lighthouse binary
|
|
uses: actions-rs/cargo@v1
|
|
with:
|
|
use-cross: true
|
|
command: build
|
|
args: --release --manifest-path lighthouse/Cargo.toml --target aarch64-unknown-linux-gnu --features portable
|
|
- name: Move cross-built ARM binary into Docker scope
|
|
run: |
|
|
mkdir ./bin;
|
|
mv ./target/aarch64-unknown-linux-gnu/release/lighthouse ./bin;
|
|
- name: Set Env
|
|
if: needs.extract-branch-name.outputs.BRANCH_NAME == 'unstable'
|
|
run: |
|
|
echo "TAG_SUFFIX=-unstable" >> $GITHUB_ENV;
|
|
# Install dependencies for emulation. Have to create a new builder to pick up emulation support.
|
|
- name: Build ARM64 dockerfile (with push)
|
|
run: |
|
|
docker run --privileged --rm tonistiigi/binfmt --install arm64
|
|
docker buildx create --use --name cross-builder
|
|
docker buildx build \
|
|
--platform=linux/arm64 \
|
|
--file ./Dockerfile.cross . \
|
|
--tag ${IMAGE_NAME}:latest-arm64${TAG_SUFFIX} \
|
|
--push
|
|
build-docker-amd64:
|
|
runs-on: ubuntu-18.04
|
|
needs: [extract-branch-name]
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Dockerhub login
|
|
run: |
|
|
echo "${DOCKER_PASSWORD}" | docker login --username ${DOCKER_USERNAME} --password-stdin
|
|
- name: Set Env
|
|
if: needs.extract-branch-name.outputs.BRANCH_NAME == 'unstable'
|
|
run: |
|
|
echo "TAG_SUFFIX=-unstable" >> $GITHUB_ENV;
|
|
- name: Build AMD64 dockerfile (with push)
|
|
run: |
|
|
docker build \
|
|
--build-arg PORTABLE=true \
|
|
--tag ${IMAGE_NAME}:latest-amd64${TAG_SUFFIX} \
|
|
--file ./Dockerfile .
|
|
docker push ${IMAGE_NAME}:latest-amd64${TAG_SUFFIX}
|
|
build-docker-multiarch:
|
|
runs-on: ubuntu-18.04
|
|
needs: [build-docker-arm64, build-docker-amd64, extract-branch-name]
|
|
# We need to enable experimental docker features in order to use `docker manifest`
|
|
env:
|
|
DOCKER_CLI_EXPERIMENTAL: enabled
|
|
steps:
|
|
- name: Dockerhub login
|
|
run: |
|
|
echo "${DOCKER_PASSWORD}" | docker login --username ${DOCKER_USERNAME} --password-stdin
|
|
- name: Set Env
|
|
if: needs.extract-branch-name.outputs.BRANCH_NAME == 'unstable'
|
|
run: |
|
|
echo "TAG_SUFFIX=-unstable" >> $GITHUB_ENV;
|
|
- name: Create and push multiarch manifest
|
|
run: |
|
|
docker manifest create ${IMAGE_NAME}:latest${TAG_SUFFIX} \
|
|
--amend ${IMAGE_NAME}:latest-arm64${TAG_SUFFIX} \
|
|
--amend ${IMAGE_NAME}:latest-amd64${TAG_SUFFIX};
|
|
docker manifest push ${IMAGE_NAME}:latest${TAG_SUFFIX}
|