feat(ops): move chglog gen to release workflow #37
Workflow file for this run
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: | |
push: | |
tags: | |
- 'v*.*.*' # Trigger on version tags like v1.0.0 | |
workflow_dispatch: # Allows manual triggering | |
inputs: | |
version: | |
description: 'The version tag to use for the release (e.g., v1.0.0)' | |
required: true | |
type: string | |
permissions: | |
contents: write # Needed for softprops/action-gh-release | |
env: | |
CARGO_TERM_COLOR: always | |
CRATE_NAME: rustdocs_mcp_server | |
jobs: | |
build_assets: | |
name: Build Asset (${{ matrix.platform.target }}) | |
strategy: | |
matrix: | |
platform: | |
- release_for: Linux-x86_64 | |
os: ubuntu-latest | |
target: x86_64-unknown-linux-gnu | |
bin: rustdocs_mcp_server | |
asset_suffix: linux-x86_64 | |
- release_for: macOS-x86_64 | |
os: macos-latest | |
target: x86_64-apple-darwin | |
bin: rustdocs_mcp_server | |
asset_suffix: macos-x86_64 | |
- release_for: macOS-aarch64 | |
os: macos-latest # Build arm on x86 runner | |
target: aarch64-apple-darwin | |
bin: rustdocs_mcp_server | |
asset_suffix: macos-aarch64 | |
- release_for: Windows-x86_64 | |
os: windows-latest | |
target: x86_64-pc-windows-msvc | |
bin: rustdocs_mcp_server.exe | |
asset_suffix: windows-x86_64.exe | |
runs-on: ${{ matrix.platform.os }} | |
steps: | |
- name: Check out repo | |
uses: actions/checkout@v4 | |
- name: Cache cargo & target directories | |
uses: Swatinem/rust-cache@v2 | |
with: | |
key: ${{ matrix.platform.target }} # Use target in cache key | |
# --- Build Binary --- | |
- name: Build binary using actions-rust-cross | |
uses: houseabsolute/actions-rust-cross@v1 # Using latest version | |
with: | |
target: ${{ matrix.platform.target }} | |
args: "--release --verbose" | |
strip: true # Stripping is done by the action | |
# --- Install UPX --- | |
- name: Install UPX (Linux) | |
if: runner.os == 'Linux' | |
run: | | |
sudo apt-get update | |
sudo apt-get install -y upx-ucl | |
- name: Install UPX (macOS) | |
if: runner.os == 'macOS' | |
run: brew install upx | |
- name: Install UPX (Windows) | |
if: runner.os == 'Windows' | |
run: choco install upx --no-progress --yes | |
# --- Prepare Artifact (includes UPX compression) --- | |
- name: Prepare Artifact and Compress with UPX | |
id: artifact_details | |
shell: bash | |
run: | | |
BINARY_NAME="${{ matrix.platform.bin }}" | |
ASSET_NAME="${{ env.CRATE_NAME }}-${{ matrix.platform.asset_suffix }}" | |
TARGET_DIR="target/${{ matrix.platform.target }}/release" | |
BINARY_PATH="$TARGET_DIR/$BINARY_NAME" | |
echo "Calculated binary path: $BINARY_PATH" | |
echo "Calculated asset name: $ASSET_NAME" | |
if [[ ! -f "$BINARY_PATH" ]]; then | |
echo "Error: Binary not found at $BINARY_PATH" | |
echo "Listing contents of $TARGET_DIR:" | |
ls -l "$TARGET_DIR" || echo "Could not list $TARGET_DIR" | |
exit 1 | |
fi | |
# Compress the binary with UPX (skip on macOS) | |
if [[ "${{ runner.os }}" != "macOS" ]]; then | |
echo "Compressing binary with UPX..." | |
upx --best --lzma "$BINARY_PATH" | |
else | |
echo "Skipping UPX compression on macOS." | |
fi | |
# Rename binary to the desired asset name AFTER potential compression | |
mv "$BINARY_PATH" "$TARGET_DIR/$ASSET_NAME" | |
echo "Renamed compressed binary to $TARGET_DIR/$ASSET_NAME" | |
echo "asset_path=$TARGET_DIR/$ASSET_NAME" >> $GITHUB_OUTPUT | |
echo "asset_name=$ASSET_NAME" >> $GITHUB_OUTPUT | |
- name: Upload Artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ steps.artifact_details.outputs.asset_name }} | |
path: ${{ steps.artifact_details.outputs.asset_path }} | |
if-no-files-found: error | |
release: | |
name: Create GitHub Release | |
needs: build_assets | |
runs-on: ubuntu-latest | |
steps: | |
- name: Check out repo for changelog generation | |
uses: actions/checkout@v4 | |
with: | |
fetch-tags: true | |
fetch-depth: 0 | |
# Ensure we checkout the repo where the workflow runs, not a fork | |
repository: ${{ github.repository }} | |
# Use the token with write permissions | |
token: ${{ secrets.GITHUB_TOKEN }} | |
- name: Generate and Commit Changelog | |
run: | | |
echo "Installing git-chglog..." | |
mkdir chglog_tmp | |
wget https://github.com/git-chglog/git-chglog/releases/download/v0.15.4/git-chglog_0.15.4_linux_amd64.tar.gz | |
tar -xvzf git-chglog_0.15.4_linux_amd64.tar.gz -C chglog_tmp | |
echo "Generating changelog..." | |
./chglog_tmp/git-chglog -o ./CHANGELOG.md | |
echo "Cleaning up git-chglog files..." | |
rm git-chglog_0.15.4_linux_amd64.tar.gz | |
rm -rf chglog_tmp | |
echo "Configuring git user..." | |
git config user.name "github-actions[bot]" | |
git config user.email "41898282+github-actions[bot]@users.noreply.github.com" | |
echo "Fetching main branch..." | |
# Fetch the latest main branch from origin | |
git fetch origin refs/heads/main | |
echo "Creating temporary branch based on origin/main..." | |
# Create a new branch based on the fetched origin/main | |
git checkout -b changelog-update origin/main | |
echo "Adding and committing CHANGELOG.md..." | |
git add ./CHANGELOG.md | |
# Check if there are changes to commit to avoid empty commit error if file exists and is unchanged | |
if ! git diff --staged --quiet; then | |
git commit -m "chore(docs): update CHANGELOG for release ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.version || github.ref_name }} [skip ci]" | |
else | |
echo "No changes to CHANGELOG.md to commit." | |
fi | |
echo "Pushing changelog commit to remote main branch..." | |
# Push the new local branch specifically to the remote *branch* main | |
git push origin changelog-update:refs/heads/main | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Download all artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
path: artifacts | |
- name: List downloaded artifacts for debugging | |
run: | | |
echo "Listing downloaded artifacts:" | |
find artifacts -type f | |
echo "---" | |
- name: Create Release and Upload Assets | |
uses: softprops/action-gh-release@v2 | |
with: | |
tag_name: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.version || github.ref_name }} | |
name: Release ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.version || github.ref_name }} | |
body: | | |
Automated release for ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.version || github.ref_name }} | |
draft: false | |
prerelease: false | |
files: artifacts/*/* # Upload all files from all subdirectories within artifacts |