Skip to content

ci(changesets): versioning packages - v0.89.0 @ master #12315

ci(changesets): versioning packages - v0.89.0 @ master

ci(changesets): versioning packages - v0.89.0 @ master #12315

Workflow file for this run

name: "Lint PR"
on:
pull_request:
types:
- opened
- edited
- synchronize
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
dependency-check:
name: Validate Dependencies
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: CI Setup
uses: ./.github/actions/ci-setup
- name: Validate Dependencies
run: pnpm depcheck
validate-title:
name: Validate PR title
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v4
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
types: |
feat
fix
chore
build
docs
ci
rc
- name: Check PR title length
env:
TITLE: ${{ github.event.pull_request.title }}
run: |
title_length=${#TITLE}
if [ $title_length -gt 72 ]
then
echo "PR title is too long (greater than 72 characters)"
exit 1
fi
validate-changeset:
name: Validate PR Changeset
if: startsWith(github.head_ref, 'changeset-release') != true
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: CI Setup
uses: ./.github/actions/ci-setup
- name: Validate Changeset
run: pnpm changeset status --since=origin/${{ github.base_ref }}
- name: Validate Changeset Content
run: |
CHANGESET_FILE=$(git diff --diff-filter=A --name-only origin/${{ github.base_ref }} .changeset/*.md)
if [ -z "$CHANGESET_FILE" ]; then
# A PR doesn't have to have a changeset when packages aren't affected
# e.g. when a script is added in the scripts folder
exit 0
fi
echo "CHANGESET_FILE=$(echo "$CHANGESET_FILE")" >> $GITHUB_ENV
AFFECTED_PACKAGES=$(sed -n '/---/,/---/p' "$CHANGESET_FILE" | sed '/---/d')
if [ -z "$AFFECTED_PACKAGES" ]; then
# The changelog logic ignores changesets that don't affect any packages so we can ignore them here as well,
# because this changeset linting logic is only for changesets who's PRs will be referenced in the changelog.
# The relevant changelog logic is here:
# https://github.com/FuelLabs/fuels-ts/blob/155b6f2fe28e988b277dac231af6d6a0cff1df0c/scripts/changeset/get-full-changelog.mts#L77
exit 0
fi
# TODO: Remove once v1.0.0 is released.
# Minor changes are treated as breaking until v1.0.0 is released.
if echo "$AFFECTED_PACKAGES" | grep -q 'minor'; then
if ! echo "$PR_TITLE" | grep -q '!'; then
echo "Changeset has `minor` changes. Please mark the PR as breaking by adding an exclamation mark to its title (e.g. fix!: xxx) or use a `patch` instead."
exit 1
fi
fi
CHANGESET_DESCRIPTION=$(sed 's/^\s*\|\s*$//g' "$CHANGESET_FILE" | tail -n1)
if [ "$CHANGESET_DESCRIPTION" != "$PR_TITLE" ]; then
echo "Changeset content does not match PR title. Please update the changeset to match the PR title."
echo "Changeset file: $CHANGESET_FILE"
echo "Changeset content:"
cat "$CHANGESET_FILE"
exit 1
fi
env:
PR_TITLE: ${{ github.event.pull_request.title }}
- name: Validate added changeset will be deleted
if: ${{ env.CHANGESET_FILE != '' }}
run: |
pnpm changeset version
if git status --porcelain .changeset | grep -q "D $CHANGESET_FILE"; then
git reset --hard
exit 0
fi
# Throw if changeset not in deleted changesets
echo "Changeset file $CHANGESET_FILE will not get deleted in the changesets PR. Check its affected packages."
exit 1
env:
CHANGESET_FILE: ${{ env.CHANGESET_FILE }}
- name: Validate that there are only patch changes
if: startsWith(github.base_ref, 'release/')
run: |
CHANGES=$(sed -n '/---/,/---/p' .changeset/*.md)
echo $CHANGES | grep -E 'patch' --silent && echo "Patch changes found." || (echo "No patch changes found." && exit 1)
echo $CHANGES | grep -E 'minor|major' --silent && echo "Old releases can only be patched; no minor and major versions allowed." && exit 1 || echo "No minor nor major changes."
- name: Validate that there was no release for the next patch version
if: startsWith(github.base_ref, 'release/')
run: |
pnpm changeset version
VERSION=$(sed -nE 's/^\s*"version": "(.*?)",$/\1/p' packages/fuels/package.json)
git reset --hard
STATUS_CODE=$(curl -s -w '%{http_code}\n' "https://www.npmjs.com/package/fuels/v/$VERSION" | tail -n1)
if [[ $STATUS_CODE != 404 ]]; then
echo "Release for version $VERSION already exists or curl received an unexpected result (result is $STATUS_CODE). Exiting."
exit 1
else
exit 0
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}