From 8a885c7d70fdfa0342c686f555b4088e1a8bf521 Mon Sep 17 00:00:00 2001 From: Martin Michaelis Date: Fri, 7 Jun 2024 19:37:50 +0000 Subject: [PATCH] Enable CI workflow Fixes #1 --- .github/workflows/ci.yaml | 170 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 .github/workflows/ci.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..7c009cb --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,170 @@ +name: CI + +on: + - push + - pull_request + - workflow_dispatch + +permissions: + contents: read + +env: + CARGO_INCREMENTAL: 0 + CARGO_TERM_COLOR: always + RUSTFLAGS: -C link-arg=-s + +jobs: + format: + name: Check rust format + runs-on: ubuntu-latest + timeout-minutes: 45 + steps: + - uses: actions/checkout@v4 + - name: Setup rust + run: | + rustup toolchain install nightly --profile minimal --component rustfmt --no-self-update + - name: Run cargo fmt + run: cargo +nightly fmt --check + + test: + name: ${{ matrix.cmd.name }} (Rust ${{ matrix.rust }}) ${{ matrix.features }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + rust: + - stable + features: + - --no-default-features + - + - -F cli + cmd: + - name: Test + run: cargo test --locked + - name: Clippy + run: cargo clippy --locked --tests + run2: -D warnings + timeout-minutes: 45 + steps: + - uses: actions/checkout@v4 + - name: Setup rust + run: | + rustup toolchain install ${{ matrix.rust }} --profile minimal --no-self-update + - name: Install build dependencies + run: sudo apt-get install -y libudev-dev + - name: ${{ matrix.cmd.name }} + run: ${{ matrix.cmd.run }} ${{ matrix.features }} -- ${{ matrix.cmd.run2 }} + + build: + name: Build for ${{ matrix.target.name }} + runs-on: ${{ matrix.target.runs-on }} + strategy: + fail-fast: false + matrix: + target: + - name: Linux (x86_64) + runs-on: ubuntu-latest + target: x86_64-unknown-linux-gnu + pre-build: | + sudo apt-get install -y libudev-dev + - name: Windows (x86_64) + runs-on: windows-latest + target: x86_64-pc-windows-msvc + ext: .exe + - name: MacOS (x86_64) + runs-on: macos-latest + target: x86_64-apple-darwin + - name: MacOS (arm64) + runs-on: macos-latest + target: aarch64-apple-darwin + timeout-minutes: 45 + # env: + # RUSTFLAGS: -C target-feature=+crt-static + steps: + - uses: actions/checkout@v4 + - name: Setup rust + run: | + rustup toolchain install stable --target ${{ matrix.target.target }} --profile minimal --no-self-update + - name: Install build dependencies + run: ${{ matrix.target.pre-build }} + if: matrix.target.pre-build + - name: Build for ${{ matrix.target.name }} + run: cargo build --locked --release --target ${{ matrix.target.target }} --no-default-features -F cli + - name: Check file + run: | + file target/${{ matrix.target.target }}/release/badgemagic${{ matrix.target.ext }} + stat target/${{ matrix.target.target }}/release/badgemagic${{ matrix.target.ext }} + mv target/${{ matrix.target.target }}/release/badgemagic${{ matrix.target.ext }} badgemagic.${{ matrix.target.target }}${{ matrix.target.ext }} + - name: Run for ${{ matrix.target.name }} + run: ./badgemagic.${{ matrix.target.target }}${{ matrix.target.ext }} --help + - uses: actions/upload-artifact@v4 + with: + name: badgemagic.${{ matrix.target.target }}${{ matrix.target.ext }} + path: badgemagic.${{ matrix.target.target }}${{ matrix.target.ext }} + if-no-files-found: error + + ready: + name: All required checks passed + needs: + - format + - test + - build + runs-on: ubuntu-latest + steps: + - run: date + + release: + name: Create release + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + permissions: + contents: write + needs: + - format + - test + - build + runs-on: ubuntu-latest + timeout-minutes: 45 + steps: + - uses: actions/download-artifact@v4 + with: + pattern: badgemagic.* + merge-multiple: true + - name: List artifacts + run: find -exec ls -ld {} + + - uses: actions/github-script@v7 + id: upload-release-asset + with: + script: | + const fs = require('fs'); + const { env } = process; + + const { data: release } = await github.rest.repos.createRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + tag_name: `commit-${env.GITHUB_SHA.slice(0, 7)}`, + target_commitish: env.GITHUB_SHA, + draft: true, + generate_release_notes: true, + }); + console.log('release:', release.id); + + const artifacts = fs.readdirSync('.'); + console.log('artifacts:', artifacts); + + for (const name of artifacts) { + const data = fs.readFileSync(name); + await github.rest.repos.uploadReleaseAsset({ + owner: context.repo.owner, + repo: context.repo.repo, + release_id: release.id, + name, + data, + }); + } + + await github.rest.repos.updateRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + release_id: release.id, + draft: false, + });