From ecd856c2602bbd0e7cb512e20c5ada42cb992644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Marcos=20P=2E=20Bezerra?= Date: Sun, 17 Nov 2024 20:18:15 -0300 Subject: [PATCH] CI: refac: make workflows reusable --- .github/workflows/all-tests-slow.yml | 17 ++ .../build-artifacts-and-run-tests.yml | 146 ++++++++++++++++ .../draft-release-automatic-trigger.yml | 35 ++++ ...e.yml => draft-release-manual-trigger.yml} | 6 +- .github/workflows/pr-workflow.yml | 162 +----------------- 5 files changed, 208 insertions(+), 158 deletions(-) create mode 100644 .github/workflows/all-tests-slow.yml create mode 100644 .github/workflows/build-artifacts-and-run-tests.yml create mode 100644 .github/workflows/draft-release-automatic-trigger.yml rename .github/workflows/{manual-trigger-draft-release.yml => draft-release-manual-trigger.yml} (78%) diff --git a/.github/workflows/all-tests-slow.yml b/.github/workflows/all-tests-slow.yml new file mode 100644 index 00000000..cd65f86b --- /dev/null +++ b/.github/workflows/all-tests-slow.yml @@ -0,0 +1,17 @@ +name: Run tests for all combinations + +on: + schedule: + - cron: "0 0 1,15 * *" # biweekly + push: + branches: + - main + paths-ignore: + - "*.md" + +jobs: + run-tests-for-all-combinations: + uses: ouch-org/ouch/.github/workflows/build-artifacts-and-run-tests.yml@latest + with: + matrix_all_combinations: true + upload_artifacts: false diff --git a/.github/workflows/build-artifacts-and-run-tests.yml b/.github/workflows/build-artifacts-and-run-tests.yml new file mode 100644 index 00000000..788c7a1c --- /dev/null +++ b/.github/workflows/build-artifacts-and-run-tests.yml @@ -0,0 +1,146 @@ +# This is a reusable workflow + +name: Build artifacts and run tests + +on: + workflow_dispatch: + inputs: + matrix_all_combinations: + description: "if matrix should have all combinations of targets and features" + type: boolean + required: true + default: true + upload_artifacts: + description: "if built artifacts should be uploaded" + type: boolean + required: true + default: true + workflow_call: + inputs: + matrix_all_combinations: + description: "if matrix should have all combinations of targets and features" + type: boolean + required: true + upload_artifacts: + description: "if built artifacts should be uploaded" + type: boolean + required: true + +jobs: + build-artifacts-and-run-tests: + runs-on: ${{ matrix.os || 'ubuntu-latest' }} + env: + CARGO: cargo + strategy: + fail-fast: false + matrix: + feature-unrar: ${{ inputs.matrix_all_combinations && fromJSON('[true, false]') || fromJSON('[false]')}} + feature-use-zlib: ${{ inputs.matrix_all_combinations && fromJSON('[true, false]') || fromJSON('[false]')}} + feature-use-zstd-thin: ${{ inputs.matrix_all_combinations && fromJSON('[true, false]') || fromJSON('[false]')}} + target: + # native + - x86_64-unknown-linux-gnu + - x86_64-pc-windows-gnu + - x86_64-pc-windows-msvc + - aarch64-pc-windows-msvc + - x86_64-apple-darwin + # cross + - x86_64-unknown-linux-musl + - aarch64-unknown-linux-gnu + - aarch64-unknown-linux-musl + - armv7-unknown-linux-gnueabihf + - armv7-unknown-linux-musleabihf + + include: + # runner overrides + - target: x86_64-pc-windows-gnu + os: windows-latest + - target: x86_64-pc-windows-msvc + os: windows-latest + - target: aarch64-pc-windows-msvc + os: windows-latest + - target: x86_64-apple-darwin + os: macos-latest + # targets that use cross + - target: x86_64-unknown-linux-musl + use-cross: true + - target: aarch64-unknown-linux-gnu + use-cross: true + - target: aarch64-unknown-linux-musl + use-cross: true + - target: armv7-unknown-linux-gnueabihf + use-cross: true + - target: armv7-unknown-linux-musleabihf + use-cross: true + # features (unless `matrix_all_combinations` is true, we only run these on linux-gnu) + - feature-unrar: true + target: x86_64-unknown-linux-gnu + - feature-use-zlib: true + target: x86_64-unknown-linux-gnu + - feature-use-zstd-thin: true + target: x86_64-unknown-linux-gnu + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install cross + if: matrix.use-cross + run: | + pushd "$(mktemp -d)" + wget https://github.com/cross-rs/cross/releases/download/v0.2.4/cross-x86_64-unknown-linux-musl.tar.gz + tar xf cross-x86_64-unknown-linux-musl.tar.gz + cp cross ~/.cargo/bin + popd + echo CARGO=cross >> $GITHUB_ENV + + - name: Concatenate features + id: concat-features + shell: bash + run: | + FEATURES=() + if [[ "${{ matrix.feature-use-zlib }}" == true ]]; then FEATURES+=(use_zlib); fi + if [[ "${{ matrix.feature-use-zstd-thin }}" == true ]]; then FEATURES+=(use_zstd_thin); fi + if [[ "${{ matrix.feature-unrar }}" == true ]]; then FEATURES+=(unrar); fi + IFS=',' + echo "FEATURES=${FEATURES[*]}" >> $GITHUB_OUTPUT + + - name: Set up extra cargo flags + env: + FEATURES: ${{steps.concat-features.outputs.FEATURES}} + shell: bash + run: | + FLAGS="--no-default-features" + if [[ -n "$FEATURES" ]]; then FLAGS+=" --features $FEATURES"; fi + echo "EXTRA_CARGO_FLAGS=$FLAGS" >> $GITHUB_ENV + + - name: Install Rust + run: | + rustup toolchain install stable nightly --profile minimal -t ${{ matrix.target }} + + - uses: Swatinem/rust-cache@v2 + with: + key: "${{ matrix.target }}-${{ matrix.feature-unrar }}-${{ matrix.feature-use-zstd-thin }}-${{ matrix.feature-unrar }}" + + - name: Test on stable + # there's no way to run tests for ARM64 Windows for now + if: matrix.target != 'aarch64-pc-windows-msvc' + run: | + ${{ env.CARGO }} +stable test --target ${{ matrix.target }} $EXTRA_CARGO_FLAGS + + - name: Release on nightly + run: | + ${{ env.CARGO }} +nightly build --release --target ${{ matrix.target }} $EXTRA_CARGO_FLAGS + env: + OUCH_ARTIFACTS_FOLDER: artifacts + RUSTFLAGS: -C strip=symbols + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + if: ${{ inputs.upload_artifacts }} + with: + name: ouch-${{ matrix.target }}-${{ steps.concat-features.outputs.FEATURES }} + path: | + target/${{ matrix.target }}/release/ouch + target/${{ matrix.target }}/release/ouch.exe + artifacts/ diff --git a/.github/workflows/draft-release-automatic-trigger.yml b/.github/workflows/draft-release-automatic-trigger.yml new file mode 100644 index 00000000..4e711b43 --- /dev/null +++ b/.github/workflows/draft-release-automatic-trigger.yml @@ -0,0 +1,35 @@ +name: Automatic trigger draft release + +on: + push: + tags: + - "[0-9]+.[0-9]+.[0-9]+" + +jobs: + call-workflow-build-artifacts-and-run-tests: + uses: ouch-org/ouch/.github/workflows/build-artifacts-and-run-tests.yml@latest + with: + matrix_all_combinations: true + upload_artifacts: true + + automated-draft-release: + runs-on: ubuntu-latest + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') + needs: build-artifacts-and-run-tests + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Download artifacts + uses: dawidd6/action-download-artifact@v3 + with: + path: artifacts + + - name: Package release assets + run: scripts/package-release-assets.sh + + - name: Create release + uses: softprops/action-gh-release@v2 + with: + draft: true + files: release/ouch-* diff --git a/.github/workflows/manual-trigger-draft-release.yml b/.github/workflows/draft-release-manual-trigger.yml similarity index 78% rename from .github/workflows/manual-trigger-draft-release.yml rename to .github/workflows/draft-release-manual-trigger.yml index 530018f7..6e296feb 100644 --- a/.github/workflows/manual-trigger-draft-release.yml +++ b/.github/workflows/draft-release-manual-trigger.yml @@ -1,8 +1,4 @@ -# we have two workflows for releases, this is the manual one to be triggered -# in the Actions tab in the repository -# -# the automatic one runs in another workflow and checks for tag pushes -name: manual-trigger-draft-release +name: Manual trigger draft release on: workflow_dispatch: diff --git a/.github/workflows/pr-workflow.yml b/.github/workflows/pr-workflow.yml index ead467d8..2f50b5ae 100644 --- a/.github/workflows/pr-workflow.yml +++ b/.github/workflows/pr-workflow.yml @@ -1,33 +1,11 @@ name: PR workflow on: - push: - branches: - - main - tags: - - "[0-9]+.[0-9]+.[0-9]+" pull_request: paths-ignore: - "*.md" - workflow_call: - inputs: - matrix_all_combinations: - description: "if matrix should have all combinations of targets and features" - type: boolean - required: true jobs: - clippy-checks: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: "Cargo: clippy" - run: | - rustup toolchain install stable --profile minimal -c clippy - cargo +stable clippy -- -D warnings - rustfmt-check: runs-on: ubuntu-latest steps: @@ -39,141 +17,19 @@ jobs: rustup toolchain install nightly --profile minimal -c rustfmt cargo +nightly fmt -- --check - automated-draft-release: + clippy-checks: runs-on: ubuntu-latest - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') - needs: build-artifacts-and-run-tests steps: - name: Checkout uses: actions/checkout@v4 - - name: Download artifacts - uses: dawidd6/action-download-artifact@v3 - with: - path: artifacts - - - name: Package release assets - run: scripts/package-release-assets.sh - - - name: Create release - uses: softprops/action-gh-release@v2 - with: - draft: true - files: release/ouch-* - - build-artifacts-and-run-tests: - runs-on: ${{ matrix.os || 'ubuntu-latest' }} - env: - CARGO: cargo - strategy: - fail-fast: false - matrix: - feature-unrar: ${{ inputs.matrix_all_combinations && fromJSON('[true, false]') || fromJSON('[false]')}} - feature-use-zlib: ${{ inputs.matrix_all_combinations && fromJSON('[true, false]') || fromJSON('[false]')}} - feature-use-zstd-thin: ${{ inputs.matrix_all_combinations && fromJSON('[true, false]') || fromJSON('[false]')}} - target: - # native - - x86_64-unknown-linux-gnu - - x86_64-pc-windows-gnu - - x86_64-pc-windows-msvc - - aarch64-pc-windows-msvc - - x86_64-apple-darwin - # cross - - x86_64-unknown-linux-musl - - aarch64-unknown-linux-gnu - - aarch64-unknown-linux-musl - - armv7-unknown-linux-gnueabihf - - armv7-unknown-linux-musleabihf - - include: - # runner overrides - - target: x86_64-pc-windows-gnu - os: windows-latest - - target: x86_64-pc-windows-msvc - os: windows-latest - - target: aarch64-pc-windows-msvc - os: windows-latest - - target: x86_64-apple-darwin - os: macos-latest - # targets that use cross - - target: x86_64-unknown-linux-musl - use-cross: true - - target: aarch64-unknown-linux-gnu - use-cross: true - - target: aarch64-unknown-linux-musl - use-cross: true - - target: armv7-unknown-linux-gnueabihf - use-cross: true - - target: armv7-unknown-linux-musleabihf - use-cross: true - # features (unless `matrix_all_combinations` is true, we only run these on linux-gnu) - - feature-use-zlib: true - target: x86_64-unknown-linux-gnu - - feature-use-zstd-thin: true - target: x86_64-unknown-linux-gnu - - feature-unrar: true - target: x86_64-unknown-linux-gnu - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install cross - if: matrix.use-cross - run: | - pushd "$(mktemp -d)" - wget https://github.com/cross-rs/cross/releases/download/v0.2.4/cross-x86_64-unknown-linux-musl.tar.gz - tar xf cross-x86_64-unknown-linux-musl.tar.gz - cp cross ~/.cargo/bin - popd - echo CARGO=cross >> $GITHUB_ENV - - - name: Concatenate features - id: concat-features - shell: bash - run: | - FEATURES=() - if [[ "${{ matrix.feature-use-zlib }}" == true ]]; then FEATURES+=(use_zlib); fi - if [[ "${{ matrix.feature-use-zstd-thin }}" == true ]]; then FEATURES+=(use_zstd_thin); fi - if [[ "${{ matrix.feature-unrar }}" == true ]]; then FEATURES+=(unrar); fi - IFS=',' - echo "FEATURES=${FEATURES[*]}" >> $GITHUB_OUTPUT - - - name: Set up extra cargo flags - env: - FEATURES: ${{steps.concat-features.outputs.FEATURES}} - shell: bash - run: | - FLAGS="--no-default-features" - if [[ -n "$FEATURES" ]]; then FLAGS+=" --features $FEATURES"; fi - echo "EXTRA_CARGO_FLAGS=$FLAGS" >> $GITHUB_ENV - - - name: Install Rust - run: | - rustup toolchain install stable nightly --profile minimal -t ${{ matrix.target }} - - - uses: Swatinem/rust-cache@v2 - with: - key: "${{ matrix.target }}-${{ matrix.feature-unrar }}-${{ matrix.feature-use-zstd-thin }}-${{ matrix.feature-unrar }}" - - - name: Test on stable - # there's no way to run tests for ARM64 Windows for now - if: matrix.target != 'aarch64-pc-windows-msvc' - run: | - ${{ env.CARGO }} +stable test --target ${{ matrix.target }} $EXTRA_CARGO_FLAGS - - - name: Release on nightly + - name: "Cargo: clippy" run: | - ${{ env.CARGO }} +nightly build --release --target ${{ matrix.target }} $EXTRA_CARGO_FLAGS - env: - OUCH_ARTIFACTS_FOLDER: artifacts - RUSTFLAGS: -C strip=symbols + rustup toolchain install stable --profile minimal -c clippy + cargo +stable clippy -- -D warnings - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: ouch-${{ matrix.target }}-${{ steps.concat-features.outputs.FEATURES }} - path: | - target/${{ matrix.target }}/release/ouch - target/${{ matrix.target }}/release/ouch.exe - artifacts/ + build-and-test: + uses: ouch-org/ouch/.github/workflows/build-artifacts-and-run-tests.yml@latest + with: + matrix_all_combinations: false + upload_artifacts: false