diff --git a/.github/scripts/before-beta-release.cjs b/.github/scripts/before-beta-release.cjs deleted file mode 100644 index fad6bf09..00000000 --- a/.github/scripts/before-beta-release.cjs +++ /dev/null @@ -1,33 +0,0 @@ -const { execSync } = require('node:child_process'); -const fs = require('node:fs'); -const path = require('node:path'); - -const PKG_JSON_PATH = path.join(__dirname, '..', '..', 'package.json'); - -const pkgJson = require(PKG_JSON_PATH); // eslint-disable-line import/no-dynamic-require - -const PACKAGE_NAME = pkgJson.name; -const VERSION = pkgJson.version; -console.log(`before-deploy: Current version is ${VERSION}`); // eslint-disable-line no-console - -const nextVersion = getNextVersion(VERSION); -console.log(`before-deploy: Setting version to ${nextVersion}`); // eslint-disable-line no-console -pkgJson.version = nextVersion; - -fs.writeFileSync(PKG_JSON_PATH, `${JSON.stringify(pkgJson, null, 2)}\n`); - -function getNextVersion(version) { - const versionString = execSync(`npm show ${PACKAGE_NAME} versions --json`, { encoding: 'utf8' }); - const versions = JSON.parse(versionString); - - if (versions.some((v) => v === VERSION)) { - console.error(`before-deploy: A release with version ${VERSION} already exists. Please increment version accordingly.`); // eslint-disable-line no-console - process.exit(1); - } - - const prereleaseNumbers = versions - .filter((v) => (v.startsWith(VERSION) && v.includes('-'))) - .map((v) => Number(v.match(/\.(\d+)$/)[1])); - const lastPrereleaseNumber = Math.max(-1, ...prereleaseNumbers); - return `${version}-beta.${lastPrereleaseNumber + 1}`; -} diff --git a/.github/workflows/pre_release.yaml b/.github/workflows/pre_release.yaml index 39235548..81c7b231 100644 --- a/.github/workflows/pre_release.yaml +++ b/.github/workflows/pre_release.yaml @@ -1,108 +1,55 @@ name: Create a pre-release on: - workflow_dispatch: - # Push to master will deploy a beta version - push: - branches: - - master - tags-ignore: - - "**" # Ignore all tags to prevent duplicate builds when tags are pushed. + # Only trigger on PRs with "beta" label + pull_request: + types: [labeled, synchronize, reopened] concurrency: group: release cancel-in-progress: false jobs: - release_metadata: - if: "!startsWith(github.event.head_commit.message, 'docs') && !startsWith(github.event.head_commit.message, 'ci') && startsWith(github.repository, 'apify/')" - name: Prepare release metadata - runs-on: ubuntu-latest - outputs: - version_number: ${{ steps.release_metadata.outputs.version_number }} - changelog: ${{ steps.release_metadata.outputs.changelog }} - steps: - - uses: apify/workflows/git-cliff-release@main - name: Prepare release metadata - id: release_metadata - with: - release_type: prerelease - existing_changelog_path: CHANGELOG.md - wait_for_checks: + # Run ONLY when PR has the "beta" label + if: contains(github.event.pull_request.labels.*.name, 'beta') name: Wait for code checks to pass runs-on: ubuntu-latest steps: - - uses: lewagon/wait-on-check-action@v1.3.4 + - name: Wait for existing checks or skip if none + uses: lewagon/wait-on-check-action@v1.3.4 with: - ref: ${{ github.ref }} + ref: ${{ github.event.pull_request.head.sha }} repo-token: ${{ secrets.GITHUB_TOKEN }} check-regexp: (Code checks) - wait-interval: 5 - - update_changelog: - needs: [ release_metadata, wait_for_checks ] - name: Update changelog + wait-interval: 10 + running-workflow-name: 'Wait for code checks to pass' + allowed-conclusions: success,neutral,skipped + continue-on-error: false + + push_pkg_pr_new: + needs: [ wait_for_checks ] + name: Push to pkg.pr.new 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 }} + ref: ${{ github.event.pull_request.head.ref }} + repository: ${{ github.event.pull_request.head.repo.full_name }} - - 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 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 and package version [skip ci]" - - publish_to_npm: - name: Publish to NPM - needs: [ release_metadata, wait_for_checks ] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ needs.update_changelog.changelog_commitish }} - 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 - - # Check version consistency and increment pre-release version number for beta only. - name: Bump pre-release version - run: node ./.github/scripts/before-beta-release.cjs - - name: Build module + run: npm ci + + - name: Build run: npm run build - - name: Publish to NPM - run: npm publish --tag beta -env: - NODE_AUTH_TOKEN: ${{ secrets.APIFY_SERVICE_ACCOUNT_NPM_TOKEN }} - NPM_TOKEN: ${{ secrets.APIFY_SERVICE_ACCOUNT_NPM_TOKEN }} + - run: npx -y pkg-pr-new publish diff --git a/README.md b/README.md index e11fd717..d34bdcfe 100644 --- a/README.md +++ b/README.md @@ -233,6 +233,12 @@ npx @modelcontextprotocol/inspector node ./dist/stdio.js Upon launching, the Inspector will display a URL that you can open in your browser to begin debugging. +## 🐦 Canary PR releases + +Due to the current architecture where Apify MCP is split across two repositories, this one containing the core MCP logic and the private [apify-mcp-server](https://github.com/apify/apify-mcp-server) repository that handles the actual server implementation for [mcp.apify.com](https://mcp.apify.com), development can be challenging as changes need to be synchronized between both repositories. + +You can create a canary release from your PR branch by adding the `beta` tag. This will test the code and publish the package to [pkg.pr.new](https://pkg.pr.new/) which you can then use, for example, in a staging environment to test before actually merging the changes. This way we do not need to create new NPM releases and keep the NPM versions cleaner. The workflow runs whenever you commit to a PR branch that has the `beta` tag or when you add the `beta` tag to an already existing PR. For more details check out [the workflow file](.github/workflows/pre_release.yaml). + # 🐛 Troubleshooting (local MCP server) - Make sure you have `node` installed by running `node -v`.