Skip to content

Commit

Permalink
ci: Set up an automated release process (#691)
Browse files Browse the repository at this point in the history
- closes #496

---------

Co-authored-by: Vlad Frangu <[email protected]>
  • Loading branch information
janbuchar and vladfrangu authored Nov 7, 2024
1 parent 433c154 commit e9b35f5
Show file tree
Hide file tree
Showing 3 changed files with 340 additions and 126 deletions.
128 changes: 2 additions & 126 deletions .github/workflows/check.yaml
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
Expand All @@ -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 }}
Expand Down Expand Up @@ -128,6 +123,7 @@ jobs:
cd website
yarn
yarn build
lint:
name: Lint
runs-on: ubuntu-latest
Expand Down Expand Up @@ -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 }}
133 changes: 133 additions & 0 deletions .github/workflows/pre_release.yaml
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 }}
Loading

0 comments on commit e9b35f5

Please sign in to comment.