Skip to content

Create a release

Create a release #26

Workflow file for this run

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 }}
# Validate data and types
validate:
name: Validate
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Use Node.js 24
uses: actions/setup-node@v4
with:
node-version: 24
cache: 'npm'
cache-dependency-path: 'package-lock.json'
- name: Install dependencies
run: npm ci
- name: Run validation
run: npm run test
# Update version files
update_version:
needs: [ release_metadata ]
name: Update version files
runs-on: ubuntu-latest
outputs:
version_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 24
uses: actions/setup-node@v4
with:
node-version: 24
- 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 version in pyproject.toml
run: |
sed -i 's/^version = ".*"/version = "${{ needs.release_metadata.outputs.version_number }}"/' pyproject.toml
- 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 package.json and pyproject.toml versions [skip ci]"
# Pypi publish
#publish_to_pypi:
# name: Publish to PyPI
# needs: [release_metadata, validate, update_version]
# runs-on: ubuntu-latest
# permissions:
# contents: write
# id-token: write # Required for OIDC authentication.
# environment:
# name: pypi
# url: https://pypi.org/project/mcp-client-capabilities
# steps:
# - uses: actions/checkout@v4
# with:
# ref: ${{ needs.update_version.outputs.version_commitish }}
# - name: Verify commit SHA
# run: |
# CURRENT_SHA=$(git rev-parse HEAD)
# EXPECTED_SHA="${{ needs.update_version.outputs.version_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 pyproject.toml version
# run: |
# EXPECTED_VERSION="${{ needs.release_metadata.outputs.version_number }}"
# ACTUAL_VERSION=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/')
# echo "Expected version: $EXPECTED_VERSION"
# echo "Actual version in pyproject.toml: $ACTUAL_VERSION"
# if [ "$EXPECTED_VERSION" != "$ACTUAL_VERSION" ]; then
# echo "ERROR: Version mismatch! Expected $EXPECTED_VERSION but found $ACTUAL_VERSION in pyproject.toml"
# exit 1
# fi
# echo "✓ Version check passed: pyproject.toml has correct version $ACTUAL_VERSION"
# - name: Prepare distribution
# uses: apify/workflows/prepare-pypi-distribution@main
# with:
# ref: ${{ needs.update_version.outputs.version_commitish }}
# package_name: mcp-client-capabilities
# is_prerelease: ""
# version_number: ${{ needs.release_metadata.outputs.version_number }}
# # Publishes the package to PyPI using PyPA official GitHub action with OIDC authentication.
# - name: Publish package to PyPI
# uses: pypa/gh-action-pypi-publish@release/v1
# NPM publish
publish_to_npm:
name: Publish to NPM
needs: [ release_metadata, validate, update_version ]
runs-on: ubuntu-latest
permissions:
id-token: write # Required for OIDC
contents: read
steps:
- uses: actions/checkout@v4
with:
ref: ${{ needs.update_version.outputs.version_commitish }}
- name: Verify commit SHA
run: |
CURRENT_SHA=$(git rev-parse HEAD)
EXPECTED_SHA="${{ needs.update_version.outputs.version_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"
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 24
uses: actions/setup-node@v4
with:
node-version: 24
cache: 'npm'
cache-dependency-path: 'package-lock.json'
- name: Install dependencies
run: npm ci
- name: Build module
run: npm run build
- name: Publish to NPM
run: npm publish --tag latest
# Create GitHub release
#create_github_release:
# name: Create GitHub release
# needs: [release_metadata, publish_to_pypi, publish_to_npm]
# runs-on: ubuntu-latest
# permissions:
# contents: write
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# steps:
# - uses: actions/checkout@v4
# - 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 }}
# body: ${{ needs.release_metadata.outputs.release_notes }}
env:
NODE_AUTH_TOKEN: ${{ secrets.APIFY_SERVICE_ACCOUNT_NPM_TOKEN }}
NPM_TOKEN: ${{ secrets.APIFY_SERVICE_ACCOUNT_NPM_TOKEN }}