Skip to content

Instantly share code, notes, and snippets.

@cloud8421
Created December 19, 2024 12:57
Show Gist options
  • Save cloud8421/069f7fa4663cb739df9ebf5820a0aee4 to your computer and use it in GitHub Desktop.
Save cloud8421/069f7fa4663cb739df9ebf5820a0aee4 to your computer and use it in GitHub Desktop.
GitHub CI with Fly deploy
name: Test & Deploy
on: push
jobs:
test:
name: Test
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: erlef/setup-beam@v1
with:
version-type: strict
version-file: .tool-versions
- name: Cache deps
id: cache-deps
uses: actions/cache@v4
env:
cache-name: cache-elixir-deps
with:
path: deps
key: ${{ runner.os }}-mix-${{ env.cache-name }}-${{ hashFiles('**/mix.lock') }}
restore-keys: |
${{ runner.os }}-mix-${{ env.cache-name }}-
# Step: Define how to cache the `_build` directory. After the first run,
# this speeds up tests runs a lot. This includes not re-compiling our
# project's downloaded deps every run.
- name: Cache compiled build
id: cache-build
uses: actions/cache@v4
env:
cache-name: cache-compiled-build
with:
path: _build
key: ${{ runner.os }}-mix-${{ env.cache-name }}-${{ hashFiles('**/mix.lock') }}
restore-keys: |
${{ runner.os }}-mix-${{ env.cache-name }}-
${{ runner.os }}-mix-
# Step: Conditionally bust the cache when job is re-run.
# Sometimes, we may have issues with incremental builds that are fixed by
# doing a full recompile. In order to not waste dev time on such trivial
# issues (while also reaping the time savings of incremental builds for
# *most* day-to-day development), force a full recompile only on builds
# that are retried.
- name: Clean to rule out incremental build as a source of flakiness
if: github.run_attempt != '1'
run: |
mix deps.clean --all
mix clean
shell: sh
- run: mix deps.get
- run: mix gettext.extract --check-up-to-date
- run: mix format --check-formatted
- run: mix test
deploy:
name: Deploy
needs: test
runs-on: ubuntu-24.04
environment: production
if: github.ref == 'refs/heads/main'
concurrency: deploy-group # optional: ensure only one action runs at a time
steps:
- uses: actions/checkout@v4
- uses: superfly/flyctl-actions/setup-flyctl@master
- run: flyctl deploy --remote-only
env:
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment