81 lines
3.8 KiB
YAML
81 lines
3.8 KiB
YAML
name: Publish to npm
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
version:
|
|
description: 'npm version to publish'
|
|
type: choice
|
|
required: true
|
|
options:
|
|
# these are defined in ${{vars.versions}}, but ghw doesn't support yet the use of expressions in inputs.
|
|
- 'patch (x.y.z+1, bug fixes)'
|
|
- 'minor (x.y+1.0, new functionality)'
|
|
- 'major (x+1.0.0, api breaking changes)'
|
|
dry_run:
|
|
description: 'Dry run (perform all steps except git push & npm publish)'
|
|
type: boolean
|
|
default: true
|
|
required: true
|
|
jobs:
|
|
build:
|
|
uses: ./.github/workflows/build.yml
|
|
|
|
publish-npm:
|
|
needs: build
|
|
runs-on: macos-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
fetch-tags: true
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 20
|
|
registry-url: https://registry.npmjs.org/
|
|
- run: npm ci
|
|
- name: Setup versions in ${{'${{env}}'}}
|
|
run: |
|
|
# git tag -d v3.2.0 || true
|
|
# git push --delete origin v3.2.0 || true # for testing purposes only
|
|
# It sounds like a joke, but npm version doesn't have a way to print the version of the current package.
|
|
# Using python here instead of nodejs because it's too convoluted to just read the whole stdin.
|
|
CURRENT_PKG_VERSION="$(npm version --json | python3 -c 'import json; import sys; print(json.loads(sys.stdin.read()).get("jschardet"))')"
|
|
CURRENT_TAG_VERSION="$(git tag --list 'v*' --sort='-version:refname' | head -1)"
|
|
CURRENT_PUBLISHED_VERSION="$(npm view jschardet version)"
|
|
echo "CURRENT_TAG_VERSION=$CURRENT_TAG_VERSION"
|
|
echo "CURRENT_PKG_VERSION=$CURRENT_PKG_VERSION"
|
|
echo "CURRENT_PUBLISHED_VERSION=$CURRENT_PUBLISHED_VERSION"
|
|
if [ "$CURRENT_PKG_VERSION" != "$CURRENT_PUBLISHED_VERSION" ]; then
|
|
echo "::warning::Current package version doesn't match current published version ($CURRENT_PKG_VERSION ≠ $CURRENT_PUBLISHED_VERSION)"
|
|
fi
|
|
if [ "$CURRENT_TAG_VERSION" != "v$CURRENT_PKG_VERSION" ]; then
|
|
echo "::warning::Current tag version doesn't match current package version ($CURRENT_TAG_VERSION ≠ $CURRENT_PKG_VERSION)"
|
|
fi
|
|
echo "CURRENT_PKG_VERSION=$CURRENT_PKG_VERSION" >> "$GITHUB_ENV"
|
|
echo "CURRENT_TAG_VERSION=$CURRENT_TAG_VERSION" >> "$GITHUB_ENV"
|
|
echo "CURRENT_PUBLISHED_VERSION=$CURRENT_PUBLISHED_VERSION" >> "$GITHUB_ENV"
|
|
echo "SEMVER_UPDATE=${{fromJSON(vars.versions).values[inputs.version]}}" >> "$GITHUB_ENV"
|
|
- name: Version package
|
|
run: |
|
|
npm version ${{env.SEMVER_UPDATE}}
|
|
echo "VERSION=$(git show -s --format=%s)" >> "$GITHUB_ENV"
|
|
- name: Amend with changelog
|
|
run: |
|
|
CHANGELOG="${{runner.temp}}/changelog.txt"
|
|
echo -e "Version ${{env.VERSION}} (${{env.SEMVER_UPDATE}} update)\n" >> "$CHANGELOG"
|
|
echo -e "Changes since ${{env.CURRENT_PKG_VERSION}}:" >> "$CHANGELOG"
|
|
git log --pretty='format:%h %s' ${{env.CURRENT_TAG_VERSION}}..HEAD~1 | grep -v '.yml' | grep -v '\[devop\]' >> "$CHANGELOG"
|
|
echo "" >> "$CHANGELOG"
|
|
BASE_PKG_VERSION="$CURRENT_PUBLISHED_VERSION" ./scripts/show-size-changes.sh dist/* | tee -a "$CHANGELOG"
|
|
git commit --amend -F "$CHANGELOG"
|
|
# Move the version tag to the new amended commit.
|
|
git tag -f -m '${{env.VERSION}}' 'v${{env.VERSION}}'
|
|
git show -s --format=%B
|
|
- name: Push new version
|
|
if: inputs.dry_run == false
|
|
run: git push --atomic origin ${{github.ref_name}} $(git tag --points-at HEAD)
|
|
- name: Publish to npm
|
|
if: inputs.dry_run == false
|
|
run: npm publish
|
|
env:
|
|
NODE_AUTH_TOKEN: ${{secrets.npm_token}}
|