From d63dca7027bb1c90db1306ccdf767de5651ee6b0 Mon Sep 17 00:00:00 2001 From: foxriver76 Date: Thu, 25 Jul 2024 08:15:49 +0200 Subject: [PATCH] allow to release via PR --- .github/workflows/auto-approve.yml | 17 +++++ .github/workflows/create-release.yml | 89 +++++++++++++++++++++++ .github/workflows/test-and-release.yml | 98 ++++++++++++++------------ 3 files changed, 159 insertions(+), 45 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 0000000..35c6780 --- /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 == 'foxriver76' && + 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 0000000..8d80a86 --- /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: foxriver76 + author: foxriver76 + 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: foxriver76 + 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 55f262e..c3bb4b0 100644 --- a/.github/workflows/test-and-release.yml +++ b/.github/workflows/test-and-release.yml @@ -87,83 +87,91 @@ jobs: # run: set DEBUG=testing:* & npm run test:integration # Deploys the final package to NPM - deploy: + 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: - - name: Checkout code - uses: actions/checkout@v3 + - id: automerge + name: automerge + uses: "pascalgn/automerge-action@v0.16.3" + env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + MERGE_LABELS: "automated pr 🔧" + MERGE_FILTER_AUTHOR: "foxriver76" + MERGE_FORKS: "false" + MERGE_DELETE_BRANCH: "false" + UPDATE_LABELS: "automated pr 🔧" + MERGE_METHOD: "squash" + MERGE_COMMIT_MESSAGE: "pull-request-title-and-description" + + - name: Checkout repository + 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 16.x - uses: actions/setup-node@v3 + - name: Use Node.js 18 + if: steps.automerge.outputs.mergeResult == 'merged' + uses: actions/setup-node@v4 with: - node-version: 16.x + node-version: 18 - - 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: Install dependencies + if: steps.automerge.outputs.mergeResult == 'merged' + run: npm i + + - name: Build + if: steps.automerge.outputs.mergeResult == 'merged' + run: npm run build + + - 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'}" BODY="${BODY//$'\r'/'%0D'}" echo "::set-output name=BODY::$BODY" - - name: Install Dependencies - run: npm install - - - name: Build - run: npm run build - -# - name: Create a clean build -# run: npm run build - name: Publish legacy 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: Publish types package to npm + if: steps.automerge.outputs.mergeResult == 'merged' working-directory: build run: | 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, '-') }} - body: ${{ steps.extract_release.outputs.BODY }} - -# - name: Notify Sentry.io about the release -# 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-devices -# export SENTRY_VERSION=iobroker.devices@${{ env.VERSION }} -# sentry-cli releases new $SENTRY_VERSION -# sentry-cli releases finalize $SENTRY_VERSION - - # Add the following line BEFORE finalize if repositories are connected in Sentry - # sentry-cli releases set-commits $SENTRY_VERSION --auto - - # Add the following line BEFORE finalize if sourcemap uploads are needed - # sentry-cli releases files $SENTRY_VERSION upload-sourcemaps build/ \ No newline at end of file + prerelease: ${{ contains(steps.version.outputs.result, '-') }} + body: ${{ steps.extract_release.outputs.BODY }} \ No newline at end of file