From 893f0ea63a5f70263d89583044d785781e5e8fab Mon Sep 17 00:00:00 2001 From: Matthieu Gautier Date: Wed, 1 May 2024 15:02:03 +0200 Subject: [PATCH] Add a CI Mainly taken from arx repository. --- .github/FUNDING.yml | 13 +++ .github/workflows/check_release.yml | 123 ++++++++++++++++++++++++++++ .github/workflows/ci.yml | 40 +++++++++ .github/workflows/pre_release.yml | 121 +++++++++++++++++++++++++++ .github/workflows/release.yml | 22 +++++ 5 files changed, 319 insertions(+) create mode 100644 .github/FUNDING.yml create mode 100644 .github/workflows/check_release.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/pre_release.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..77d486a --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,13 @@ +# These are supported funding model platforms + +github: [jubako] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: jubako +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/workflows/check_release.yml b/.github/workflows/check_release.yml new file mode 100644 index 0000000..fb4a5d1 --- /dev/null +++ b/.github/workflows/check_release.yml @@ -0,0 +1,123 @@ +name: Check Release + +on: + push: + branches: + - 'r/[0-9]+.[0-9]+.[0-9]+' + - 'r/[0-9]+.[0-9]+.[0-9]+-[0-9a-zA-Z]+' + +jobs: + check-version: + name: check-version + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Get the release version from the branch + if: env.VERSION == '' + run: | + VERSION=${{ github.ref_name }} + VERSION=${VERSION##r/} + echo "VERSION=$VERSION" >> $GITHUB_ENV + - name: Show the version + run: | + echo "version is: $VERSION" + - name: Check that tag version and Cargo.toml version are the same + shell: bash + run: | + if ! grep -q "version = \"$VERSION\"" Cargo.toml; then + echo "version does not match Cargo.toml" >&2 + exit 1 + fi + outputs: + version: ${{ env.VERSION }} + + check-release: + name: check-release + needs: ['check-version'] + runs-on: ${{ matrix.os }} + env: + # Emit backtraces on panics. + RUST_BACKTRACE: 1 + strategy: + fail-fast: false + matrix: + build: [linux, macos, windows] + include: + - build: linux + os: ubuntu-latest + - build: macos + os: macos-latest + - build: windows + os: windows-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Build release binary + shell: bash + run: | + cargo build --verbose --release + if [ "${{ matrix.os }}" = "windows-latest" ]; then + bin="target/release/zim2waj.exe" + else + bin="target/release/zim2waj" + fi + echo "BIN=$bin" >> $GITHUB_ENV + + - name: Strip release binary (macos) + if: matrix.os == 'macos-latest' + shell: bash + run: strip "$BIN" + + - name: Determine archive name + shell: bash + run: | + version="${{ needs.create-release.outputs.version }}" + echo "ARCHIVE=zim2waj-$version-${{ matrix.build }}" >> $GITHUB_ENV + + - name: Creating directory for archive + shell: bash + run: | + cp "$BIN" "$ARCHIVE"/ + cp {README.md,LICENSE-MIT} "$ARCHIVE"/ + cp Changelog.md "$ARCHIVE"/doc/ + + - name: Build archive (Windows) + shell: bash + if: matrix.os == 'windows-latest' + run: | + 7z a "$ARCHIVE.zip" "$ARCHIVE" + certutil -hashfile "$ARCHIVE.zip" SHA256 > "$ARCHIVE.zip.sha256" + echo "ASSET=$ARCHIVE.zip" >> $GITHUB_ENV + echo "ASSET_SUM=$ARCHIVE.zip.sha256" >> $GITHUB_ENV + + - name: Build archive (Unix) + shell: bash + if: matrix.os != 'windows-latest' + run: | + tar czf "$ARCHIVE.tar.gz" "$ARCHIVE" + shasum -a 256 "$ARCHIVE.tar.gz" > "$ARCHIVE.tar.gz.sha256" + echo "ASSET=$ARCHIVE.tar.gz" >> $GITHUB_ENV + echo "ASSET_SUM=$ARCHIVE.tar.gz.sha256" >> $GITHUB_ENV + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: pre_release-${{ matrix.build }} + path: | + ${{ env.ASSET }} + compression-level: 0 + + check-publication: + name: Check cargo publication + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Test Publish + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + run: | + cargo publish --dry-run -p zim2waj diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e98028d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,40 @@ +name: Cargo Build & Test + +on: + pull_request: + +env: + CARGO_TERM_COLOR: always + +jobs: + build_and_test: + name: Rust project - latest + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + - macos-latest + - windows-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Check format + run: cargo fmt --all --check + + - name: Build + run: cargo build + + - name: Test code + run: cargo test --verbose + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: binary-${{ matrix.os }} + path: | + target/debug/zim2waj + target/debug/zim2waj.exe + compression-level: 0 diff --git a/.github/workflows/pre_release.yml b/.github/workflows/pre_release.yml new file mode 100644 index 0000000..75864d1 --- /dev/null +++ b/.github/workflows/pre_release.yml @@ -0,0 +1,121 @@ +name: Pre-Release + +on: + push: + tags: + - '[0-9]+.[0-9]+.[0-9]+' + - '[0-9]+.[0-9]+.[0-9]+-[0-9a-zA-Z]+' + +permissions: + contents: write + + +jobs: + # The create-release job runs purely to initialize the GitHub release itself, + # and names the release after the `x.y.z` tag that was pushed. It's separate + # from building the release so that we only create the release once. + create-release: + name: create-release + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Get the release version from the tag + if: env.VERSION == '' + run: echo "VERSION=${{ github.ref_name }}" >> $GITHUB_ENV + - name: Show the version + run: | + echo "version is: $VERSION" + - name: Check that tag version and Cargo.toml version are the same + shell: bash + run: | + if ! grep -q "version = \"$VERSION\"" Cargo.toml; then + echo "version does not match Cargo.toml" >&2 + exit 1 + fi + - name: Create GitHub release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: gh release create $VERSION --draft --verify-tag --title $VERSION + outputs: + version: ${{ env.VERSION }} + + # Now the github release has been created, we can build our binaries + # and upload them to github release + build-release: + name: build-release + needs: ['create-release'] + runs-on: ${{ matrix.os }} + env: + # Emit backtraces on panics. + RUST_BACKTRACE: 1 + strategy: + fail-fast: false + matrix: + build: [linux, macos, windows] + include: + - build: linux + os: ubuntu-latest + - build: macos + os: macos-latest + - build: windows + os: windows-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Build release binary + shell: bash + run: | + cargo build --verbose --release + if [ "${{ matrix.os }}" = "windows-latest" ]; then + bin="target/release/zim2waj.exe" + else + bin="target/release/zim2waj" + fi + echo "BIN=$bin" >> $GITHUB_ENV + + - name: Strip release binary (macos) + if: matrix.os == 'macos-latest' + shell: bash + run: strip "$BIN" + + - name: Determine archive name + shell: bash + run: | + version="${{ needs.create-release.outputs.version }}" + echo "ARCHIVE=zim2waj-$version-${{ matrix.build }}" >> $GITHUB_ENV + + - name: Creating directory for archive + shell: bash + run: | + mkdir -p "$ARCHIVE"/{complete,doc} + cp "$BIN" "$ARCHIVE"/ + cp {README.md,LICENSE-MIT} "$ARCHIVE"/ + cp Changelog.md "$ARCHIVE"/doc/ + + - name: Build archive (Windows) + shell: bash + if: matrix.os == 'windows-latest' + run: | + 7z a "$ARCHIVE.zip" "$ARCHIVE" + certutil -hashfile "$ARCHIVE.zip" SHA256 > "$ARCHIVE.zip.sha256" + echo "ASSET=$ARCHIVE.zip" >> $GITHUB_ENV + echo "ASSET_SUM=$ARCHIVE.zip.sha256" >> $GITHUB_ENV + + - name: Build archive (Unix) + shell: bash + if: matrix.os != 'windows-latest' + run: | + tar czf "$ARCHIVE.tar.gz" "$ARCHIVE" + shasum -a 256 "$ARCHIVE.tar.gz" > "$ARCHIVE.tar.gz.sha256" + echo "ASSET=$ARCHIVE.tar.gz" >> $GITHUB_ENV + echo "ASSET_SUM=$ARCHIVE.tar.gz.sha256" >> $GITHUB_ENV + + - name: Upload release archive + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: bash + run: | + version="${{ needs.create-release.outputs.version }}" + gh release upload "$version" ${{ env.ASSET }} ${{ env.ASSET_SUM }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..356e5a9 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,22 @@ +name: Publication + +on: + release: + types: [released] + +env: + CARGO_TERM_COLOR: always + +jobs: + do_publication: + name: Publish on crates.io + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Publish + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + run: | + cargo publish