def
Hey folks!
Been through it all with elixir compilation. We were using Concourse for a bit, which allowed me to run images that had our application pre-compiled. I would rsync the files into the cloned branch, and only the changed files would compile.
For many reasons we moved to github actions, and since then I have been unable to create a setup that doesn’t compile/get dependencies every time. We also have issues with branches that change our structure.sql file, as the test runs depend on seeding a database, and new relations tend to not be applied unless we we “bust the cache” by incrementing a version number in the build cache string.
This all has created the headache of using up our minutes quite rapidly as our team (or a pull request) grows, and dipping deeply into our actions overage budget.
Below is part of a sample action
jobs:
ingest:
runs-on: ubuntu-18.04
services:
redis:
image: redis
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 6379:6379
postgres:
image: postgres:11.5
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
ports:
- 5432:5432
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
steps:
- uses: actions/checkout@v2
- name: Setup elixir
uses: erlef/setup-elixir@v1
with:
elixir-version: ${{ env.ELIXIR_VERSION }}
otp-version: ${{ env.OTP_VERSION }}
- name: Retrieve Mix Dependencies Cache
uses: actions/cache@v2
id: mix-cache
with:
path: backend/deps
key: ${{ env.OTP_VERSION }}-${{ env.ELIXIR_VERSION }}-test-deps-cache-{{ hashFiles('**/mix.lock') }}
restore-keys: |
${{ env.OTP_VERSION }}-${{ env.ELIXIR_VERSION }}-test-deps-cache-
- name: Retrieve Build Cache
uses: actions/cache@v2
id: build-cache
with:
path: backend/_build/**
key: ${{ env.OTP_VERSION }}-${{ env.ELIXIR_VERSION }}-app-build-cache-v5-${{ hashFiles('**/mix.lock','**/structure.sql') }}
restore-keys: |
${{ env.OTP_VERSION }}-${{ env.ELIXIR_VERSION }}-app-build-cache-v5-
- name: Install Mix Dependencies
run: |
cd backend/
mix local.rebar --force
mix local.hex --force
MIX_ENV=test mix deps.get
- name: Compile Dependencies
if: steps.build-cache.outputs.cache-hit != 'true'
run: |
cd backend
MIX_ENV=test mix compile
- name: Run Tests
run: |
cd backend/
MIX_ENV=test mix ecto.reset
mix cmd --app app mix test --color
Other examples I’ve found around the forums don’t seem to improve anything.
Does anything stand out here? How can I make these not get deps/compile on every run?
Finally, we also split our tests up so that each have their own actions file. If a PR is open and X app has files changed, the related action runs. If multiple apps have changes, those tests run. Our main package, all of the tests run. Is there possibly a way for a PR to not run all of these tests if a subsequent commit to that PR doesn’t change the apps that have already been tested?
Happy to share more details/clarify, apologies for any longwindedness or confusion.
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #ai
- #elixirconf-us
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming










Showing Posts 4 to 1- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
begedin
The following combination of steps ensures there is no recompilation happening in my case
I also had the two caches combined into one in the past, which worked just as well.
Note that I also do a
--warnings-as-errorshere for an additional check.The differences to your setup that I’m seeing are,
_build, not_build/**def
Thanks for your input, we still end up compiling our applications on every run.
dimitarvp
Probably try replacing that with
uses: erlef/setup-beam@v1? That’s the only thing that kind of stands out to me because in our projects that’s what we use for our GitHub actions setup.def
Just as a note, we have 35 test actions / 24 apps in an umbrella, hence the complicated actions setup. Perhaps a root of some of our problems.