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, });