diff --git a/.github/github_workflows.ex b/.github/github_workflows.ex index 01f65100..6bbbebdf 100644 --- a/.github/github_workflows.ex +++ b/.github/github_workflows.ex @@ -4,13 +4,26 @@ defmodule GithubWorkflows do See https://hexdocs.pm/github_workflows_generator. """ + # App and environment configuration @app_name_prefix "phx-tools" @environment_name "pr-${{ github.event.number }}" @preview_app_name "#{@app_name_prefix}-#{@environment_name}" @preview_app_host "#{@preview_app_name}.fly.dev" @repo_name "phx_tools" + + # Test configuration @shells ["bash", "fish", "zsh"] + # Cache configuration + @cache_key_prefix_prefix "${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}" + @mix_cache_key_prefix "#{@cache_key_prefix_prefix}-mix" + @mix_cache_path ~S""" + _build + deps + """ + @plt_cache_key_prefix "#{@cache_key_prefix_prefix}-plt" + @plt_cache_path "priv/plts" + def get do %{ "main.yml" => main_workflow(), @@ -100,6 +113,11 @@ defmodule GithubWorkflows do name: "Compile", env: [MIX_ENV: "test"], run: "mix compile" + ], + [ + name: "Save dependencies cache", + uses: "actions/cache/save@v4", + with: save_cache_opts(@mix_cache_key_prefix, @mix_cache_path) ] ] ) @@ -219,19 +237,13 @@ defmodule GithubWorkflows do end defp dialyzer_job do - cache_key_prefix = - "${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-plt" - elixir_job("Dialyzer", needs: :compile, steps: [ [ name: "Restore PLT cache", - uses: "actions/cache@v3", - with: - [ - path: "priv/plts" - ] ++ cache_opts(cache_key_prefix) + uses: "actions/cache/restore@v4", + with: cache_opts(@plt_cache_key_prefix, @plt_cache_path) ], [ name: "Create PLTs", @@ -242,6 +254,11 @@ defmodule GithubWorkflows do name: "Run dialyzer", env: [MIX_ENV: "test"], run: "mix dialyzer" + ], + [ + name: "Save PLT cache", + uses: "actions/cache/save@v4", + with: save_cache_opts(@plt_cache_key_prefix, @plt_cache_path) ] ] ) @@ -251,9 +268,6 @@ defmodule GithubWorkflows do needs = Keyword.get(opts, :needs) steps = Keyword.get(opts, :steps, []) - cache_key_prefix = - "${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix" - job = [ name: name, "runs-on": "ubuntu-latest", @@ -270,14 +284,9 @@ defmodule GithubWorkflows do ] ], [ - uses: "actions/cache@v3", - with: - [ - path: ~S""" - _build - deps - """ - ] ++ cache_opts(cache_key_prefix) + name: "Restore dependencies cache", + uses: "actions/cache/restore@v4", + with: cache_opts(@mix_cache_key_prefix, @mix_cache_path) ] ] ++ steps ] @@ -323,7 +332,7 @@ defmodule GithubWorkflows do checkout_step(), [ name: "Restore npm cache", - uses: "actions/cache@v3", + uses: "actions/cache/restore@v4", id: "npm-cache", with: [ path: "node_modules", @@ -338,6 +347,14 @@ defmodule GithubWorkflows do [ name: "Run Prettier", run: "npx prettier -c ." + ], + [ + name: "Save npm cache", + uses: "actions/cache/save@v4", + with: [ + path: "node_modules", + key: "${{ runner.os }}-prettier" + ] ] ] ] @@ -521,15 +538,23 @@ defmodule GithubWorkflows do ] end - defp cache_opts(prefix) do + defp cache_opts(prefix, path) do [ key: "#{prefix}-${{ github.sha }}", + path: path, "restore-keys": ~s""" #{prefix}- """ ] end + defp save_cache_opts(prefix, path) do + [ + key: "#{prefix}-${{ github.sha }}", + path: path + ] + end + defp fly_env do [ FLY_API_TOKEN: "${{ secrets.FLY_API_TOKEN }}", diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3ac33b65..2fe12821 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -18,12 +18,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Install Elixir dependencies @@ -34,6 +35,13 @@ jobs: env: MIX_ENV: test run: mix compile + - name: Save dependencies cache + uses: actions/cache/save@v4 + with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} + path: | + _build + deps credo: needs: compile name: Credo @@ -47,12 +55,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Check code style @@ -72,12 +81,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Check for vulnerable Mix dependencies @@ -97,19 +107,20 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Restore PLT cache - uses: actions/cache@v3 + uses: actions/cache/restore@v4 with: - path: priv/plts key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-plt-${{ github.sha }} + path: priv/plts restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-plt- - name: Create PLTs @@ -120,6 +131,11 @@ jobs: env: MIX_ENV: test run: mix dialyzer + - name: Save PLT cache + uses: actions/cache/save@v4 + with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-plt-${{ github.sha }} + path: priv/plts format: needs: compile name: Format @@ -133,12 +149,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Check Elixir formatting @@ -158,12 +175,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Check for retired Hex packages @@ -177,7 +195,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Restore npm cache - uses: actions/cache@v3 + uses: actions/cache/restore@v4 id: npm-cache with: path: node_modules @@ -187,6 +205,11 @@ jobs: run: npm i -D prettier prettier-plugin-toml - name: Run Prettier run: npx prettier -c . + - name: Save npm cache + uses: actions/cache/save@v4 + with: + path: node_modules + key: ${{ runner.os }}-prettier sobelow: needs: compile name: Security check @@ -200,12 +223,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Check for security issues using sobelow @@ -225,12 +249,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Run tests @@ -250,12 +275,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Check for unused Mix dependencies diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index ae8bcd6a..62592f86 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -22,12 +22,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Install Elixir dependencies @@ -38,6 +39,13 @@ jobs: env: MIX_ENV: test run: mix compile + - name: Save dependencies cache + uses: actions/cache/save@v4 + with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} + path: | + _build + deps credo: needs: compile name: Credo @@ -51,12 +59,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Check code style @@ -76,12 +85,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Check for vulnerable Mix dependencies @@ -101,19 +111,20 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Restore PLT cache - uses: actions/cache@v3 + uses: actions/cache/restore@v4 with: - path: priv/plts key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-plt-${{ github.sha }} + path: priv/plts restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-plt- - name: Create PLTs @@ -124,6 +135,11 @@ jobs: env: MIX_ENV: test run: mix dialyzer + - name: Save PLT cache + uses: actions/cache/save@v4 + with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-plt-${{ github.sha }} + path: priv/plts format: needs: compile name: Format @@ -137,12 +153,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Check Elixir formatting @@ -162,12 +179,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Check for retired Hex packages @@ -181,7 +199,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Restore npm cache - uses: actions/cache@v3 + uses: actions/cache/restore@v4 id: npm-cache with: path: node_modules @@ -191,6 +209,11 @@ jobs: run: npm i -D prettier prettier-plugin-toml - name: Run Prettier run: npx prettier -c . + - name: Save npm cache + uses: actions/cache/save@v4 + with: + path: node_modules + key: ${{ runner.os }}-prettier sobelow: needs: compile name: Security check @@ -204,12 +227,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Check for security issues using sobelow @@ -229,12 +253,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Run tests @@ -254,12 +279,13 @@ jobs: with: version-file: .tool-versions version-type: strict - - uses: actions/cache@v3 + - name: Restore dependencies cache + uses: actions/cache/restore@v4 with: + key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} path: | _build deps - key: ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ steps.setup-beam.outputs.elixir-version }}-${{ steps.setup-beam.outputs.otp-version }}-mix- - name: Check for unused Mix dependencies