Skip to content

Build and Release

Build and Release #7

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