diff --git a/.credo.exs b/.credo.exs index b2bc820..c8cec3f 100644 --- a/.credo.exs +++ b/.credo.exs @@ -23,7 +23,7 @@ # You can give explicit globs or simply directories. # In the latter case `**/*.{ex,exs}` will be used. # - included: ["lib/", "priv/", "test/"], + included: ["config/", "lib/", "priv/", "test/"], excluded: [~r"/_build/", ~r"/deps/", ~r"/node_modules/"] }, # @@ -119,7 +119,8 @@ [ order: ~w(moduledoc behaviour use import require alias module_attribute defstruct callback macrocallback optional_callback)a, - ignore: [:type] + ignore: [:type], + ignore_module_attributes: [:contract, :decorate, :operation, :trace] ]}, {Credo.Check.Readability.StringSigils, []}, {Credo.Check.Readability.TrailingBlankLine, []}, diff --git a/.formatter.exs b/.formatter.exs index 37d594a..1a8ccc2 100644 --- a/.formatter.exs +++ b/.formatter.exs @@ -1,6 +1,7 @@ -# Used by "mix format" +# This file is synced with stordco/common-config-elixir. Any changes will be overwritten. + [ - import_deps: [:ecto], + import_deps: [:ecto, :ecto_sql], inputs: ["*.{heex,ex,exs}", "{config,lib,priv,test}/**/*.{heex,ex,exs}"], line_length: 120, plugins: [] diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..ef5b36c --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,25 @@ +## Related Ticket(s) + + + +## Checklist + + + +- [ ] Code conforms to the [Elixir Styleguide](https://github.com/christopheradams/elixir_style_guide) + +## Problem + + + +## Details + + diff --git a/.release-please-config.json b/.github/release-please-config.json similarity index 100% rename from .release-please-config.json rename to .github/release-please-config.json diff --git a/.release-please-manifest.json b/.github/release-please-manifest.json similarity index 100% rename from .release-please-manifest.json rename to .github/release-please-manifest.json diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c5ca5e4..53822ea 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -12,6 +12,7 @@ on: push: branches: - main + - code-freeze/** workflow_call: secrets: CI_SERVICE_KEY: @@ -27,7 +28,53 @@ concurrency: cancel-in-progress: true jobs: + Changed: + name: Changed Files + runs-on: ubuntu-latest + + outputs: + database: ${{ steps.changed.outputs.database_any_changed }} + docker: ${{ steps.changed.outputs.docker_any_changed }} + elixir: ${{ steps.changed.outputs.elixir_any_changed }} + helm: ${{ steps.changed.outputs.helm_any_changed }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - id: changed + name: Get Changed Files + uses: tj-actions/changed-files@v43 + with: + files_yaml: | + database: + - '.github/workflows/ci.yaml' + - 'priv/*repo/**' + docker: + - '.github/workflows/ci.yaml' + - 'Dockerfile' + documentation: + - 'priv/documentation/**' + - '**.ex' + - '**.md' + elixir: + - '.github/workflows/ci.yaml' + - '.tool-versions' + - 'priv/**' + - '**.ex' + - '**.exs' + - '**.heex' + helm: + - '.github/workflows/ci.yaml' + - '.github/workflows/staging.yaml' + - '.github/workflows/production.yaml' + - 'helm/**' + Credo: + if: ${{ !startsWith(github.head_ref, 'release-please--branches') && needs.Changed.outputs.elixir == 'true' }} + needs: [Changed] runs-on: ubuntu-latest steps: @@ -46,6 +93,8 @@ jobs: run: mix credo --strict Dependencies: + if: ${{ !startsWith(github.head_ref, 'release-please--branches') && needs.Changed.outputs.elixir == 'true' }} + needs: [Changed] runs-on: ubuntu-latest steps: @@ -64,6 +113,8 @@ jobs: run: mix deps.unlock --check-unused Dialyzer: + if: ${{ !startsWith(github.head_ref, 'release-please--branches') && needs.Changed.outputs.elixir == 'true' }} + needs: [Changed] runs-on: ubuntu-latest steps: @@ -82,6 +133,8 @@ jobs: run: mix dialyzer --format github Documentation: + if: ${{ !startsWith(github.head_ref, 'release-please--branches') && needs.Changed.outputs.documentation == 'true' }} + needs: [Changed] runs-on: ubuntu-latest steps: @@ -100,6 +153,8 @@ jobs: run: mix docs Format: + if: ${{ !startsWith(github.head_ref, 'release-please--branches') && needs.Changed.outputs.elixir == 'true' }} + needs: [Changed] runs-on: ubuntu-latest steps: @@ -117,6 +172,39 @@ jobs: - name: Format run: mix format --check-formatted + Seed: + if: ${{ !startsWith(github.head_ref, 'release-please--branches') && needs.Changed.outputs.database == 'true' }} + needs: [Changed] + runs-on: ubuntu-latest + + env: + MIX_ENV: test + + services: + postgres: + image: postgres:14-alpine + ports: + - 5432:5432 + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_INITDB_ARGS: "--nosync" + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Elixir + uses: stordco/actions-elixir/setup@v1 + with: + github-token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} + hex-token: ${{ secrets.HEX_API_KEY }} + oban-fingerprint: ${{ secrets.OBAN_KEY_FINGERPRINT }} + oban-token: ${{ secrets.OBAN_LICENSE_KEY }} + + - name: Seed + run: mix ecto.setup + Test: name: Test (Elixir ${{ matrix.versions.elixir }} OTP ${{ matrix.versions.otp }}) @@ -167,3 +255,4 @@ jobs: otp: 25 - elixir: 1.15 otp: 26 + diff --git a/.github/workflows/common-config-elixir.yaml b/.github/workflows/common-config-elixir.yaml index c38376c..bf557a8 100644 --- a/.github/workflows/common-config-elixir.yaml +++ b/.github/workflows/common-config-elixir.yaml @@ -27,16 +27,18 @@ jobs: persist-credentials: true - name: Setup Node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 - name: Setup Elixir uses: stordco/actions-elixir/setup@v1 with: + elixir-version: "1.15" github-token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} hex-token: ${{ secrets.HEX_API_KEY }} - elixir-version: "1.15" + oban-fingerprint: ${{ secrets.OBAN_KEY_FINGERPRINT }} + oban-token: ${{ secrets.OBAN_LICENSE_KEY }} otp-version: "26.0" - name: Sync diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 993200f..13c604c 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -19,15 +19,31 @@ jobs: steps: - name: Check - uses: stordco/actions-pr-title@v1.0.0 + uses: actions/github-script@v7 with: - regex: '^(feat!|fix!|fix|feat|chore|(fix|feat|chore)\(\w.*\)):\s(\[\w{1,8}-\d{1,8}\]|.*).*' - hint: | - Your PR title does not match the Stord common convention. Please rename your PR to match one of the following formats: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const title = context.payload?.pull_request?.title; - chore: a small insignificant change - fix: [JIRA-1234] fix an existing feature - feat: [JIRA-1234] a new feature to release - feat!: a breaking change + if (typeof title !== 'string') { + core.info("Pull request data not in payload. Skipping PR title check."); + return; + } - Note: Adding ! (i.e. `feat!:`) represents a breaking change and will result in a SemVer major release. + const REGEX = /^(feat!|fix!|fix|feat|chore|(fix|feat|chore)\(\w.*\)):\s(\[\w{1,8}-\d{1,8}\]|.*).*/; + + if (!REGEX.test(title)) { + core.setFailed("Pull request title does not follow conventional commits"); + console.log(` + Pull Request title "${title}" does not follow our [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) naming scheme. + + Please try renaming the PR to match one of these examples: + + chore: a small insignificant change + fix: [JIRA-1234] fix an existing feature + feat: [JIRA-1234] a new feature to release + feat!: a breaking change + + Note: Adding ! (i.e. \`feat!:\`) represents a breaking change and will result in a SemVer major release. + `.trim()); + } diff --git a/.github/workflows/production.yaml b/.github/workflows/production.yaml index 12941f5..7397623 100644 --- a/.github/workflows/production.yaml +++ b/.github/workflows/production.yaml @@ -35,3 +35,4 @@ jobs: run: mix hex.publish --yes env: HEX_API_KEY: ${{ secrets.HEX_API_KEY }} + diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 0644819..8d1a041 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -7,6 +7,10 @@ on: branches: - main +concurrency: + group: release + cancel-in-progress: false + jobs: Please: runs-on: ubuntu-latest @@ -14,10 +18,9 @@ jobs: steps: - id: release name: Release - uses: google-github-actions/release-please-action@v3 + uses: googleapis/release-please-action@v4 with: - command: manifest - config-file: .release-please-config.json - manifest-file: .release-please-manifest.json - release-type: elixir + config-file: .github/release-please-config.json + manifest-file: .github/release-please-manifest.json + target-branch: main token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} diff --git a/.github/workflows/staging.yaml b/.github/workflows/staging.yaml index c8d3dd6..4c6eb69 100644 --- a/.github/workflows/staging.yaml +++ b/.github/workflows/staging.yaml @@ -6,6 +6,7 @@ on: push: branches: - main + - code-freeze/** workflow_dispatch: concurrency: @@ -18,6 +19,7 @@ jobs: url: https://paginator.stord.engineering permissions: + actions: read contents: read id-token: write pages: write @@ -36,16 +38,17 @@ jobs: oban-fingerprint: ${{ secrets.OBAN_KEY_FINGERPRINT }} oban-token: ${{ secrets.OBAN_LICENSE_KEY }} - - name: Build + - name: Docs run: mix docs - name: Set CNAME run: echo "paginator.stord.engineering" > ./doc/CNAME - name: Upload Artifacts - uses: actions/upload-pages-artifact@v2 + uses: actions/upload-pages-artifact@v3 with: path: ./doc - name: Deploy - uses: actions/deploy-pages@v2 + uses: actions/deploy-pages@v4 +