Skip to content

release-castled

release-castled #11

name: release-castled
env:
RUST_BACKTRACE: 1
CARGO_TERM_COLOR: always
CLICOLOR: 1
on:
workflow_dispatch:
inputs:
version:
description: "New tag"
required: true
default: "0.0.1(match the version in Cargo.toml)"
jobs:
create-tag:
name: create-tag
runs-on: ubuntu-latest
permissions:
contents: write
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Create artifacts directory
run: mkdir artifacts
- name: Create tag
uses: actions/github-script@v7
with:
script: |
github.rest.git.createRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: 'refs/tags/castled/${{ github.event.inputs.version }}',
sha: context.sha
})
- name: Get the release version from the tag
env:
RELEASE_VERSION: ${{ github.event.inputs.version }}
run: |
echo "RELEASE_VERSION=${{ env.RELEASE_VERSION }}" >> $GITHUB_ENV
echo "version is: ${{ env.RELEASE_VERSION }}"
- name: Save version number to artifact
run: echo "${{ env.RELEASE_VERSION }}" > artifacts/release-version
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: artifacts
path: artifacts
create-release:
name: create-release
runs-on: ubuntu-latest
needs:
- create-tag
permissions:
contents: write
env:
# Set to force version number, e.g., when no tag exists.
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v4
- name: Download artifact
uses: actions/download-artifact@v4
with:
name: artifacts
path: artifacts
- name: check version in Cargo.toml
run: |
release_version="$(cat artifacts/release-version)"
echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV
make check-version NEW_CRATE_VERSION=$release_version
- name: Create release
run: |
gh release create castled/${{ env.RELEASE_VERSION }} \
-t "Release castled/${{ env.RELEASE_VERSION }}" \
--generate-notes
build-release:
name: build-release
needs: [ "create-release" ]
permissions:
contents: write
env:
# For some builds, we use cross to test on 32-bit and big-endian
# systems.
CARGO: cargo
# When CARGO is set to CROSS, this is set to `--target matrix.target`.
TARGET_FLAGS: ""
# When CARGO is set to CROSS, TARGET_DIR includes matrix.target.
TARGET_DIR: ./target
# Emit backtraces on panics.
RUST_BACKTRACE: 1
strategy:
matrix:
build: [ linux, linux-arm, macos ]
include:
- build: linux
os: ubuntu-latest
rust: stable
target: x86_64-unknown-linux-musl
- build: linux-arm
os: ubuntu-latest
rust: nightly
target: arm-unknown-linux-gnueabihf
- build: macos
os: macos-latest
rust: stable
target: x86_64-apple-darwin
runs-on: ${{ matrix.os }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Install packages (Ubuntu)
# Because openssl doesn't work on musl by default, we resort to max-pure. And that won't need any dependency, so we can skip this.continue-on-error
# Once we want to support better zlib performance, we might have to re-add it.
if: matrix.os == 'ubuntu-latest-disabled'
run: |
sudo apt-get update && sudo apt-get install -y --no-install-recommends xz-utils liblz4-tool musl-tools
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
targets: ${{ matrix.target }}
- name: Use Cross
# if: matrix.os != 'windows-latest'
run: |
cargo install cross
echo "CARGO=cross" >> $GITHUB_ENV
echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV
echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV
- name: Show command used for Cargo
run: |
echo "cargo command is: ${{ env.CARGO }}"
echo "target flag is: ${{ env.TARGET_FLAGS }}"
echo "target dir is: ${{ env.TARGET_DIR }}"
- name: Download artifact
uses: actions/download-artifact@v4
with:
name: artifacts
path: artifacts
- name: Set release version
shell: bash
run: |
release_version="$(cat artifacts/release-version)"
echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV
echo "release version: $RELEASE_VERSION"
rm -rf artifacts
- name: Build release binary
run: ${{ env.CARGO }} build --verbose --release ${{ env.TARGET_FLAGS }}
- name: Build archive
shell: bash
run: |
staging="castle-${{ env.RELEASE_VERSION }}-${{ matrix.target }}"
mkdir -p "$staging"
cp {README.md,LICENSE} "$staging/"
cp target/${{ matrix.target }}/release/castled target/${{ matrix.target }}/release/castle "$staging/"
tar czf "$staging.tar.gz" "$staging"
echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV
- name: Upload release archive
uses: softprops/action-gh-release@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
files: ${{ env.ASSET }}
tag_name: castled/${{ env.RELEASE_VERSION }}
release-crate:
name: release-crate
needs: ["build-release"]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Protoc
uses: arduino/setup-protoc@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Get artifacts
uses: actions/download-artifact@v4
with:
name: artifacts
path: artifacts
- name: Set release version
shell: bash
run: |
release_version="$(cat artifacts/release-version)"
echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV
echo "release version: $RELEASE_VERSION"
rm -rf artifacts
- name: Install cargo-release
run: cargo install cargo-release
- name: release dry-run
run: cargo release ${{ env.RELEASE_VERSION }} --no-push --no-tag --allow-branch main
- name: release
run: cargo release ${{ env.RELEASE_VERSION }} --execute --no-confirm --no-push --no-tag --allow-branch main
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
release-docker:
name: release-docker
needs: ["build-release"]
runs-on: ubuntu-latest
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Download artifact
uses: actions/download-artifact@v4
with:
name: artifacts
path: artifacts
- name: Set release version
shell: bash
run: |
release_version="$(cat artifacts/release-version)"
echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV
echo "release version: $RELEASE_VERSION"
- name: Build and push castle
uses: docker/build-push-action@v6
with:
push: true
tags: swordjin/castle:${{ env.RELEASE_VERSION }}
target: castle
- name: Build and push castled
uses: docker/build-push-action@v6
with:
push: true
tags: swordjin/castled:${{ env.RELEASE_VERSION }}
target: castled