release.yaml•9.31 kB
name: Create a release
on:
# Trigger a stable version release via GitHub's UI, with the ability to specify the type of release.
workflow_dispatch:
inputs:
release_type:
description: Release type
required: true
type: choice
default: auto
options:
- auto
- custom
- patch
- minor
- major
custom_version:
description: The custom version to bump to (only for "custom" type)
required: false
type: string
default: ""
concurrency:
group: release
cancel-in-progress: false
jobs:
release_metadata:
name: Prepare release metadata
runs-on: ubuntu-latest
outputs:
version_number: ${{ steps.release_metadata.outputs.version_number }}
tag_name: ${{ steps.release_metadata.outputs.tag_name }}
changelog: ${{ steps.release_metadata.outputs.changelog }}
release_notes: ${{ steps.release_metadata.outputs.release_notes }}
steps:
- uses: apify/workflows/git-cliff-release@main
name: Prepare release metadata
id: release_metadata
with:
release_type: ${{ inputs.release_type }}
custom_version: ${{ inputs.custom_version }}
existing_changelog_path: CHANGELOG.md
update_changelog:
needs: [ release_metadata ]
name: Update changelog
runs-on: ubuntu-latest
outputs:
changelog_commitish: ${{ steps.commit.outputs.commit_long_sha || github.sha }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.APIFY_SERVICE_ACCOUNT_GITHUB_TOKEN }}
- name: Use Node.js 22
uses: actions/setup-node@v4
with:
node-version: 22
- name: Update package version in package.json
run: npm version --no-git-tag-version --allow-same-version ${{ needs.release_metadata.outputs.version_number }}
- name: Update manifest.json version
run: jq '.version = "${{ needs.release_metadata.outputs.version_number }}"' manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
- name: Update CHANGELOG.md
uses: DamianReeves/write-file-action@master
with:
path: CHANGELOG.md
write-mode: overwrite
contents: ${{ needs.release_metadata.outputs.changelog }}
- name: Commit changes
id: commit
uses: EndBug/add-and-commit@v9
with:
author_name: Apify Release Bot
author_email: noreply@apify.com
message: "chore(release): Update changelog, package.json and manifest.json versions [skip ci]"
create_github_release:
name: Create github release
needs: [release_metadata, update_changelog]
runs-on: ubuntu-latest
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v4
with:
ref: ${{ needs.update_changelog.outputs.changelog_commitish }}
- name: Verify commit SHA
run: |
CURRENT_SHA=$(git rev-parse HEAD)
EXPECTED_SHA="${{ needs.update_changelog.outputs.changelog_commitish }}"
echo "Expected commit SHA: $EXPECTED_SHA"
echo "Actual checked out SHA: $CURRENT_SHA"
if [ "$EXPECTED_SHA" != "$CURRENT_SHA" ]; then
echo "ERROR: Checked out SHA differs from expected!"
exit 1
else
echo "✓ Commit SHA matches expected"
fi
- name: Verify manifest.json version
run: |
EXPECTED_VERSION="${{ needs.release_metadata.outputs.version_number }}"
ACTUAL_VERSION=$(jq -r '.version' manifest.json)
echo "Expected version: $EXPECTED_VERSION"
echo "Actual version in manifest.json: $ACTUAL_VERSION"
echo "Current commit SHA: ${{ needs.update_changelog.outputs.changelog_commitish }}"
if [ "$EXPECTED_VERSION" != "$ACTUAL_VERSION" ]; then
echo "ERROR: Version mismatch! Expected $EXPECTED_VERSION but found $ACTUAL_VERSION in manifest.json"
exit 1
fi
echo "✓ Version check passed: manifest.json has correct version $ACTUAL_VERSION"
- name: Use Node.js 22
uses: actions/setup-node@v4
with:
node-version: 22
cache: 'npm'
cache-dependency-path: 'package-lock.json'
- name: Install dependencies
run: |
echo "access=public" >> .npmrc
echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" >> .npmrc
npm ci
- name: Build module
run: npm run build
- name: Prepare MCPB package
run: |
mkdir mcpb
cp -r node_modules mcpb/node_modules
cp -r dist mcpb/dist
cp -r docs mcpb/docs
cp package.json mcpb/package.json
cp manifest.json mcpb/manifest.json
cp docs/apify-logo.png mcpb/icon.png
- name: Create MCPB package
# fix version of anthropic-ai/mcpb to 1.1.1 so that we have a reproducible build
run: npx -y @anthropic-ai/mcpb@1.1.1 pack mcpb/ apify-mcp-server.mcpb
- name: Copy MCPB package
run: cp apify-mcp-server.mcpb actors-mcp-server.mcpb
- name: Create release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ needs.release_metadata.outputs.tag_name }}
name: ${{ needs.release_metadata.outputs.version_number }}
target_commitish: ${{ needs.update_changelog.outputs.changelog_commitish }}
body: ${{ needs.release_metadata.outputs.release_notes }}
files: |
apify-mcp-server.mcpb
actors-mcp-server.mcpb
publish_to_npm:
name: Publish to NPM
needs: [ release_metadata, update_changelog ]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ needs.update_changelog.outputs.changelog_commitish }}
- name: Verify commit SHA
run: |
CURRENT_SHA=$(git rev-parse HEAD)
EXPECTED_SHA="${{ needs.update_changelog.outputs.changelog_commitish }}"
echo "Expected commit SHA: $EXPECTED_SHA"
echo "Actual checked out SHA: $CURRENT_SHA"
if [ "$EXPECTED_SHA" != "$CURRENT_SHA" ]; then
echo "ERROR: Checked out SHA differs from expected!"
exit 1
else
echo "✓ Commit SHA matches expected"
fi
- name: Verify package.json version
run: |
EXPECTED_VERSION="${{ needs.release_metadata.outputs.version_number }}"
ACTUAL_VERSION=$(jq -r '.version' package.json)
echo "Expected version: $EXPECTED_VERSION"
echo "Actual version in package.json: $ACTUAL_VERSION"
echo "Current commit SHA: ${{ needs.update_changelog.outputs.changelog_commitish }}"
if [ "$EXPECTED_VERSION" != "$ACTUAL_VERSION" ]; then
echo "ERROR: Version mismatch! Expected $EXPECTED_VERSION but found $ACTUAL_VERSION in package.json"
exit 1
fi
echo "✓ Version check passed: package.json has correct version $ACTUAL_VERSION"
- name: Use Node.js 22
uses: actions/setup-node@v4
with:
node-version: 22
cache: 'npm'
cache-dependency-path: 'package-lock.json'
- name: Install dependencies
run: |
echo "access=public" >> .npmrc
echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" >> .npmrc
npm ci
- name: Build module
run: npm run build
- name: Publish to NPM
run: npm publish --tag latest
env:
NODE_AUTH_TOKEN: ${{ secrets.APIFY_SERVICE_ACCOUNT_NPM_TOKEN }}
NPM_TOKEN: ${{ secrets.APIFY_SERVICE_ACCOUNT_NPM_TOKEN }}