Build and Release #7
This file contains 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: Build and Release | |
on: | |
workflow_dispatch: | |
inputs: | |
build_mode: | |
description: Build mode | |
type: choice | |
required: true | |
default: build and release | |
options: | |
- build and release | |
- build and release (force) | |
- build only | |
version_tag: | |
description: Version tag (e.g. 1.2.5, empty to use the one defined in cargo.toml) | |
type: string | |
required: false | |
release_name: | |
description: Release name (e.g. v1.2.5, empty to generate one automatically) | |
type: string | |
required: false | |
env: | |
CARGO_REGISTRY: https://github.com/rust-lang/crates.io-index | |
CARGO_TARGET_DIR: target | |
CARGO_TERM_COLOR: always | |
jobs: | |
build: | |
name: Build | |
strategy: | |
matrix: | |
target_toolchain: | |
- i686-pc-windows-msvc | |
- x86_64-pc-windows-msvc | |
- x86_64-unknown-linux-gnu | |
- x86_64-apple-darwin | |
uses: ./.github/workflows/compile-for-os.yml | |
with: | |
target_toolchain: ${{ matrix.target_toolchain }} | |
secrets: inherit | |
release: | |
runs-on: ubuntu-latest | |
name: Release | |
needs: build | |
permissions: | |
contents: write | |
if: success() && (inputs.build_mode == 'build and release' || inputs.build_mode == 'build and release (force)') | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
path: dist | |
- name: Move artifacts | |
run: | | |
mkdir -v -p dist-temp | |
for zip in dist/*/*.zip; do mv -v "$zip" dist-temp/; done | |
rm -r dist | |
mv -v dist-temp dist | |
find dist -type f -empty -print -delete -o -type d -empty -print -delete | |
- name: List dist folder contents | |
run: | | |
echo GitHub ref is: ${{ github.ref }} | |
echo === Current folder === | |
pwd | |
echo === Root folder contents === | |
ls -la | |
echo === Dist folder contents === | |
ls -la dist | |
- name: Set version | |
id: version | |
run: | | |
version="${{ inputs.version_tag }}" | |
if [ -z "$version" ]; then | |
version=$(grep '^version =' Cargo.toml | awk '{print $3}' | tr -d '"') | |
fi | |
echo "New version is: $version" | |
echo "version=$version" >> $GITHUB_OUTPUT | |
- name: Set release name | |
id: release_name | |
run: | | |
release_name="${{ inputs.release_name }}" | |
if [ -z "$release_name" ]; then | |
release_name=v${{ steps.version.outputs.version }} | |
fi | |
echo "New release_name is: $release_name" | |
echo "release_name=$release_name" >> $GITHUB_OUTPUT | |
- name: Delete existing tag and release (only forced releases) | |
if: inputs.build_mode == 'build and release (force)' | |
run: | | |
echo "Deleting tag and release..." | |
echo "Tag name: ${{ steps.version.outputs.version }}" | |
echo "Release name: ${{ steps.release_name.outputs.release_name }}" | |
gh release delete ${{ steps.version.outputs.version }} -y --cleanup-tag | |
env: | |
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Create release | |
uses: softprops/action-gh-release@v1 | |
with: | |
name: ${{ steps.release_name.outputs.release_name }} | |
tag_name: ${{ steps.version.outputs.version }} | |
generate_release_notes: true | |
fail_on_unmatched_files: true | |
files: | | |
./dist/ChronoClean.x32.Windows.zip | |
./dist/ChronoClean.x64.Windows.zip | |
./dist/ChronoClean.x64.Linux.zip | |
./dist/ChronoClean.x64.MacOS.zip |