-
Notifications
You must be signed in to change notification settings - Fork 19
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ci: Set up an automated release process (#691)
- closes #496 --------- Co-authored-by: Vlad Frangu <[email protected]>
- Loading branch information
1 parent
433c154
commit e9b35f5
Showing
3 changed files
with
340 additions
and
126 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
# This workflow runs for every pull request to lint and test the proposed changes. | ||
|
||
name: Check & Release | ||
name: Check | ||
|
||
on: | ||
# Push to master will deploy a beta version | ||
|
@@ -25,11 +25,6 @@ jobs: | |
node-version: [18, 20, 22] | ||
|
||
steps: | ||
- name: Cancel Workflow Action | ||
uses: styfle/[email protected] | ||
with: | ||
access_token: ${{ github.token }} | ||
|
||
- uses: actions/checkout@v4 | ||
|
||
- name: Use Node.js ${{ matrix.node-version }} | ||
|
@@ -128,6 +123,7 @@ jobs: | |
cd website | ||
yarn | ||
yarn build | ||
lint: | ||
name: Lint | ||
runs-on: ubuntu-latest | ||
|
@@ -158,123 +154,3 @@ jobs: | |
|
||
- name: Run format checks | ||
run: yarn format | ||
|
||
# The deploy job is long but there are only 2 important parts. NPM publish | ||
# and triggering of docker image builds in the apify-actor-docker repo. | ||
deploy: | ||
name: Publish to NPM | ||
if: github.repository_owner == 'apify' && (github.ref == 'refs/heads/master' || github.event_name == 'release') && !contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, 'docs:') | ||
needs: [build_and_test, test_python_support, lint] | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/checkout@v4 | ||
with: | ||
token: ${{ secrets.APIFY_SERVICE_ACCOUNT_GITHUB_TOKEN }} | ||
fetch-depth: 0 | ||
|
||
- name: Use Node.js 20 | ||
uses: actions/setup-node@v4 | ||
with: | ||
node-version: 20 | ||
registry-url: https://registry.npmjs.org | ||
|
||
- name: Enable corepack | ||
run: | | ||
corepack enable | ||
corepack prepare yarn@stable --activate | ||
- name: Activate cache for Node.js 20 | ||
uses: actions/setup-node@v4 | ||
with: | ||
cache: yarn | ||
|
||
- name: Set git identity | ||
run: | | ||
git config --global user.name 'Apify Service Account' | ||
git config --global user.email '[email protected]' | ||
- name: Install Dependencies | ||
run: yarn | ||
|
||
# Determine if this is a beta or latest release | ||
- name: Set Release Tag | ||
run: echo "RELEASE_TAG=$(if [ ${{ github.event_name }} = release ]; then echo latest; else echo beta; fi)" >> $GITHUB_ENV | ||
|
||
# Check version consistency and increment pre-release version number for beta only. | ||
- name: Bump pre-release version | ||
if: env.RELEASE_TAG == 'beta' | ||
run: yarn tsx ./.github/scripts/before-beta-release.ts | ||
|
||
- name: Publish to NPM | ||
run: | | ||
yarn config set npmAuthToken ${NODE_AUTH_TOKEN} | ||
yarn npm publish --tag ${{ env.RELEASE_TAG }} --access public | ||
env: | ||
NODE_AUTH_TOKEN: ${{ secrets.APIFY_SERVICE_ACCOUNT_NPM_TOKEN }} | ||
|
||
# Latest version is tagged by the release process so we only tag beta here. | ||
- name: Tag Version | ||
if: env.RELEASE_TAG == 'beta' | ||
run: | | ||
git_tag=v`node -p "require('./package.json').version"` | ||
git tag $git_tag | ||
git push origin $git_tag | ||
- name: Update readme | ||
if: env.RELEASE_TAG == 'latest' | ||
run: | | ||
git update-index --assume-unchanged .yarnrc.yml | ||
git add . | ||
git diff-index --quiet HEAD || git commit -m "[skip ci] update README with latest command reference" | ||
git push origin HEAD:master | ||
update_homebrew_formula: | ||
name: Update Homebrew Formula | ||
needs: [deploy] | ||
runs-on: ubuntu-latest | ||
if: github.repository_owner == 'apify' && github.event_name == 'release' && github.event.action == 'published' | ||
steps: | ||
- name: Checkout repository | ||
uses: actions/checkout@v4 | ||
|
||
- name: Set git identity | ||
run: | | ||
git config --global user.name 'Apify Service Account' | ||
git config --global user.email '[email protected]' | ||
- name: Set up Homebrew | ||
uses: Homebrew/actions/setup-homebrew@master | ||
|
||
# It can happen that the updated package version is not available right after the `npm publish` command finishes | ||
# Try waiting 3 minutes until the updated package version is available | ||
- name: Wait for updated package to be available on NPM | ||
run: | | ||
PACKAGE_VERSION=`node -p "require('./package.json').version"` | ||
PACKAGE_DEFINITION_URL="https://registry.npmjs.org/apify-cli/${PACKAGE_VERSION}" | ||
for _i in {1..30}; do | ||
curl -sf "${PACKAGE_DEFINITION_URL}" &> /dev/null && exit 0; | ||
echo "Package 'apify-cli' version '${PACKAGE_VERSION}' is not available yet, will retry in 10 seconds." | ||
sleep 10; | ||
done | ||
curl -sf "${PACKAGE_DEFINITION_URL}" &> /dev/null || exit 1; | ||
- name: Update Homebrew formula in apify/homebrew-tap repo | ||
run: | | ||
PACKAGE_VERSION=`node -p "require('./package.json').version"` | ||
gh workflow run update_formula.yaml --repo apify/homebrew-tap --field package=apify-cli --field version=$PACKAGE_VERSION | ||
env: | ||
GH_TOKEN: ${{ secrets.APIFY_SERVICE_ACCOUNT_GITHUB_TOKEN }} | ||
|
||
- name: Send PR with formula update to homebrew/homebrew-core repo | ||
run: | | ||
PACKAGE_VERSION=`node -p "require('./package.json').version"` | ||
brew tap --force homebrew/core | ||
brew bump-formula-pr apify-cli \ | ||
--version ${PACKAGE_VERSION} \ | ||
--no-browse \ | ||
--message "Automatic update of the \`apify-cli\` formula. | ||
CC @B4nan @vladfrangu" | ||
env: | ||
HOMEBREW_GITHUB_API_TOKEN: ${{ secrets.APIFY_SERVICE_ACCOUNT_GITHUB_TOKEN }} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,133 @@ | ||
name: Create a pre-release | ||
|
||
on: | ||
# Push to master will deploy a beta version | ||
push: | ||
branches: | ||
- master | ||
tags-ignore: | ||
- "**" # Ignore all tags to prevent duplicate builds when tags are pushed. | ||
|
||
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: | ||
name: Wait for code checks to pass | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: lewagon/[email protected] | ||
with: | ||
ref: ${{ github.ref }} | ||
repo-token: ${{ secrets.GITHUB_TOKEN }} | ||
check-regexp: (Build & Test .*|Test Python template support|Lint|Docs build) | ||
wait-interval: 5 | ||
|
||
update_changelog: | ||
needs: [release_metadata, wait_for_checks] | ||
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 | ||
registry-url: https://registry.npmjs.org | ||
|
||
- name: Enable corepack | ||
run: | | ||
corepack enable | ||
corepack prepare yarn@stable --activate | ||
git update-index --assume-unchanged .yarnrc.yml | ||
- name: Activate cache for Node.js 22 | ||
uses: actions/setup-node@v4 | ||
with: | ||
cache: yarn | ||
|
||
- name: Update README | ||
run: | | ||
yarn npm pack | ||
- name: Update package version in package.json | ||
run: yarn 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: [email protected] | ||
message: "chore(release): Update changelog and package version [skip ci]" | ||
|
||
publish_to_npm: | ||
name: Publish to NPM | ||
needs: [update_changelog] | ||
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 | ||
registry-url: https://registry.npmjs.org | ||
|
||
- name: Enable corepack | ||
run: | | ||
corepack enable | ||
corepack prepare yarn@stable --activate | ||
- name: Activate cache for Node.js 22 | ||
uses: actions/setup-node@v4 | ||
with: | ||
cache: yarn | ||
|
||
- name: Install dependencies | ||
run: yarn | ||
|
||
# Check version consistency and increment pre-release version number for beta only. | ||
- name: Bump pre-release version | ||
run: yarn tsx ./.github/scripts/before-beta-release.ts | ||
|
||
- name: Build module | ||
run: yarn build | ||
|
||
- name: Publish to NPM | ||
run: | | ||
yarn config set npmAuthToken ${NODE_AUTH_TOKEN} | ||
yarn npm publish --tag beta --access public | ||
env: | ||
NODE_AUTH_TOKEN: ${{ secrets.APIFY_SERVICE_ACCOUNT_NPM_TOKEN }} |
Oops, something went wrong.