Release #172
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release | |
| on: | |
| 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" | |
| upload_url: | |
| description: "Upload URL" | |
| required: false | |
| default: "" | |
| base_hash: | |
| description: "Commit hash from which to build" | |
| required: false | |
| type: string | |
| default: "" | |
| mark_latest: | |
| description: "Mark latest release" | |
| required: true | |
| default: "false" | |
| push: | |
| tags: | |
| - "v*" | |
| concurrency: | |
| group: release-${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| env: | |
| RUST_BACKTRACE: 1 | |
| RUSTFLAGS: -Dwarnings | |
| RUSTDOCFLAGS: -Dwarnings | |
| MSRV: "1.89" | |
| SCCACHE_CACHE_SIZE: "10G" | |
| BIN_NAMES: "iroh-relay,iroh-dns-server" | |
| RELEASE_VERSION: ${{ github.event.inputs.release_version }} | |
| 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 or input | |
| shell: bash | |
| if: env.RELEASE_VERSION == '' | |
| run: | | |
| if "${{ github.event.inputs.release_version }}" != ""; then | |
| echo "RELEASE_VERSION=${{ github.event.inputs.release_version }}" >> $GITHUB_ENV | |
| echo "version is: ${{ env.RELEASE_VERSION }}" | |
| else | |
| # 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 }}" | |
| fi | |
| - name: Checkout repository | |
| uses: actions/checkout@v6 | |
| 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: | |
| draft: true | |
| tag_name: ${{ env.RELEASE_VERSION || github.event.inputs.release_version}} | |
| release_name: ${{ env.RELEASE_VERSION || github.event.inputs.release_version }} | |
| build_release: | |
| timeout-minutes: 60 | |
| name: Build release binaries | |
| needs: create-release | |
| runs-on: ${{ matrix.runner }} | |
| outputs: | |
| release_version: ${{ needs.create-release.outputs.release_version }} | |
| base_hash: ${{ steps.define_hash.outputs.base_hash }} | |
| continue-on-error: false | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| name: [ubuntu-latest, ubuntu-musl-latest, ubuntu-arm-latest, ubuntu-arm-musl-latest, macOS-latest, macOS-arm-latest, windows-latest] | |
| rust: [stable] | |
| experimental: [false] | |
| include: | |
| - name: ubuntu-arm-latest | |
| os: ubuntu-latest | |
| release-os: linux | |
| release-arch: aarch64 | |
| libc: gnu | |
| cargo_targets: "aarch64-unknown-linux-gnu" | |
| runner: [self-hosted, linux, ARM64] | |
| - name: ubuntu-arm-musl-latest | |
| os: ubuntu-latest | |
| release-os: linux | |
| release-arch: aarch64 | |
| libc: musl | |
| cargo_targets: "aarch64-unknown-linux-musl" | |
| runner: [self-hosted, linux, ARM64] | |
| - name: ubuntu-latest | |
| os: ubuntu-latest | |
| release-os: linux | |
| release-arch: amd64 | |
| libc: gnu | |
| cargo_targets: "x86_64-unknown-linux-gnu" | |
| runner: [self-hosted, linux, X64] | |
| - name: ubuntu-musl-latest | |
| os: ubuntu-latest | |
| release-os: linux | |
| release-arch: amd64 | |
| libc: musl | |
| cargo_targets: "x86_64-unknown-linux-musl" | |
| runner: [self-hosted, linux, X64] | |
| - name: macOS-latest | |
| os: macOS-latest | |
| release-os: darwin | |
| release-arch: x86_64 | |
| cargo_targets: "x86_64-apple-darwin" | |
| runner: [self-hosted, macOS, ARM64] | |
| - name: macOS-arm-latest | |
| os: macOS-latest | |
| release-os: darwin | |
| release-arch: aarch64 | |
| cargo_targets: "aarch64-apple-darwin" | |
| runner: [self-hosted, macOS, ARM64] | |
| - name: windows-latest | |
| os: windows-latest | |
| release-os: windows | |
| release-arch: amd64 | |
| cargo_targets: "x86_64-pc-windows-msvc" | |
| runner: [self-hosted, windows, X64] | |
| env: | |
| # Using self-hosted runners so use local cache for sccache and | |
| # not SCCACHE_GHA_ENABLED. | |
| # RUSTC_WRAPPER: "sccache" | |
| RUST_BACKTRACE: full | |
| RUSTV: ${{ matrix.rust }} | |
| steps: | |
| - name: Checkout | |
| if: inputs.base_hash == '' | |
| uses: actions/checkout@v6 | |
| with: | |
| submodules: recursive | |
| - name: Checkout specified commit | |
| if: inputs.base_hash != '' | |
| uses: actions/checkout@v6 | |
| with: | |
| ref: ${{ inputs.base_hash }} | |
| submodules: recursive | |
| - name: Set build arch | |
| run: | | |
| echo "RELEASE_ARCH=${{ matrix.release-arch }}" >> $GITHUB_ENV | |
| echo "RELEASE_OS=${{ matrix.release-os }}" >> $GITHUB_ENV | |
| - name: Define hash | |
| if: matrix.os == 'ubuntu-latest' | |
| id: define_hash | |
| run: | | |
| echo "base_hash=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT" | |
| - name: Ensure musl support | |
| if: ${{ contains(matrix.cargo_targets, '-musl') }} | |
| run: sudo apt-get install musl-tools -y | |
| - name: Install Rust | |
| if: matrix.os != 'windows-latest' | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| toolchain: ${{ matrix.rust }} | |
| targets: ${{ matrix.cargo_targets }} | |
| - name: Install Rust | |
| if: matrix.os == 'windows-latest' | |
| run: | | |
| rustup toolchain install stable | |
| rustup target add ${{ matrix.cargo_targets }} | |
| - name: build release | |
| if: matrix.os != 'windows-latest' | |
| shell: bash | |
| run: | | |
| if [ "${{ contains(matrix.cargo_targets, '-musl') }}" = "true" ]; then | |
| # Native build on self-hosted linux runners; use musl-gcc from musl-tools. | |
| export CARGO_TARGET_$(echo ${{ matrix.cargo_targets }} | tr 'a-z-' 'A-Z_')_LINKER=musl-gcc | |
| export CC=musl-gcc | |
| export RUSTFLAGS="${RUSTFLAGS:-} -C target-feature=+crt-static -C link-arg=-static" | |
| fi | |
| cargo build --profile optimized-release --all-features --target ${{ matrix.cargo_targets }} | |
| - name: build release | |
| if: matrix.os == 'windows-latest' | |
| run: cargo build --profile optimized-release --all-features --target ${{ matrix.cargo_targets }} | |
| - name: Cache AWS CLI | |
| if: matrix.os != 'windows-latest' | |
| id: cache-awscli | |
| uses: actions/cache@v5 | |
| with: | |
| path: ~/awscli | |
| key: awscli-${{ runner.os }}-${{ runner.arch }}-v2 | |
| - name: Download awscli (linux x86_64) | |
| if: matrix.os == 'ubuntu-latest' && matrix.release-arch == 'amd64' && steps.cache-awscli.outputs.cache-hit != 'true' | |
| run: | | |
| mkdir -p ~/awscli | |
| curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o ~/awscli/awscliv2.zip | |
| cd ~/awscli && unzip -oq awscliv2.zip | |
| - name: Download awscli (linux aarch64) | |
| if: matrix.os == 'ubuntu-latest' && matrix.release-arch == 'aarch64' && steps.cache-awscli.outputs.cache-hit != 'true' | |
| run: | | |
| mkdir -p ~/awscli | |
| curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o ~/awscli/awscliv2.zip | |
| cd ~/awscli && unzip -oq awscliv2.zip | |
| - name: Download awscli (mac) | |
| if: matrix.os == 'macos-latest' && steps.cache-awscli.outputs.cache-hit != 'true' | |
| run: | | |
| mkdir -p ~/awscli | |
| curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o ~/awscli/AWSCLIV2.pkg | |
| - name: Install awscli (linux) | |
| if: matrix.os == 'ubuntu-latest' | |
| run: sudo ~/awscli/aws/install --update | |
| - name: Install awscli (mac) | |
| if: matrix.os == 'macos-latest' | |
| run: sudo installer -pkg ~/awscli/AWSCLIV2.pkg -target / | |
| - name: Set aws credentials | |
| if: matrix.os != 'windows-latest' | |
| run: | | |
| echo "AWS_ACCESS_KEY_ID=${{secrets.S3_ACCESS_KEY_ID}}" >> $GITHUB_ENV | |
| echo "AWS_SECRET_ACCESS_KEY=${{secrets.S3_ACCESS_KEY}}" >> $GITHUB_ENV | |
| echo "AWS_DEFAULT_REGION=us-west-2" >> $GITHUB_ENV | |
| - name: push release | |
| if: matrix.os != 'windows-latest' && matrix.libc != 'musl' | |
| run: | | |
| aws s3 cp ./target/${{ matrix.cargo_targets }}/optimized-release/iroh-relay s3://vorc/iroh-relay-${RELEASE_OS}-${RELEASE_ARCH}-${GITHUB_SHA::7} --no-progress | |
| aws s3 cp ./target/${{ matrix.cargo_targets }}/optimized-release/iroh-dns-server s3://vorc/iroh-dns-server-${RELEASE_OS}-${RELEASE_ARCH}-${GITHUB_SHA::7} --no-progress | |
| - name: push release latest | |
| if: matrix.os != 'windows-latest' && matrix.libc != 'musl' && (github.event.inputs.mark_latest == 'true' || github.event_name == 'push') | |
| run: | | |
| aws s3 cp ./target/${{ matrix.cargo_targets }}/optimized-release/iroh-relay s3://vorc/iroh-relay-${RELEASE_OS}-${RELEASE_ARCH}-latest --no-progress | |
| aws s3 cp ./target/${{ matrix.cargo_targets }}/optimized-release/iroh-dns-server s3://vorc/iroh-dns-server-${RELEASE_OS}-${RELEASE_ARCH}-latest --no-progress | |
| - name: push docker release | |
| if: matrix.os == 'ubuntu-latest' && matrix.libc == 'musl' | |
| run: | | |
| aws s3 cp ./target/${{ matrix.cargo_targets }}/optimized-release/iroh-relay s3://vorc/iroh-relay-${RELEASE_OS}-${RELEASE_ARCH}-musl-${GITHUB_SHA::7} --no-progress | |
| aws s3 cp ./target/${{ matrix.cargo_targets }}/optimized-release/iroh-dns-server s3://vorc/iroh-dns-server-${RELEASE_OS}-${RELEASE_ARCH}-musl-${GITHUB_SHA::7} --no-progress | |
| - name: Build archives | |
| if: matrix.os != 'windows-latest' | |
| shell: bash | |
| run: | | |
| IFS=',' read -ra BIN_NAMES <<< "${{ env.BIN_NAMES }}" | |
| ASSETS="" | |
| for BIN_NAME in "${BIN_NAMES[@]}"; do | |
| staging="$BIN_NAME-${{ needs.create-release.outputs.release_version }}-${{ matrix.cargo_targets }}" | |
| mkdir -p "$staging" | |
| cp "target/${{ matrix.cargo_targets }}/optimized-release/$BIN_NAME" "$staging/" | |
| tar czf "$staging.tar.gz" -C "$staging" . | |
| ASSETS+="$staging.tar.gz," | |
| done | |
| echo "ASSET=$(echo $ASSETS | sed 's/,$//')" >> $GITHUB_ENV | |
| - name: Build archives (windows) | |
| if: matrix.os == 'windows-latest' | |
| shell: pwsh | |
| run: | | |
| $BIN_NAMES = "${{ env.BIN_NAMES }}".Split(',') | |
| $ASSETS = @() | |
| foreach ($BIN_NAME in $BIN_NAMES) { | |
| $staging = "$BIN_NAME-${{ needs.create-release.outputs.release_version }}-${{ matrix.cargo_targets }}" | |
| New-Item -ItemType Directory -Force -Path "$staging" | |
| Copy-Item -Path "target/${{ matrix.cargo_targets }}/optimized-release/$BIN_NAME.exe" -Destination "$staging/" | |
| Set-Location -Path "$staging" | |
| Compress-Archive -Path * -DestinationPath "../$staging.zip" | |
| $ASSETS += "$staging.zip" | |
| Set-Location -Path .. | |
| } | |
| $ASSETS = $ASSETS -join ',' | |
| Add-Content -Path $env:GITHUB_ENV -Value "ASSET=$ASSETS" | |
| - uses: n0-computer/actions-upload-release-asset@main | |
| if: (github.event.inputs.upload_artifacts == 'true' || github.event_name == 'push') | |
| with: | |
| upload_url: ${{ github.event.inputs.upload_url || needs.create-release.outputs.upload_url }} | |
| asset_path: ${{ env.ASSET }} | |
| - name: attach artifacts | |
| uses: actions/upload-artifact@v7 | |
| if : matrix.os != 'windows-latest' | |
| with: | |
| name: iroh-${{ matrix.release-os }}-${{ matrix.release-arch }}${{ matrix.libc == 'musl' && '-musl' || '' }}-bundle | |
| path: iroh-*.tar.gz | |
| compression-level: 0 | |
| retention-days: 1 | |
| - name: attach artifacts | |
| uses: actions/upload-artifact@v7 | |
| if : matrix.os == 'windows-latest' | |
| with: | |
| name: iroh-${{ matrix.release-os }}-${{ matrix.release-arch }}-bundle | |
| path: iroh-*.zip | |
| compression-level: 0 | |
| retention-days: 1 | |
| docker: | |
| needs: build_release | |
| uses: './.github/workflows/docker.yaml' | |
| secrets: inherit | |
| with: | |
| release_version: ${{ needs.build_release.outputs.release_version }} | |
| base_hash: ${{ needs.build_release.outputs.base_hash }} | |
| publish: true |