From b3d24e63acd79c802bd22174ce4e9fb6790755cd Mon Sep 17 00:00:00 2001 From: Horst Gutmann Date: Wed, 9 Oct 2024 12:03:22 +0200 Subject: [PATCH] chore(ci): Add release-please for release-automation --- .github/workflows/release-binaries.yml | 91 ++++++++++++++++++++++++++ .github/workflows/release-please.yml | 26 ++++++++ .github/workflows/release.yml | 50 -------------- .release-please-manifest.json | 1 + .release-please.json | 60 +++++++++++++++++ CHANGELOG.md | 2 +- 6 files changed, 179 insertions(+), 51 deletions(-) create mode 100644 .github/workflows/release-binaries.yml create mode 100644 .github/workflows/release-please.yml delete mode 100644 .github/workflows/release.yml create mode 100644 .release-please-manifest.json create mode 100644 .release-please.json diff --git a/.github/workflows/release-binaries.yml b/.github/workflows/release-binaries.yml new file mode 100644 index 000000000..0b27ed88a --- /dev/null +++ b/.github/workflows/release-binaries.yml @@ -0,0 +1,91 @@ +name: Release binaries + +on: + release: + types: + - created + +jobs: + build-binaries: + runs-on: ubuntu-latest + steps: + - uses: actions/create-github-app-token@5d869da34e18e7287c1daad50e0b8ea0f506ce69 # v1.11.0 + id: app-token + with: + app-id: ${{ secrets.TANKABOT_APP_ID }} + private-key: ${{ secrets.TANKABOT_APP_PRIVATE_KEY }} + + # At first we should wait for a release to be created by the + # release-please workflow + - name: Check for release + id: lookup-release + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const timers = require('node:timers/promises'); + const ref = context.ref; + if (!ref.startsWith('refs/tags/')) { + core.setFailed('Not a valid ref'); + return; + } + const currentTag = ref.substring('refs/tags/'.length); + core.info(`Looking for release associated with '${currentTag}'`); + let remainingAttempts = 6; + while (remainingAttempts > 0) { + try { + const release = await github.rest.repos.getReleaseByTag({owner: context.repo.owner, repo: context.repo.repo, tag: currentTag}); + core.info(`Release found: ${release.data.id}'`); + core.setOutput('release_id', release.data.id); + return; + } catch (e) { + if (remainingAttempts === 1) { + if (e.status !== 404) { + console.log(e); + } + } + remainingAttempts -= 1; + await timers.setTimeout(10000); + } + } + core.setFailed('Release not found'); + + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 + with: + # https://github.com/actions/checkout/issues/1467 + fetch-depth: 0 + + - uses: ./.github/actions/setup-goversion + + - name: Build binaries + run: make cross + + - name: Attach binaries + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + github-token: ${{ steps.app-token.outputs.token }} + script: | + const path = require('node:path'); + const fs = require('node:fs/promises'); + + const releaseId = '${{ steps.lookup-release.outputs.release_id }}'; + const globber = await glob.create('dist/*'); + + for await (const file of globber.globGenerator()) { + const filename = path.basename(file); + try { + await github.rest.repos.uploadReleaseAsset({ + owner: context.repo.owner, + repo: context.repo.repo, + release_id: releaseId, + name: filename, + data: await fs.readFile(file), + }); + } catch (e) { + if (e.status === 422) { + core.setFailed(`${filename} already attached to release`); + return; + } + throw e; + } + } + diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 000000000..7ccecccd8 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,26 @@ +on: + push: + branches: + - main + +permissions: + contents: write + pull-requests: write + +name: release-please + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - uses: actions/create-github-app-token@5d869da34e18e7287c1daad50e0b8ea0f506ce69 # v1.11.0 + id: app-token + with: + app-id: ${{ secrets.TANKABOT_APP_ID }} + private-key: ${{ secrets.TANKABOT_APP_PRIVATE_KEY }} + + - uses: googleapis/release-please-action@7987652d64b4581673a76e33ad5e98e3dd56832f # v4.1.3 + with: + config-file: .release-please.json + manifest-file: .release-please-manifest.json + github-token: ${{ steps.app-token.outputs.token }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 60c090c09..000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Release - -on: - push: - tags: - - v* - -permissions: - contents: write - -jobs: - release: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - with: - # https://github.com/actions/checkout/issues/1467 - fetch-depth: 0 - - uses: ./.github/actions/setup-goversion - - run: make cross - - id: docker_tag - run: echo "DOCKER_TAG=${GITHUB_REF_NAME#v}" >> "$GITHUB_ENV" - - name: Release - uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191 # v2.0.8 - with: - body: | - This is release `${{ github.ref_name }}` of Tanka (`tk`). - - ## Install instructions - - #### Binary: - ```bash - # download the binary (adapt os and arch as needed) - $ curl -fSL -o "/usr/local/bin/tk" "https://github.com/grafana/tanka/releases/download/${{ github.ref_name }}/tk-linux-amd64" - - # make it executable - $ chmod a+x "/usr/local/bin/tk" - - # have fun :) - $ tk --help - ``` - - #### Docker container: - https://hub.docker.com/r/grafana/tanka - ```bash - $ docker pull grafana/tanka:${{ env.DOCKER_TAG }} - ``` - draft: true - files: | - dist/* diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 000000000..2d8c67d51 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1 @@ +{".": "0.28.3"} diff --git a/.release-please.json b/.release-please.json new file mode 100644 index 000000000..31be90c2d --- /dev/null +++ b/.release-please.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "changelog-sections": [ + { + "section": "🎉 Features", + "type": "feat" + }, + { + "section": "🐛 Bug Fixes", + "type": "fix" + }, + { + "section": "⚡ Performance Improvements", + "type": "perf" + }, + { + "section": "🔗 Dependencies", + "type": "deps" + }, + { + "section": "📝 Documentation", + "type": "docs" + }, + { + "section": "🏗️ Build System", + "type": "build" + }, + { + "section": "🤖 Continuous Integration", + "type": "ci" + }, + { + "section": "🔧 Miscellaneous Chores", + "type": "chore" + }, + { + "section": "⏪ Reverts", + "type": "revert" + }, + { + "section": "✅ Tests", + "type": "test" + }, + { + "section": "💄 Style", + "type": "style" + }, + { + "section": "♻️ Code Refactoring", + "type": "refactor" + } + ], + "draft-pull-request": true, + "include-v-in-tag": true, + "packages": { + ".": { + } + }, + "release-type": "go" +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 76fbbe1fb..1bdd2e5f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -For releases from v0.24.0 forward, you can find the changelog in Github releases: https://github.com/grafana/tanka/releases +For releases from v0.24.0 to v0.28.3, you can find the changelog in the GitHub releases: https://github.com/grafana/tanka/releases ## 0.23.1 (2022-09-28)