From 95f906050c5d4029847ae888b69568d19c01444f Mon Sep 17 00:00:00 2001 From: Max Hauser Date: Wed, 7 Aug 2024 19:21:12 +0200 Subject: [PATCH] prepared release PR workflow (#1673) --- .github/workflows/auto-approve.yml | 17 +++++ .github/workflows/create-release.yml | 89 ++++++++++++++++++++++++++ .github/workflows/test-and-release.yml | 78 +++++++++++++--------- README.md | 3 +- package.json | 5 +- 5 files changed, 158 insertions(+), 34 deletions(-) create mode 100644 .github/workflows/auto-approve.yml create mode 100644 .github/workflows/create-release.yml diff --git a/.github/workflows/auto-approve.yml b/.github/workflows/auto-approve.yml new file mode 100644 index 000000000..c81c995f4 --- /dev/null +++ b/.github/workflows/auto-approve.yml @@ -0,0 +1,17 @@ +name: Auto approve + +on: + pull_request: + types: [labeled] + +jobs: + auto-approve: + if: | + github.actor == 'foxbot76' && + github.event.label.name == 'automated pr 🔧' + + runs-on: ubuntu-latest + steps: + - uses: hmarr/auto-approve-action@v4 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml new file mode 100644 index 000000000..551970ed9 --- /dev/null +++ b/.github/workflows/create-release.yml @@ -0,0 +1,89 @@ +name: Official release + +on: + workflow_dispatch: # Manually on demand + inputs: + versionBump: + description: 'Type of version bump' + required: true + default: 'patch' + type: choice + options: + - patch + - minor + - major + +jobs: + publish-config: + runs-on: ubuntu-20.04 + + strategy: + matrix: + node: [20.x] # This should be LTS + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch the history, or this action won't work + + - name: Use Node.js ${{ matrix.node }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + + - name: Install dependencies + run: npm ci + + - name: Test + run: npm test + + - name: Prepare release + env: + VERSION_BUMP: ${{ inputs.versionBump }} + run: | + git config --global user.email "moritz.heusinger@gmail.com" + git config --global user.name "Github Action" + + npm run release -- ${VERSION_BUMP} + + - name: Determine the version bump + id: version + uses: actions/github-script@v7 + with: + result-encoding: string + script: | + const package = require('./package.json'); + return package.version + + - name: Extract the commit body + id: extract_release + # The body may be multiline, therefore we need to escape some characters + run: | + VERSION="${{ github.ref }}" + VERSION=${VERSION##*/v} + echo "::set-output name=VERSION::$VERSION" + BODY=$(git show -s --format=%b) + BODY="${BODY//'%'/'%25'}" + BODY="${BODY//$'\n'/'%0A'}" + BODY="${BODY//$'\r'/'%0D'}" + echo "::set-output name=BODY::$BODY" + + - name: Create Pull Request + id: cpr + uses: peter-evans/create-pull-request@v6 + with: + token: ${{ secrets.PR_TOKEN }} + commit-message: "[OFFICIAL RELEASE] ${{ steps.version.outputs.result }}" + committer: foxbot76 + author: foxbot76 + signoff: false + branch: official-release + delete-branch: true + title: "[OFFICIAL RELEASE] ${{ steps.version.outputs.result }}" + body: | + ${{ steps.extract_release.outputs.BODY }} + labels: | + automated pr 🔧 + assignees: foxbot76 + draft: false \ No newline at end of file diff --git a/.github/workflows/test-and-release.yml b/.github/workflows/test-and-release.yml index 62c85a484..73dda4ea0 100644 --- a/.github/workflows/test-and-release.yml +++ b/.github/workflows/test-and-release.yml @@ -81,43 +81,58 @@ jobs: - name: Run local tests run: npm test -# - name: Run unit tests -# run: npm run test:unit -# - name: Run integration tests # (linux/osx) -# if: startsWith(runner.OS, 'windows') == false -# run: DEBUG=testing:* npm run test:integration -# - name: Run integration tests # (windows) -# if: startsWith(runner.OS, 'windows') -# run: set DEBUG=testing:* & npm run test:integration - - # Deploys the final package to NPM - deploy: + + # Merges and deploys the final package to NPM + auto-merge: needs: [adapter-tests] - # Trigger this step only when a commit on master is tagged with a version number if: | - contains(github.event.head_commit.message, '[skip ci]') == false && - github.event_name == 'push' && - startsWith(github.ref, 'refs/tags/') + always() && + github.event_name == 'pull_request' runs-on: ubuntu-latest steps: + - id: automerge + name: automerge + uses: "pascalgn/automerge-action@v0.16.3" + env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + MERGE_LABELS: "automated pr 🔧" + MERGE_FILTER_AUTHOR: "foxbot76" + MERGE_FORKS: "false" + MERGE_DELETE_BRANCH: "false" + UPDATE_LABELS: "automated pr 🔧" + MERGE_METHOD: "squash" + MERGE_COMMIT_MESSAGE: "pull-request-title-and-description" + - name: Checkout code + if: steps.automerge.outputs.mergeResult == 'merged' uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch the history, or this action won't work + ref: 'master' - name: Use Node.js ${{ matrix.node-version }} + if: steps.automerge.outputs.mergeResult == 'merged' uses: actions/setup-node@v4 with: node-version: 20.x - - name: Extract the version and commit body from the tag + - name: Determine version + if: steps.automerge.outputs.mergeResult == 'merged' + id: version + uses: actions/github-script@v7 + with: + result-encoding: string + script: | + return require('./package.json').version; + + + - name: Extract the commit body + if: steps.automerge.outputs.mergeResult == 'merged' id: extract_release # The body may be multiline, therefore we need to escape some characters run: | - VERSION="${{ github.ref }}" - VERSION=${VERSION##*/} - VERSION=${VERSION##*v} - echo "::set-output name=VERSION::$VERSION" BODY=$(git show -s --format=%b) BODY="${BODY//'%'/'%25'}" BODY="${BODY//$'\n'/'%0A'}" @@ -125,51 +140,56 @@ jobs: echo "::set-output name=BODY::$BODY" - name: Install Dependencies + if: steps.automerge.outputs.mergeResult == 'merged' run: npm install - name: Create a clean build + if: steps.automerge.outputs.mergeResult == 'merged' run: npm run build + - name: Publish package to npm + if: steps.automerge.outputs.mergeResult == 'merged' run: | npm config set //registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }} npm whoami npm publish - name: Create Github Release - uses: actions/create-release@v1 + if: steps.automerge.outputs.mergeResult == 'merged' + uses: ncipollo/release-action@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - tag_name: ${{ github.ref }} - release_name: Release v${{ steps.extract_release.outputs.VERSION }} + tag: v${{ steps.version.outputs.result }} + name: Release v${{ steps.version.outputs.result }} draft: false - # Prerelease versions create pre-releases on GitHub - prerelease: ${{ contains(steps.extract_release.outputs.VERSION, '-') }} + prerelease: ${{ contains(steps.version.outputs.result, '-') }} body: ${{ steps.extract_release.outputs.BODY }} - name: Notify Sentry.io about the release + if: steps.automerge.outputs.mergeResult == 'merged' run: | npm i -g @sentry/cli export SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }} export SENTRY_URL=https://sentry.iobroker.net export SENTRY_ORG=iobroker export SENTRY_PROJECT=iobroker-javascript - export SENTRY_VERSION=iobroker.javascript@${{ steps.extract_release.outputs.VERSION }} + export SENTRY_VERSION=iobroker.javascript@${{ steps.version.outputs.result }} sentry-cli releases new $SENTRY_VERSION sentry-cli releases set-commits $SENTRY_VERSION --auto sentry-cli releases finalize $SENTRY_VERSION # Add the following line BEFORE finalize if sourcemap uploads are needed # sentry-cli releases files $SENTRY_VERSION upload-sourcemaps build/ - - name: Notify Sentry.io about the release of frontend + if: steps.automerge.outputs.mergeResult == 'merged' run: | npm i -g @sentry/cli export SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }} export SENTRY_URL=https://sentry.iobroker.net export SENTRY_ORG=iobroker export SENTRY_PROJECT=iobroker-javascript-react - export SENTRY_VERSION=iobroker.javascript-react@${{ steps.extract_release.outputs.VERSION }} + export SENTRY_VERSION=iobroker.javascript-react@${{ steps.version.outputs.result }} sentry-cli releases new $SENTRY_VERSION sentry-cli releases set-commits $SENTRY_VERSION --auto - sentry-cli releases finalize $SENTRY_VERSION + sentry-cli releases finalize $SENTRY_VERSION \ No newline at end of file diff --git a/README.md b/README.md index 7b57d3e34..0fd88785a 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,9 @@ Executes Javascript, Typescript Scripts. + ### **WORK IN PROGRESS** -* (bluefox) packages were updated +* (@GermanBluefox) updated dependencies ### 8.8.0 (2024-08-05) * (@klein0r) Added option to register notifications via scripts diff --git a/package.json b/package.json index b3468684b..773e41c45 100644 --- a/package.json +++ b/package.json @@ -97,10 +97,7 @@ "//postinstall": "node ./install/installTypings.js", "prepublishOnly": "node node_modules/gulp/bin/gulp.js", "build": "node node_modules/gulp/bin/gulp.js", - "release": "release-script", - "release-patch": "release-script patch --yes", - "release-minor": "release-script minor --yes", - "release-major": "release-script major --yes", + "release": "release-script --noPush -y", "update-packages": "ncu --upgrade && cd src && ncu --upgrade && cd ../src-admin && ncu --upgrade", "npm": "npm i && cd src && npm i -f && cd ../src-admin && npm i -f" }