From 8ce7bbe9bca257e9bac93596a42ed094f80aba73 Mon Sep 17 00:00:00 2001 From: Mike Heffner Date: Thu, 22 Jan 2026 14:23:46 -0500 Subject: [PATCH 1/5] Update to new release flow --- .github/workflows/auto-release.yml | 135 +++++++++++++++++++++++++++++ .github/workflows/auto-tag.yml | 118 +++++++++++++++++++++++++ .github/workflows/bump-version.yml | 114 ++++++++++++++++++++++++ .github/workflows/release.yml | 57 ++++++++---- 4 files changed, 409 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/auto-release.yml create mode 100644 .github/workflows/auto-tag.yml create mode 100644 .github/workflows/bump-version.yml diff --git a/.github/workflows/auto-release.yml b/.github/workflows/auto-release.yml new file mode 100644 index 0000000..50354c4 --- /dev/null +++ b/.github/workflows/auto-release.yml @@ -0,0 +1,135 @@ +name: Auto Release + +on: + push: + tags: + - "v[0-9]+.[0-9]+.[0-9]+" + +permissions: + contents: write + +jobs: + create-release: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Validate tag format + id: validate + run: | + TAG_NAME="${{ github.ref_name }}" + echo "Tag name: $TAG_NAME" + + # Verify tag matches semver pattern + if [[ ! "$TAG_NAME" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "❌ ERROR: Tag $TAG_NAME does not match semantic versioning pattern" + echo "Expected format: vX.Y.Z (e.g., v1.2.3)" + exit 1 + fi + + VERSION="${TAG_NAME#v}" + echo "Version: $VERSION" + echo "version=$VERSION" >> $GITHUB_OUTPUT + + - name: Check if release already exists + id: check_release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + TAG_NAME="${{ github.ref_name }}" + + # Check if release already exists + if gh release view "$TAG_NAME" >/dev/null 2>&1; then + echo "❌ ERROR: Release for tag $TAG_NAME already exists!" + echo "If you want to recreate the release, delete it first:" + echo " gh release delete $TAG_NAME" + exit 1 + fi + + echo "✅ No existing release found for $TAG_NAME" + + - name: Generate release notes + id: release_notes + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + TAG_NAME="${{ github.ref_name }}" + VERSION="${{ steps.validate.outputs.version }}" + + # Get the previous tag + PREV_TAG=$(git tag --sort=-version:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -2 | tail -1) + + if [ -z "$PREV_TAG" ]; then + echo "No previous release found, this is the first release" + PREV_TAG=$(git rev-list --max-parents=0 HEAD) + fi + + echo "Generating release notes from $PREV_TAG to $TAG_NAME" + + # Get list of merged PRs between tags + echo "Fetching merged PRs..." + PR_LIST="" + + # Get merge commits between previous tag and current tag + MERGE_COMMITS=$(git log ${PREV_TAG}..${TAG_NAME} --merges --pretty=format:"%H %s" | grep "Merge pull request #") + + if [ -n "$MERGE_COMMITS" ]; then + while IFS= read -r commit_line; do + # Extract PR number from commit message (format: "Merge pull request #123 from ...") + PR_NUMBER=$(echo "$commit_line" | sed -n 's/.*Merge pull request #\([0-9]*\).*/\1/p') + + if [ -n "$PR_NUMBER" ]; then + # Fetch PR details from GitHub API + PR_DATA=$(gh pr view "$PR_NUMBER" --json title,author --jq '{title: .title, author: .author.login}') + PR_TITLE=$(echo "$PR_DATA" | jq -r '.title') + PR_AUTHOR=$(echo "$PR_DATA" | jq -r '.author') + + # Add to PR list + PR_LIST="${PR_LIST}- ${PR_TITLE} by @${PR_AUTHOR} in [#${PR_NUMBER}](https://github.com/${{ github.repository }}/pull/${PR_NUMBER})"$'\n' + fi + done <<< "$MERGE_COMMITS" + fi + + # Generate basic release notes + cat > release_notes.md << EOFNOTES + ## Release $VERSION + + ### What's Changed + + EOFNOTES + + # Add PR list if available + if [ -n "$PR_LIST" ]; then + echo "$PR_LIST" >> release_notes.md + echo "" >> release_notes.md + else + echo "No merged pull requests found in this release." >> release_notes.md + echo "" >> release_notes.md + fi + + # Add full changelog link + cat >> release_notes.md << EOFNOTES + **Full Changelog**: [${PREV_TAG}...${TAG_NAME}](https://github.com/${{ github.repository }}/compare/${PREV_TAG}...${TAG_NAME}) + + EOFNOTES + + echo "release_notes_file=release_notes.md" >> $GITHUB_OUTPUT + + - name: Create GitHub Release + env: + GH_TOKEN: ${{ secrets.PAT_RELEASE_ENGINEER }} + run: | + TAG_NAME="${{ github.ref_name }}" + VERSION="${{ steps.validate.outputs.version }}" + + gh release create "$TAG_NAME" \ + --title "$TAG_NAME" \ + --notes-file "${{ steps.release_notes.outputs.release_notes_file }}" \ + --draft=false \ + --prerelease=false + + echo "✅ Successfully created release $TAG_NAME" + echo "The release workflow will now be triggered to build and publish Lambda Extension layers." diff --git a/.github/workflows/auto-tag.yml b/.github/workflows/auto-tag.yml new file mode 100644 index 0000000..c668da6 --- /dev/null +++ b/.github/workflows/auto-tag.yml @@ -0,0 +1,118 @@ +name: Auto Tag on Version Bump + +on: + pull_request: + types: [closed] + branches: + - main + +jobs: + auto-tag: + # Only run if PR was merged (not just closed) + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Check if PR is a version bump + id: check + run: | + PR_BRANCH="${{ github.event.pull_request.head.ref }}" + echo "PR branch: $PR_BRANCH" + + # Check if branch matches pattern re/bump-for-* + if [[ "$PR_BRANCH" =~ ^re/bump-for-(.+)$ ]]; then + VERSION="${BASH_REMATCH[1]}" + echo "This is a version bump PR for version: $VERSION" + echo "is_version_bump=true" >> $GITHUB_OUTPUT + echo "version=$VERSION" >> $GITHUB_OUTPUT + else + echo "This is not a version bump PR" + echo "is_version_bump=false" >> $GITHUB_OUTPUT + fi + + - name: Check for no-auto-tag label + id: check_label + if: steps.check.outputs.is_version_bump == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + PR_NUMBER="${{ github.event.pull_request.number }}" + + # Get PR labels + LABELS=$(gh pr view $PR_NUMBER --json labels --jq '.labels[].name') + + if echo "$LABELS" | grep -q "no-auto-tag"; then + echo "PR has 'no-auto-tag' label - skipping automatic tagging" + echo "skip_tag=true" >> $GITHUB_OUTPUT + else + echo "PR does not have 'no-auto-tag' label - will create tag" + echo "skip_tag=false" >> $GITHUB_OUTPUT + fi + + - name: Check if tag already exists + if: steps.check.outputs.is_version_bump == 'true' && steps.check_label.outputs.skip_tag == 'false' + run: | + TAG_NAME="v${{ steps.check.outputs.version }}" + echo "Checking if tag $TAG_NAME already exists..." + + # Fetch all tags from remote + git fetch --tags + + # Check if tag exists locally or remotely + if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then + echo "❌ ERROR: Tag $TAG_NAME already exists!" + echo "This usually means:" + echo " 1. A release for this version was already created" + echo " 2. The version in Cargo.toml was not bumped correctly" + echo "" + echo "To fix this:" + echo " - If the tag is incorrect, delete it: git push --delete origin $TAG_NAME" + echo " - If the version is wrong, create a new version bump PR with the correct version" + exit 1 + fi + + echo "✅ Tag $TAG_NAME does not exist, safe to create" + + - name: Configure git + if: steps.check.outputs.is_version_bump == 'true' && steps.check_label.outputs.skip_tag == 'false' + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Clear git credentials + if: steps.check.outputs.is_version_bump == 'true' && steps.check_label.outputs.skip_tag == 'false' + run: | + git config --unset-all http.https://github.com/.extraheader || true + git config --global --unset-all credential.helper || true + git config --local --unset-all credential.helper || true + + - name: Create and push tag + if: steps.check.outputs.is_version_bump == 'true' && steps.check_label.outputs.skip_tag == 'false' + env: + GH_TOKEN: ${{ secrets.PAT_RELEASE_ENGINEER }} + run: | + TAG_NAME="v${{ steps.check.outputs.version }}" + echo "Creating tag: $TAG_NAME" + + # Create annotated tag + git tag -a "$TAG_NAME" -m "Release $TAG_NAME" + + # Push tag + git push "https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}.git" "$TAG_NAME" + + echo "✅ Successfully created and pushed tag $TAG_NAME" + echo "This will trigger the release workflow." + + - name: Skip tagging notification + if: steps.check.outputs.is_version_bump == 'true' && steps.check_label.outputs.skip_tag == 'true' + run: | + echo "⏭️ Skipping automatic tagging due to 'no-auto-tag' label" + echo "To create a release manually, run:" + echo " git tag v${{ steps.check.outputs.version }}" + echo " git push origin v${{ steps.check.outputs.version }}" diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml new file mode 100644 index 0000000..e63c671 --- /dev/null +++ b/.github/workflows/bump-version.yml @@ -0,0 +1,114 @@ +name: Bump Version + +on: + workflow_dispatch: + inputs: + bump_type: + description: "Version bump type" + required: true + default: "patch" + type: choice + options: + - patch + - minor + - major + +env: + CARGO_TERM_COLOR: always + +jobs: + bump-version: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Configure git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Install Rust toolchain + uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + rustflags: "" + + - name: Install protoc + run: | + sudo apt-get update + sudo apt-get install -y protobuf-compiler + + - name: Read current version and calculate new version + id: version + run: | + # Read current version from Cargo.toml + CURRENT_VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/') + echo "Current version: $CURRENT_VERSION" + + # Split version into parts + IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION" + + # Bump version based on input + case "${{ github.event.inputs.bump_type }}" in + major) + MAJOR=$((MAJOR + 1)) + MINOR=0 + PATCH=0 + ;; + minor) + MINOR=$((MINOR + 1)) + PATCH=0 + ;; + patch) + PATCH=$((PATCH + 1)) + ;; + esac + + NEW_VERSION="${MAJOR}.${MINOR}.${PATCH}" + echo "New version: $NEW_VERSION" + + echo "current=$CURRENT_VERSION" >> $GITHUB_OUTPUT + echo "new=$NEW_VERSION" >> $GITHUB_OUTPUT + + - name: Create branch + run: | + BRANCH_NAME="re/bump-for-${{ steps.version.outputs.new }}" + echo "Creating branch: $BRANCH_NAME" + git checkout -b "$BRANCH_NAME" + echo "branch=$BRANCH_NAME" >> $GITHUB_ENV + + - name: Update Cargo.toml version + run: | + sed -i 's/^version = ".*"/version = "${{ steps.version.outputs.new }}"/' Cargo.toml + echo "Updated Cargo.toml to version ${{ steps.version.outputs.new }}" + + - name: Run cargo check to update Cargo.lock + run: cargo check + + - name: Commit and push changes + run: | + git add Cargo.toml Cargo.lock + git commit -m "Bump version to ${{ steps.version.outputs.new }}" + git push origin "${{ env.branch }}" + + - name: Create Pull Request + env: + GH_TOKEN: ${{ secrets.PAT_RELEASE_ENGINEER }} + run: | + gh pr create \ + --title "Release: Bump version to ${{ steps.version.outputs.new }}" \ + --assignee "${{ github.actor }}" \ + --body "This PR bumps the version from ${{ steps.version.outputs.current }} to ${{ steps.version.outputs.new }}. + + **Bump type:** ${{ github.event.inputs.bump_type }} + + After merging this PR, a tag \`v${{ steps.version.outputs.new }}\` will be automatically created and pushed, which will trigger the release workflow. + + If you want to prevent automatic tagging, add the \`no-auto-tag\` label to this PR before merging." \ + --base main \ + --head "${{ env.branch }}" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a695ad3..17b99e2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,9 +1,8 @@ name: release on: - push: - tags: - - 'v*' + release: + types: [created] jobs: build: @@ -14,6 +13,22 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - name: Check version matches tag + env: + REF_NAME: ${{ github.event.release.tag_name }} + run: | + TAG_VERSION="${REF_NAME#v}" + if [[ "$REF_NAME" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + CARGO_VERSION=$(grep '^version = ' Cargo.toml | head -n1 | sed 's/version = "\(.*\)"/\1/') + if [ "$TAG_VERSION" != "$CARGO_VERSION" ]; then + echo "ERROR: Tag version ($TAG_VERSION) does not match Cargo.toml version ($CARGO_VERSION)" + exit 1 + fi + echo "Version check passed: $TAG_VERSION" + else + echo "Tag does not match version pattern, skipping version check" + fi + - name: update apt cache run: sudo apt-get update - name: install protoc @@ -31,7 +46,7 @@ jobs: run: cargo lambda build --extension --release --${{ matrix.arch }} --lambda-dir target/lambda/${{ matrix.arch }} - uses: actions/upload-artifact@v4 with: - name: extensions-${{github.ref_name}}-${{ matrix.arch }} + name: extensions-${{ github.event.release.tag_name }}-${{ matrix.arch }} path: target/lambda/ overwrite: true @@ -41,13 +56,28 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - arch: [ x86-64, arm64 ] + arch: [x86-64, arm64] # Note: As we expand these we may need to pre-create the old version numbers so that the # latest lambda layer version matches across all regions. See DEVELOPING.md. - region: [ us-east-1, us-east-2, us-west-1, us-west-2, ca-central-1, - eu-central-1, eu-north-1, eu-west-1, eu-west-2, eu-west-3, - ap-southeast-1, ap-southeast-2, ap-northeast-1, ap-northeast-2, ap-south-1, - sa-east-1 ] + region: + [ + us-east-1, + us-east-2, + us-west-1, + us-west-2, + ca-central-1, + eu-central-1, + eu-north-1, + eu-west-1, + eu-west-2, + eu-west-3, + ap-southeast-1, + ap-southeast-2, + ap-northeast-1, + ap-northeast-2, + ap-south-1, + sa-east-1, + ] permissions: id-token: write @@ -57,7 +87,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/download-artifact@v4 with: - name: extensions-${{github.ref_name}}-${{ matrix.arch }} + name: extensions-${{ github.event.release.tag_name }}-${{ matrix.arch }} path: target/lambda/ - uses: actions-rust-lang/setup-rust-toolchain@v1 with: @@ -72,9 +102,6 @@ jobs: - name: set arm64 arch suffix if: matrix.arch == 'arm64' run: echo 'EXT_ARCH_SUFFIX=-arm64' >> $GITHUB_ENV - - name: set version suffix - if: contains(github.ref_name, 'alpha') - run: echo 'EXT_VERSION_SUFFIX=-alpha' >> $GITHUB_ENV - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 @@ -88,8 +115,8 @@ jobs: run: | cargo lambda deploy --extension --region ${{matrix.region}} --lambda-dir target/lambda/${{ matrix.arch }} \ --compatible-runtimes provided.al2023 --binary-name rotel-extension \ - "rotel-extension${EXT_ARCH_SUFFIX}${EXT_VERSION_SUFFIX}" | tee -a /tmp/lambda-deploy.out + "rotel-extension${EXT_ARCH_SUFFIX}" | tee -a /tmp/lambda-deploy.out - name: publish release run: | - ./scripts/publish-lambda-version.sh $( grep 'extension arn' /tmp/lambda-deploy.out | awk '{print $4}' ) \ No newline at end of file + ./scripts/publish-lambda-version.sh $( grep 'extension arn' /tmp/lambda-deploy.out | awk '{print $4}' ) From 51c768720797e3dac04d1b4efa7ad1d8193c47bd Mon Sep 17 00:00:00 2001 From: Mike Heffner Date: Thu, 22 Jan 2026 15:47:46 -0500 Subject: [PATCH 2/5] Update release notes with versions --- .github/workflows/release.yml | 24 +++ scripts/update-release-layer-versions.sh | 177 +++++++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100755 scripts/update-release-layer-versions.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 17b99e2..1c5aabc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -59,6 +59,7 @@ jobs: arch: [x86-64, arm64] # Note: As we expand these we may need to pre-create the old version numbers so that the # latest lambda layer version matches across all regions. See DEVELOPING.md. + # Must keep this list in sync with scripts/update-release-layer-versions.sh region: [ us-east-1, @@ -120,3 +121,26 @@ jobs: - name: publish release run: | ./scripts/publish-lambda-version.sh $( grep 'extension arn' /tmp/lambda-deploy.out | awk '{print $4}' ) + + update-release-notes: + name: Update release notes with layer versions + needs: [release] + runs-on: ubuntu-latest + permissions: + id-token: write + contents: write + + steps: + - uses: actions/checkout@v4 + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ secrets.AWS_LAMBDA_DEPLOY_ROLE_ARN }} + aws-region: us-east-1 + + - name: Update release with layer versions + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + ./scripts/update-release-layer-versions.sh "${{ github.event.release.tag_name }}" diff --git a/scripts/update-release-layer-versions.sh b/scripts/update-release-layer-versions.sh new file mode 100755 index 0000000..468fbb1 --- /dev/null +++ b/scripts/update-release-layer-versions.sh @@ -0,0 +1,177 @@ +#!/bin/bash +set -e + +# Script to collect Lambda layer versions across all regions and update GitHub release notes +# Usage: ./update-release-layer-versions.sh +# +# Example: ./update-release-layer-versions.sh v0.1.0 +# +# This script: +# 1. Queries AWS Lambda for the latest layer versions across all regions +# 2. Generates a markdown table with the version information +# 3. Appends the table to the GitHub release notes + +if [ $# -lt 1 ]; then + echo "Usage: $0 " + echo "Example: $0 v0.1.0" + exit 1 +fi + +TAG_NAME="$1" + +# Check required environment variables +if [ -z "$GITHUB_TOKEN" ] && [ -z "$GH_TOKEN" ]; then + echo "Error: GITHUB_TOKEN or GH_TOKEN environment variable must be set" + exit 1 +fi + +# Define regions and architectures +REGIONS=( + us-east-1 + us-east-2 + us-west-1 + us-west-2 + ca-central-1 + eu-central-1 + eu-north-1 + eu-west-1 + eu-west-2 + eu-west-3 + ap-southeast-1 + ap-southeast-2 + ap-northeast-1 + ap-northeast-2 + ap-south-1 + sa-east-1 +) + +ARCHS=("x86-64" "arm64") + +echo "============================================" +echo "Collecting Lambda Layer Versions" +echo "============================================" +echo "" + +# Create temporary file for results +TMP_CSV=$(mktemp) +TMP_MD=$(mktemp) + +echo "region,x86-64,arm64" > "$TMP_CSV" + +# Iterate through regions +for region in "${REGIONS[@]}"; do + echo "Checking region: $region" + row="$region" + + # Check each architecture + for arch in "${ARCHS[@]}"; do + if [ "$arch" == "x86-64" ]; then + layer_name="rotel-extension-amd64-alpha" + else + layer_name="rotel-extension-arm64-alpha" + fi + + echo " Checking layer: $layer_name" + + # Get the latest layer version + version=$(aws lambda list-layer-versions \ + --layer-name "$layer_name" \ + --region "$region" \ + --query 'LayerVersions[0].Version' \ + --output text 2>/dev/null || echo "N/A") + + if [ "$version" == "None" ] || [ -z "$version" ]; then + version="N/A" + fi + + row="$row,$version" + echo " Version: $version" + done + + echo "$row" >> "$TMP_CSV" + echo "" +done + +echo "============================================" +echo "Generating Markdown Table" +echo "============================================" +echo "" + +# Generate markdown table +cat > "$TMP_MD" << 'MDEOF' + +--- + +## Lambda Layer Versions by Region + +This layer can be installed with the following Lambda layer ARNs, choose the right architecture and the +right version for your region based on the table below. + +- \`x86-64\`/\`amd64\`: \`arn:aws:lambda:{region}:418653438961:layer:rotel-extension-amd64:{version}\` +- \`arm64\`: \`arn:aws:lambda:{region}:418653438961:layer:rotel-extension-arm64:{version}\` + + +| Region | x86-64 | arm64 | +|--------|--------|-------| +MDEOF + +# Skip header line and process CSV +tail -n +2 "$TMP_CSV" | while IFS=',' read -r region x86 arm; do + echo "| $region | $x86 | $arm |" >> "$TMP_MD" +done + +echo "" >> "$TMP_MD" + +# Display the generated table +echo "Generated markdown table:" +cat "$TMP_MD" +echo "" + +echo "============================================" +echo "Updating GitHub Release" +echo "============================================" +echo "" + +# Check if gh CLI is available +if ! command -v gh &> /dev/null; then + echo "Error: GitHub CLI (gh) is not installed" + echo "Install it from: https://cli.github.com/" + exit 1 +fi + +# Get current release body +echo "Fetching current release notes for $TAG_NAME..." +CURRENT_BODY=$(gh release view "$TAG_NAME" --json body --jq '.body') + +if [ $? -ne 0 ]; then + echo "Error: Could not fetch release $TAG_NAME" + echo "Make sure the release exists and you have proper permissions" + rm -f "$TMP_CSV" "$TMP_MD" + exit 1 +fi + +# Read the new content +NEW_CONTENT=$(cat "$TMP_MD") + +# Combine bodies +UPDATED_BODY="${CURRENT_BODY}${NEW_CONTENT}" + +# Update the release +echo "Updating release notes..." +gh release edit "$TAG_NAME" --notes "$UPDATED_BODY" + +if [ $? -eq 0 ]; then + echo "" + echo "✅ Successfully updated release notes with layer version information" +else + echo "" + echo "❌ Failed to update release notes" + rm -f "$TMP_CSV" "$TMP_MD" + exit 1 +fi + +# Cleanup +rm -f "$TMP_CSV" "$TMP_MD" + +echo "" +echo "Done!" From ace25ceb68dde4d41921abbd9f779120e4e52dd7 Mon Sep 17 00:00:00 2001 From: Mike Heffner Date: Thu, 22 Jan 2026 15:50:01 -0500 Subject: [PATCH 3/5] Add tag to description --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1c5aabc..c26d5d6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -116,6 +116,7 @@ jobs: run: | cargo lambda deploy --extension --region ${{matrix.region}} --lambda-dir target/lambda/${{ matrix.arch }} \ --compatible-runtimes provided.al2023 --binary-name rotel-extension \ + --description "Tag=${{ github.event.release.tag_name }}" \ "rotel-extension${EXT_ARCH_SUFFIX}" | tee -a /tmp/lambda-deploy.out - name: publish release From 178a938bd6c6c501113be5adc5378a3a1b959250 Mon Sep 17 00:00:00 2001 From: Mike Heffner Date: Thu, 22 Jan 2026 16:17:59 -0500 Subject: [PATCH 4/5] Pass description, even though doesn't work right now --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c3a71de..7a1206d 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,7 @@ # DEPLOY_NAME ?= rotel-extension-test +GIT_SHORT_SHA := $(shell git rev-parse --short HEAD) build: cargo lambda build --extension --release @@ -14,4 +15,5 @@ test: cargo nextest run deploy: build - cargo lambda deploy --extension --compatible-runtimes provided.al2023 --binary-name rotel-extension ${DEPLOY_NAME} \ No newline at end of file + cargo lambda deploy --extension --compatible-runtimes provided.al2023 \ + --description "Tag=${GIT_SHORT_SHA}" --binary-name rotel-extension ${DEPLOY_NAME} \ No newline at end of file From e711e58ee08a92dca8ba80285f00e177f0dbf408 Mon Sep 17 00:00:00 2001 From: Mike Heffner Date: Thu, 22 Jan 2026 16:28:39 -0500 Subject: [PATCH 5/5] Add a releaseing.md --- README.md | 4 ++++ RELEASING.md | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 RELEASING.md diff --git a/README.md b/README.md index 2bc60d5..47c73cd 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,10 @@ Want to chat about this project, share feedback, or suggest improvements? Join o See [DEVELOPING](/DEVELOPING.md) for developer instructions. +## Releasing + +See [RELEASING](/RELEASING.md) for release process instructions. + --- Built with ❤️ by Streamfold. diff --git a/RELEASING.md b/RELEASING.md new file mode 100644 index 0000000..2c9bb07 --- /dev/null +++ b/RELEASING.md @@ -0,0 +1,39 @@ +# Releasing + +This document describes the release process for the Rotel Lambda Extension. + +## Overview + +The release process is fully automated using GitHub Actions workflows. You simply need to trigger a version bump, and the rest happens automatically: + +1. **Bump Version** - Manually trigger a version bump (patch/minor/major) +2. **Auto Tag** - Tag is automatically created when the version bump PR is merged +3. **Auto Release** - GitHub release is automatically created when the tag is pushed +4. **Build & Deploy** - Lambda extension layers are built and published to all AWS regions +5. **Update Release Notes** - Release notes are updated with layer version information + +## Quick Start + +### Standard Release Process + +1. **Go to GitHub Actions** + - Navigate to: [Actions → Bump Version](../../actions/workflows/bump-version.yml) + - Click "Run workflow" + +2. **Select Version Bump Type** + - **patch**: Bug fixes and minor changes (0.1.0 → 0.1.1) + - **minor**: New features, backwards compatible (0.1.0 → 0.2.0) + - **major**: Breaking changes (0.1.0 → 1.0.0) + +3. **Review and Merge PR** + - The workflow will create a PR with the version bump + - Review the changes in `Cargo.toml` and `Cargo.lock` + - Merge the PR when ready + +4. **Automatic Release** + - When the PR is merged, a tag (e.g., `v0.1.1`) is automatically created + - A GitHub release is created with auto-generated release notes + - Lambda extension layers are built and published to all regions + - Release notes are updated with a table of layer versions by region + +That's it! The entire process is automated after you merge the version bump PR.