I came up with a workflow that uses s3 to cache between branches
###################################################################
# Sample Github workflow to cache deps/ and _build/ in S3
# between branches
###################################################################
# S3 credentials needed (define these as Github secrets)
# - AWS_ACCESS_KEY_ID
# - AWS_SECRET_ACCESS_KEY
# - BUILD_BUCKET
#
# If you have private Git repos, you need to add a private key to the repo
# - HEADLESS_PRIV
name: Test
on:
pull_request:
branches:
- develop
paths-ignore:
- 'docs/**'
- '*.md'
jobs:
test:
name: Tests
runs-on: ubuntu-18.04
env:
MIX_ENV: test
services:
db:
image: postgres:11
ports: ['5432:5432']
env:
POSTGRES_PASSWORD: postgres
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v2
- uses: erlef/setup-elixir@v1
with:
otp-version: '23.1.2'
elixir-version: '1.11.2'
- name: Configure SSH for private Repos
uses: webfactory/ssh-agent@v0.4.1
with:
ssh-private-key: ${{ secrets.HEADLESS_PRIV }}
- name: Restore Dependencies from S3 (if present)
id: restore-deps-cache
run: '(aws s3 ls s3://${{ secrets.BUILD_BUCKET }}/some-dir/deps.tar && aws s3 cp s3://${{ secrets.BUILD_BUCKET }}/some-dir/deps.tar deps.tar) || echo deps.tar not found on S3, skipping step'
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: 'us-east-1'
- name: Restore Build from S3 (if present)
id: restore-build-cache
run: '(aws s3 ls s3://${{ secrets.BUILD_BUCKET }}/some-dir/_build.tar && aws s3 cp s3://${{ secrets.BUILD_BUCKET }}/some-dir/_build.tar _build.tar) || echo _build.tar not found on S3, skipping step'
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: 'us-east-1'
- name: 'Untar deps.tar (if present)'
run: '(test -f deps.tar && tar -xvf deps.tar) || echo deps.tar not found, skipping step'
- name: 'Untar _build.tar (if present)'
run: '(test -f _build.tar && tar -xvf _build.tar) || echo _build.tar not found, skipping step'
- name: Get dependencies
run: |
mix local.hex --force
mix local.rebar
mix deps.get
- name: Compile
run: mix compile
- name: Create database
run: mix ecto.create
- name: Migrate database
run: mix ecto.migrate
- name: Test
run: mix test
- name: 'Tar deps'
run: sudo tar -cvf deps.tar deps
- name: 'Tar _build'
run: sudo tar -cvf _build.tar _build
- name: Cache Dependencies to S3
id: deps-cache
run: '(test -f deps.tar && aws s3 cp deps.tar s3://${{ secrets.BUILD_BUCKET }}/some-dir/deps.tar) || echo deps.tar not found locally, skipping step'
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: 'us-east-1'
- name: Cache Build to S3
id: build-cache
run: '(test -f _build.tar && aws s3 cp _build.tar s3://${{ secrets.BUILD_BUCKET }}/some-dir/_build.tar) || echo _build.tar not found locally, skipping step'
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: 'us-east-1'


















