From 0be8024d858bd7e681fc0d9cdac12b5ae4002cc0 Mon Sep 17 00:00:00 2001 From: Gavin Ray Date: Thu, 5 Feb 2026 10:21:05 -0500 Subject: [PATCH] Add GH Workflow to automate release --- .../workflows/create-connector-release.yaml | 193 ++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 .github/workflows/create-connector-release.yaml diff --git a/.github/workflows/create-connector-release.yaml b/.github/workflows/create-connector-release.yaml new file mode 100644 index 0000000..9c13553 --- /dev/null +++ b/.github/workflows/create-connector-release.yaml @@ -0,0 +1,193 @@ +name: Automated Release for ndc-nodejs-lambda + +on: + workflow_dispatch: + inputs: + version: + description: "Version to release (e.g., v1.20.0)" + required: true + type: string + +jobs: + create-release-pr: + name: Create Release PR + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: write + pull-requests: write + + steps: + - name: Validate version format + run: | + VERSION="${{ github.event.inputs.version }}" + if [[ ! "$VERSION" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "::error::Version must be in format vX.Y.Z (e.g., v1.20.0)" + exit 1 + fi + + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Check tag doesn't already exist + run: | + if git rev-parse "${{ github.event.inputs.version }}" >/dev/null 2>&1; then + echo "::error::Tag ${{ github.event.inputs.version }} already exists" + exit 1 + fi + + - name: Check release branch doesn't exist + run: | + BRANCH_NAME="release/${{ github.event.inputs.version }}" + if git ls-remote --exit-code --heads origin "$BRANCH_NAME" >/dev/null 2>&1; then + echo "::error::Branch $BRANCH_NAME already exists. Delete it first or use a different version." + exit 1 + fi + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + registry-url: https://registry.npmjs.org + + - name: Configure Git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Get previous tag + id: get-previous-tag + run: | + PREVIOUS_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") + echo "previous_tag=$PREVIOUS_TAG" >> $GITHUB_OUTPUT + echo "Previous tag: ${PREVIOUS_TAG:-'(none)'}" + + - name: Create release branch + run: | + BRANCH_NAME="release/${{ github.event.inputs.version }}" + git checkout -b "$BRANCH_NAME" + echo "branch_name=$BRANCH_NAME" >> $GITHUB_ENV + + - name: Generate changelog entry + run: | + VERSION="${{ github.event.inputs.version }}" + VERSION_NO_V="${VERSION#v}" + PREVIOUS_TAG="${{ steps.get-previous-tag.outputs.previous_tag }}" + DATE=$(date +%Y-%m-%d) + + # Generate commit log since last tag + if [ -n "$PREVIOUS_TAG" ]; then + echo "Generating changelog from ${PREVIOUS_TAG} to HEAD" + COMMITS=$(git log "${PREVIOUS_TAG}..HEAD" --pretty=format:"- %s" --no-merges | grep -v "^- Release v" || true) + else + echo "No previous tag found, generating full history" + COMMITS=$(git log --pretty=format:"- %s" --no-merges | grep -v "^- Release v" || true) + fi + + # Handle empty commits + if [ -z "$COMMITS" ]; then + COMMITS="- No notable changes" + fi + + # Create changelog entry + CHANGELOG_ENTRY="## [${VERSION_NO_V}] - ${DATE} + + ${COMMITS}" + + # Create or update CHANGELOG.md + if [ -f CHANGELOG.md ]; then + # Read existing content, skip header line + EXISTING_CONTENT=$(tail -n +2 CHANGELOG.md) + + # Write new changelog + { + head -1 CHANGELOG.md + echo "" + echo "$CHANGELOG_ENTRY" + echo "" + echo "$EXISTING_CONTENT" + } > CHANGELOG.tmp + mv CHANGELOG.tmp CHANGELOG.md + else + { + echo "# Changelog" + echo "" + echo "$CHANGELOG_ENTRY" + } > CHANGELOG.md + fi + + echo "Generated changelog entry:" + echo "$CHANGELOG_ENTRY" + + - name: Update package.json version + working-directory: ./ndc-lambda-sdk + run: | + VERSION="${{ github.event.inputs.version }}" + VERSION_NO_V="${VERSION#v}" + + # Update package.json version + npm version "$VERSION_NO_V" --no-git-tag-version + + # Regenerate package-lock.json to ensure consistency + npm install --package-lock-only + + echo "Updated package.json to version $VERSION_NO_V" + + - name: Commit and push changes + run: | + git add CHANGELOG.md ndc-lambda-sdk/package.json ndc-lambda-sdk/package-lock.json + git commit -m "Release ${{ github.event.inputs.version }}" + git push origin "${{ env.branch_name }}" + + - name: Generate PR body + id: pr-body + run: | + VERSION="${{ github.event.inputs.version }}" + VERSION_NO_V="${VERSION#v}" + + # Extract the changelog section for this version + RELEASE_NOTES=$(awk "/## \[${VERSION_NO_V}\]/{flag=1; next} /## \[/{flag=0} flag" CHANGELOG.md) + + cat > pr-body.md << 'EOF' + ## Release ${{ github.event.inputs.version }} + + This PR prepares the release for version ${{ github.event.inputs.version }}. + + ### Changes + EOF + + echo "$RELEASE_NOTES" >> pr-body.md + + cat >> pr-body.md << 'EOF' + + ### Pre-merge Checklist + - [ ] Review changelog entries for accuracy + - [ ] Verify version in `ndc-lambda-sdk/package.json` is correct + - [ ] Ensure all CI checks pass + + ### Post-merge Instructions + After merging, create and push the tag to trigger the release workflow: + + ```bash + git checkout main + git pull origin main + git tag ${{ github.event.inputs.version }} + git push origin ${{ github.event.inputs.version }} + ``` + + > **Note:** The release workflow will automatically publish to npm and create the GitHub release. + EOF + + - name: Create Pull Request + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh pr create \ + --base main \ + --head "${{ env.branch_name }}" \ + --title "Release ${{ github.event.inputs.version }}" \ + --body-file pr-body.md \ + --label "release"