diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..1569e7d --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,74 @@ +name: tests + +on: + push: + branches: + # This helps fill the caches properly, caches are not shared between PRs. + - main + pull_request: + branches: + - main + +env: + MSRV: "1.76" + RUST_BACKTRACE: 1 + RUSTFLAGS: -Dwarnings + IROH_FORCE_STAGING_RELAYS: "1" + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: dtolnay/rust-toolchain@stable + - uses: swatinem/rust-cache@v2 + - name: cargo fmt + run: cargo fmt --all -- --check + - name: cargo clippy + run: cargo clippy --locked --workspace --all-targets --all-features + + test: + runs-on: ${{ matrix.target.os }} + strategy: + fail-fast: false + matrix: + target: + - os: "ubuntu-latest" + toolchain: "x86_64-unknown-linux-gnu" + name: "Linux GNU" + - os: "macOS-latest" + toolchain: "aarch64-apple-darwin" + name: "macOS" + - os: "windows-latest" + toolchain: "x86_64-pc-windows-msvc" + name: "Windows MSVC" + - os: "windows-latest" + toolchain: "x86_64-pc-windows-gnu" + name: "Windows GNU" + channel: + - "stable" + - "beta" + - "nightly" + steps: + - uses: actions/checkout@v2 + - uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.channel }} + targets: ${{ matrix.target.toolchain }} + - uses: swatinem/rust-cache@v2 + - name: cargo test + run: cargo test --locked --workspace --all-features --bins --tests --examples + + # Checks correct runtime deps and features are requested by not including dev-dependencies. + check-deps: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: dtolnay/rust-toolchain@stable + - uses: swatinem/rust-cache@v2 + - name: cargo check + run: cargo check --workspace --all-features --bins diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..be0f982 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,155 @@ +# The way this works is the following: +# +# The create-release job runs purely to initialize the GitHub release itself +# and to output upload_url for the following job. +# +# The build-release job runs only once create-release is finished. It gets the +# release upload URL from create-release job outputs, then builds the release +# executables for each supported platform and attaches them as release assets +# to the previously created release. +# +# The key here is that we create the release only once. +# +# Reference: +# https://eugene-babichenko.github.io/blog/2020/05/09/github-actions-cross-platform-auto-releases/ +# https://github.com/crate-ci/cargo-release/blob/91549dbf9db9915ba5f121890ad0816c7d851679/.github/workflows/post-release.yml + +name: release +on: + push: + tags: + - "v*" + workflow_dispatch: + inputs: + release_version: + description: "Release version" + required: true + default: "" + create_release: + description: "Create release" + required: true + default: "true" + upload_artifacts: + description: "Upload artifacts" + required: true + default: "true" + +env: + BIN_NAME: iroh-doctor + IROH_FORCE_STAGING_RELAYS: "1" + +jobs: + create-release: + name: create-release + runs-on: ubuntu-latest + outputs: + upload_url: ${{ steps.release.outputs.upload_url }} + release_version: ${{ env.RELEASE_VERSION }} + steps: + - name: Get the release version from the tag (push) + shell: bash + if: env.RELEASE_VERSION == '' && github.event_name == 'push' + run: | + # See: https://github.community/t5/GitHub-Actions/How-to-get-just-the-tag-name/m-p/32167/highlight/true#M1027 + echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + echo "version is: ${{ env.RELEASE_VERSION }}" + - name: Get the release version from the tag (dispatch) + shell: bash + if: github.event_name == 'workflow_dispatch' + run: | + echo "RELEASE_VERSION=${{ github.event.inputs.release_version }}" >> $GITHUB_ENV + echo "version is: ${{ env.RELEASE_VERSION }}" + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Create GitHub release + id: release + if: github.event.inputs.create_release == 'true' || github.event_name == 'push' + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ env.RELEASE_VERSION }} + release_name: ${{ env.RELEASE_VERSION }} + build-release: + name: build-release + needs: create-release + runs-on: ${{ matrix.runner }} + strategy: + matrix: + name: [ubuntu-latest, ubuntu-arm-latest, macOS-arm-latest, macOS-latest, windows-latest] + rust: [stable] + include: + - name: ubuntu-arm-latest + os: ubuntu-latest + target: linux-aarch64 + cargo_targets: "aarch64-unknown-linux-musl" + runner: [self-hosted, linux, ARM64] + - name: ubuntu-latest + os: ubuntu-latest + target: linux-x86_64 + cargo_targets: "x86_64-unknown-linux-musl" + runner: [self-hosted, linux, X64] + - name: macOS-latest + os: macOS-latest + target: darwin-x86_64 + cargo_targets: "x86_64-apple-darwin" + runner: [self-hosted, macOS, ARM64] + - name: macOS-arm-latest + os: macOS-latest + target: darwin-aarch64 + cargo_targets: "aarch64-apple-darwin" + runner: [self-hosted, macOS, ARM64] + # TODO: windows runner is not available on the org level + - name: windows-latest + os: windows-latest + target: windows-x86_64 + cargo_targets: "x86_64-pc-windows-msvc" + runner: [windows-latest] + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{ matrix.rust }} + targets: ${{ matrix.cargo_targets }} + - name: Ensure musl support + if: ${{ contains(matrix.cargo_targets, '-musl') }} + run: sudo apt-get install musl-tools -y + - name: Build release binary + shell: bash + run: | + if [ "${{ matrix.name }}" = "ubuntu-arm-latest" ]; then + export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=aarch64-linux-gnu-gcc + export CC=aarch64-linux-gnu-gcc + fi + cargo build --verbose --release --target ${{ matrix.cargo_targets }} + - name: Build archive + shell: bash + run: | + staging="${{ env.BIN_NAME }}-${{ needs.create-release.outputs.release_version }}-${{ matrix.target }}" + mkdir -p "$staging" + if [ "${{ matrix.os }}" = "windows-latest" ]; then + cp "target/${{ matrix.cargo_targets }}/release/${{ env.BIN_NAME }}.exe" "$staging/" + cd "$staging" + 7z a "../$staging.zip" . + echo "ASSET=$staging.zip" >> $GITHUB_ENV + else + cp "target/${{ matrix.cargo_targets }}/release/${{ env.BIN_NAME }}" "$staging/" + tar czf "$staging.tar.gz" -C "$staging" . + echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV + fi + - name: Upload release archive + uses: actions/upload-release-asset@v1.0.2 + if: github.event.inputs.upload_artifacts == 'true' || github.event_name == 'push' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.create-release.outputs.upload_url }} + asset_path: ${{ env.ASSET }} + asset_name: ${{ env.ASSET }} + asset_content_type: application/octet-stream