diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml deleted file mode 100644 index 54bcee3..0000000 --- a/.github/workflows/docs.yaml +++ /dev/null @@ -1,31 +0,0 @@ -name: Documentation - -on: - push: - branches: - - 'main' - -jobs: - Documentation: - name: Generate and publish documentation - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - uses: erlef/setup-beam@v1 - with: - otp-version: 27 - rebar3-version: '3.23.0' - - - name: Change doc version to "Development branch" - run: sed -E -i -e 's/^@version.*/@version Development branch/' doc/overview.edoc - - - name: Generate - run: rebar3 edoc - - - name: Publish - uses: peaceiris/actions-gh-pages@v4 - if: ${{ github.ref == 'refs/heads/main' }} - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./doc diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml deleted file mode 100644 index c59b9a7..0000000 --- a/.github/workflows/release.yaml +++ /dev/null @@ -1,26 +0,0 @@ -name: Publish release - -on: - push: - tags: - - v0* - - v1* - - v2* - - v3* - - v4* - - v5* - - v6* - - v7* - - v8* - - v9* - -jobs: - Publish: - name: Publish release - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Publish to Hex.pm - uses: erlangpack/github-action@v3 - env: - HEX_API_KEY: ${{ secrets.HEX_API_KEY }} diff --git a/.github/workflows/test-and-release.yaml b/.github/workflows/test-and-release.yaml new file mode 100644 index 0000000..1333164 --- /dev/null +++ b/.github/workflows/test-and-release.yaml @@ -0,0 +1,136 @@ +name: Test → Docs → Release + +on: + - pull_request + - push + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + REBAR_VERSION: '3.23.0' + LATEST_ERLANG_VERSION: '27' + +jobs: + # `env_to_output` works around a limitation of GitHub Actions that prevents + # the use of environment variables in places such as a workflow call's `with` + # arguments. + # + # https://github.com/actions/runner/issues/1189#issuecomment-1832389701 + env_to_output: + name: Env. variable to outputs + runs-on: ubuntu-latest + outputs: + REBAR_VERSION: ${{ steps.from_env.outputs.REBAR_VERSION }} + steps: + - id: from_env + run: | + vars=" + REBAR_VERSION + " + setOutput() { + echo "${1}=${!1}" >> "${GITHUB_OUTPUT}" + } + for name in $vars; do + setOutput $name + done + + test: + name: Test + needs: env_to_output + uses: ./.github/workflows/test-job.yaml + with: + rebar_version: ${{ needs.env_to_output.outputs.REBAR_VERSION }} + secrets: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + dialyzer: + name: Dialyzer + runs-on: ubuntu-latest + needs: env_to_output + + steps: + - uses: actions/checkout@v4 + - uses: erlef/setup-beam@v1 + id: install-erlang + with: + otp-version: ${{ env.LATEST_ERLANG_VERSION }} + rebar3-version: ${{ env.REBAR_VERSION }} + + - name: Restore Dialyzer PLT files from cache + uses: actions/cache@v4 + with: + path: _build/*/rebar3_*_plt + key: dialyzer-plt-cache-${{ steps.install-erlang.outputs.otp-version }}-${{ runner.os }}-${{ hashFiles('rebar.config*') }}-v1 + + - name: Dialyzer + run: rebar3 clean && rebar3 as test dialyzer + + build_docs: + name: Generate docs + runs-on: ubuntu-latest + needs: + - test + - dialyzer + + steps: + - uses: actions/checkout@v4 + - uses: erlef/setup-beam@v1 + with: + otp-version: ${{ env.LATEST_ERLANG_VERSION }} + rebar3-version: ${{ env.REBAR_VERSION }} + + - name: Change doc version to "Development branch" + run: sed -E -i -e 's/^@version.*/@version Development branch/' doc/overview.edoc + + - name: Generate + run: rebar3 edoc + + - name: Ensure HTML files are there + run: ls -l doc && test -f doc/index.html + + - name: Upload docs for next job + uses: actions/upload-artifact@v4 + with: + name: docs_dir + path: ./doc + if-no-files-found: error + + publish_docs: + name: Publish docs + runs-on: ubuntu-latest + needs: build_docs + if: github.repository == 'rabbitmq/horus' && github.ref == 'refs/heads/main' + + steps: + - name: Download docs from previous job + uses: actions/download-artifact@v4 + with: + name: docs_dir + path: ./doc + + - name: Ensure HTML files are there + run: ls -l doc && test -f doc/index.html + + - name: Publish + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./doc + + publish_release: + name: Publish release + runs-on: ubuntu-latest + needs: + - test + - dialyzer + - build_docs + if: github.repository == 'rabbitmq/horus' && (startsWith(github.ref, 'refs/tags/v0') || startsWith(github.ref, 'refs/tags/v1') || startsWith(github.ref, 'refs/tags/v2') || startsWith(github.ref, 'refs/tags/v3') || startsWith(github.ref, 'refs/tags/v4') || startsWith(github.ref, 'refs/tags/v5') || startsWith(github.ref, 'refs/tags/v6') || startsWith(github.ref, 'refs/tags/v7') || startsWith(github.ref, 'refs/tags/v8') || startsWith(github.ref, 'refs/tags/v9')) + + steps: + - uses: actions/checkout@v4 + - name: Publish to Hex.pm + uses: erlangpack/github-action@v3 + env: + HEX_API_KEY: ${{ secrets.HEX_API_KEY }} diff --git a/.github/workflows/test-job.yaml b/.github/workflows/test-job.yaml new file mode 100644 index 0000000..7e7bbfa --- /dev/null +++ b/.github/workflows/test-job.yaml @@ -0,0 +1,51 @@ +name: Single test job + +on: + workflow_call: + inputs: + rebar_version: + required: true + type: string + secrets: + CODECOV_TOKEN: + required: true + +jobs: + test: + name: "Erlang/OTP ${{ matrix.otp_version }} + ${{ matrix.os }}" + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + otp_version: ['25', '26', '27'] + os: [ubuntu-latest, windows-latest] + + steps: + - uses: actions/checkout@v4 + - uses: erlef/setup-beam@v1 + id: install-erlang + with: + otp-version: ${{ matrix.otp_version }} + rebar3-version: ${{ inputs.rebar_version }} + + - name: Compile + run: rebar3 compile + + - name: Xref + run: rebar3 xref + - name: EUnit (unit tests) + run: env ERL_FLAGS='-enable-feature maybe_expr' rebar3 eunit --verbose --cover + - name: Common test (integration tests) + run: rebar3 ct --verbose --cover --sname ct + + - name: Generate code coverage report + run: rebar3 as test covertool generate + + - name: Upload code coverage to Codecov + uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: _build/test/covertool/horus.covertool.xml + flags: erlang-${{ matrix.otp_version }},os-${{ matrix.os }} + name: Erlang/OTP ${{ matrix.otp_version }} on ${{ matrix.os }} + verbose: true # optional (default = false) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml deleted file mode 100644 index 583659b..0000000 --- a/.github/workflows/test.yaml +++ /dev/null @@ -1,65 +0,0 @@ -name: Test - -on: - - pull_request - - push - -jobs: - Test: - name: Test on Erlang/OTP ${{ matrix.otp_version }} and ${{ matrix.os }} - runs-on: ${{ matrix.os }} - - strategy: - matrix: - otp_version: [24, 25, 26, 27] - os: [ubuntu-latest, windows-latest] - exclude: - # `ct_slave` fails to start Erlang nodes on Windows with Erlang 24. - - otp_version: 24 - os: windows-latest - # setup-beam currently hangs for 30+ minutes for Windows builds and - # Erlang/OTP 26.0. - - otp_version: 26 - os: windows-latest - - env: - RUN_DIALYZER_ON_OTP_RELEASE: 27 - - steps: - - uses: actions/checkout@v4 - - uses: erlef/setup-beam@v1 - id: install-erlang - with: - otp-version: ${{matrix.otp_version}} - rebar3-version: '3.23.0' - - - name: Restore Dialyzer PLT files from cache - uses: actions/cache@v4 - if: ${{ matrix.otp_version == env.RUN_DIALYZER_ON_OTP_RELEASE && matrix.os == 'ubuntu-latest' }} - with: - path: _build/*/rebar3_*_plt - key: dialyzer-plt-cache-${{ steps.install-erlang.outputs.otp-version }}-${{ runner.os }}-${{ hashFiles('rebar.config*') }}-v1 - - - name: Compile - run: rebar3 compile - - - name: Xref - run: rebar3 xref - - name: EUnit (unit tests) - run: env ERL_FLAGS='-enable-feature maybe_expr' rebar3 eunit --verbose --cover - - - name: Dialyzer - if: ${{ matrix.otp_version == env.RUN_DIALYZER_ON_OTP_RELEASE && matrix.os == 'ubuntu-latest' }} - run: rebar3 clean && rebar3 as test dialyzer - - - name: Generate code coverage report - run: rebar3 as test covertool generate - - - name: Upload code coverage to Codecov - uses: codecov/codecov-action@v4 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: _build/test/covertool/horus.covertool.xml - flags: erlang-${{ matrix.otp_version }},os-${{ matrix.os }} - name: Erlang/OTP ${{ matrix.otp_version }} on ${{ matrix.os }} - verbose: true # optional (default = false) diff --git a/rebar.config b/rebar.config index 32083e3..ce22cff 100644 --- a/rebar.config +++ b/rebar.config @@ -5,7 +5,7 @@ {project_plugins, [covertool, rebar3_hex, - {rebar3_edoc_extensions, "1.6.0"}]}. + {rebar3_edoc_extensions, "1.6.1"}]}. {erl_opts, [debug_info, warn_export_vars,