From 59aa7aae020f15d712f4a8d3ad22873db3435d01 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 14:52:20 +0100 Subject: [PATCH 01/12] deps: update actions/setup-go digest to 41dfa10 (#90) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ci.yaml | 6 +++--- .github/workflows/release.yaml | 2 +- .github/workflows/releaser-pleaser.yaml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4a4cb99..3946c95 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -13,7 +13,7 @@ jobs: uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 - name: Set up Go - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5 + uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5 with: go-version-file: go.mod @@ -30,7 +30,7 @@ jobs: uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 - name: Set up Go - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5 + uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5 with: go-version-file: go.mod @@ -49,7 +49,7 @@ jobs: uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 - name: Set up Go - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5 + uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5 with: go-version-file: go.mod diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index c73c1dd..585d7ea 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -17,7 +17,7 @@ jobs: uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 - name: Set up Go - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5 + uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5 with: go-version-file: go.mod diff --git a/.github/workflows/releaser-pleaser.yaml b/.github/workflows/releaser-pleaser.yaml index 2e3e4cb..4c54098 100644 --- a/.github/workflows/releaser-pleaser.yaml +++ b/.github/workflows/releaser-pleaser.yaml @@ -23,7 +23,7 @@ jobs: ref: main - name: Set up Go - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5 + uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5 with: go-version-file: go.mod From b6d6270d9e6f3d1dba6743f9f28ef604d8116012 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 14:52:43 +0100 Subject: [PATCH 02/12] deps: update actions/checkout digest to 11bd719 (#89) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ci.yaml | 6 +++--- .github/workflows/docs.yaml | 2 +- .github/workflows/mirror.yaml | 2 +- .github/workflows/release.yaml | 2 +- .github/workflows/releaser-pleaser.yaml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3946c95..fbc91b5 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Set up Go uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5 @@ -27,7 +27,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Set up Go uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5 @@ -46,7 +46,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Set up Go uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5 diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 2819083..974d953 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -13,7 +13,7 @@ jobs: id-token: write # To update the deployment status steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: lfs: "true" diff --git a/.github/workflows/mirror.yaml b/.github/workflows/mirror.yaml index 780e92a..e287aed 100644 --- a/.github/workflows/mirror.yaml +++ b/.github/workflows/mirror.yaml @@ -11,7 +11,7 @@ jobs: REMOTE: mirror steps: - name: Checkout - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: # Need all to fetch all tags so we can push them fetch-depth: 0 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 585d7ea..e912634 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Set up Go uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5 diff --git a/.github/workflows/releaser-pleaser.yaml b/.github/workflows/releaser-pleaser.yaml index 4c54098..5c1d0b4 100644 --- a/.github/workflows/releaser-pleaser.yaml +++ b/.github/workflows/releaser-pleaser.yaml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: ref: main From 79c5b13e1ff360f4f428a821d41afbb2d38c9e1c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 15:09:17 +0100 Subject: [PATCH 03/12] deps: update codecov/codecov-action action to v5 (#102) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index fbc91b5..74127eb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -38,7 +38,7 @@ jobs: run: go test -v -race -coverpkg=./... -coverprofile=coverage.txt ./... - name: Upload results to Codecov - uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4 + uses: codecov/codecov-action@3b1354a6c45db9f1008891f4eafc1a7e94ce1d18 # v5 with: token: ${{ secrets.CODECOV_TOKEN }} From 147148c8911f75d831c06b69ad4c68f99945e062 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 15:10:33 +0100 Subject: [PATCH 04/12] chore(config): migrate config .github/renovate.json5 (#104) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/renovate.json5 | 113 ++++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 58 deletions(-) diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 74a660e..1ab8788 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -1,80 +1,77 @@ { - "extends": [ - ":semanticCommits", - ":semanticCommitTypeAll(deps)", - ":semanticCommitScopeDisabled", - - ":dependencyDashboard", - ":approveMajorUpdates", - - ":automergeMinor", - ":automergeLinters", - ":automergeTesters", - ":automergeTypes", - - ":maintainLockFilesWeekly", - ":enableVulnerabilityAlerts", - "helpers:pinGitHubActionDigests" + extends: [ + ':semanticCommits', + ':semanticCommitTypeAll(deps)', + ':semanticCommitScopeDisabled', + ':dependencyDashboard', + ':approveMajorUpdates', + ':automergeMinor', + ':automergeLinters', + ':automergeTesters', + ':automergeTypes', + ':maintainLockFilesWeekly', + ':enableVulnerabilityAlerts', + 'helpers:pinGitHubActionDigests', ], - "packageRules": [ + packageRules: [ { - "groupName": "linters", - "matchUpdateTypes": [ - "minor", - "patch" + groupName: 'linters', + matchUpdateTypes: [ + 'minor', + 'patch', ], - "matchDepNames": [ - "golangci/golangci-lint" + matchDepNames: [ + 'golangci/golangci-lint', ], - "automerge": true + automerge: true, }, { - "groupName": "testing", - "matchUpdateTypes": [ - "minor", - "patch" + groupName: 'testing', + matchUpdateTypes: [ + 'minor', + 'patch', ], - "matchDepNames": [ - "github.com/stretchr/testify" + matchDepNames: [ + 'github.com/stretchr/testify', ], - "automerge": true + automerge: true, }, { - "groupName": "github-actions", - "matchUpdateTypes": [ - "minor", - "patch" + groupName: 'github-actions', + matchUpdateTypes: [ + 'minor', + 'patch', ], - "matchDepTypes": [ - "action" + matchDepTypes: [ + 'action', ], - "automerge": true + automerge: true, }, { - "groupName": "gitlab-ci", - "matchUpdateTypes": [ - "minor", - "patch" + groupName: 'gitlab-ci', + matchUpdateTypes: [ + 'minor', + 'patch', ], - "matchPackageNames": [ - "registry.gitlab.com/gitlab-org/release-cli" + matchPackageNames: [ + 'registry.gitlab.com/gitlab-org/release-cli', ], - "automerge": true - } + automerge: true, + }, ], - "customManagers": [ + customManagers: [ { - "customType": "regex", - "fileMatch": [ - ".+\\.ya?ml$" + customType: 'regex', + fileMatch: [ + '.+\\.ya?ml$', ], - "matchStrings": [ - ": (?.+) # renovate: datasource=(?[a-z-]+) depName=(?[^\\s]+)(?: lookupName=(?[^\\s]+))?(?: versioning=(?[a-z-]+))?(?: extractVersion=(?[^\\s]+))?" - ] - } + matchStrings: [ + ': (?.+) # renovate: datasource=(?[a-z-]+) depName=(?[^\\s]+)(?: lookupName=(?[^\\s]+))?(?: versioning=(?[a-z-]+))?(?: extractVersion=(?[^\\s]+))?', + ], + }, + ], + postUpdateOptions: [ + 'gomodUpdateImportPaths', + 'gomodTidy', ], - "postUpdateOptions": [ - "gomodUpdateImportPaths", - "gomodTidy" - ] } From faf28fd3144f839159c7a96bffbc9369be992eef Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 15:10:52 +0100 Subject: [PATCH 05/12] deps: update module github.com/google/go-github/v65 to v66 (#103) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- internal/forge/github/github.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 38de481..a9ae48f 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/blang/semver/v4 v4.0.0 github.com/go-git/go-git/v5 v5.12.0 - github.com/google/go-github/v65 v65.0.0 + github.com/google/go-github/v66 v66.0.0 github.com/leodido/go-conventionalcommits v0.12.0 github.com/spf13/cobra v1.8.1 github.com/stretchr/testify v1.9.0 diff --git a/go.sum b/go.sum index 63134fb..dd83ee0 100644 --- a/go.sum +++ b/go.sum @@ -47,8 +47,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-github/v65 v65.0.0 h1:pQ7BmO3DZivvFk92geC0jB0q2m3gyn8vnYPgV7GSLhQ= -github.com/google/go-github/v65 v65.0.0/go.mod h1:DvrqWo5hvsdhJvHd4WyVF9ttANN3BniqjP8uTFMNb60= +github.com/google/go-github/v66 v66.0.0 h1:ADJsaXj9UotwdgK8/iFZtv7MLc8E8WBl62WLd/D/9+M= +github.com/google/go-github/v66 v66.0.0/go.mod h1:+4SO9Zkuyf8ytMj0csN1NR/5OTR+MfqPp8P8dVlcvY4= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= diff --git a/internal/forge/github/github.go b/internal/forge/github/github.go index 8dab499..2f48dcd 100644 --- a/internal/forge/github/github.go +++ b/internal/forge/github/github.go @@ -12,7 +12,7 @@ import ( "github.com/blang/semver/v4" "github.com/go-git/go-git/v5/plumbing/transport" "github.com/go-git/go-git/v5/plumbing/transport/http" - "github.com/google/go-github/v65/github" + "github.com/google/go-github/v66/github" "github.com/apricote/releaser-pleaser/internal/forge" "github.com/apricote/releaser-pleaser/internal/git" From 0ae2d909bc99b378fb8f944cfd5d072bd72a4e7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20T=C3=B6lle?= Date: Fri, 15 Nov 2024 17:25:15 +0100 Subject: [PATCH 06/12] fix: use commits with slightly invalid messages in release notes (#105) Fixes a bug where commits with messages that do not strictly conform to conventional commits spec would be ignored. This could easily happen while parsing footers like "Closes #xx" which would start the footer section, while continuing with the body afterwards. This solution has two downsides: - these warnings are not surfaced to the user. - If a `BREAKING CHANGE` footer exists after the parsing issue it is ignored Co-authored-by: jo --- .../conventionalcommits/conventionalcommits.go | 14 ++++++++++++-- .../conventionalcommits_test.go | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/internal/commitparser/conventionalcommits/conventionalcommits.go b/internal/commitparser/conventionalcommits/conventionalcommits.go index d11970c..e00af34 100644 --- a/internal/commitparser/conventionalcommits/conventionalcommits.go +++ b/internal/commitparser/conventionalcommits/conventionalcommits.go @@ -35,8 +35,12 @@ func (c *Parser) Analyze(commits []git.Commit) ([]commitparser.AnalyzedCommit, e for _, commit := range commits { msg, err := c.machine.Parse([]byte(strings.TrimSpace(commit.Message))) if err != nil { - c.logger.Warn("failed to parse message of commit, skipping", "commit.hash", commit.Hash, "err", err) - continue + if msg == nil { + c.logger.Warn("failed to parse message of commit, skipping", "commit.hash", commit.Hash, "err", err) + continue + } + + c.logger.Warn("failed to parse message of commit fully, trying to use as much as possible", "commit.hash", commit.Hash, "err", err) } conventionalCommit, ok := msg.(*conventionalcommits.ConventionalCommit) @@ -44,6 +48,12 @@ func (c *Parser) Analyze(commits []git.Commit) ([]commitparser.AnalyzedCommit, e return nil, fmt.Errorf("unable to get ConventionalCommit from parser result: %T", msg) } + if conventionalCommit.Type == "" { + // Parsing broke before getting the type, can not use the commit + c.logger.Warn("commit type was not parsed, skipping", "commit.hash", commit.Hash, "err", err) + continue + } + commitVersionBump := conventionalCommit.VersionBump(conventionalcommits.DefaultStrategy) if commitVersionBump > conventionalcommits.UnknownVersion { // We only care about releasable commits diff --git a/internal/commitparser/conventionalcommits/conventionalcommits_test.go b/internal/commitparser/conventionalcommits/conventionalcommits_test.go index ddfbaf4..d301829 100644 --- a/internal/commitparser/conventionalcommits/conventionalcommits_test.go +++ b/internal/commitparser/conventionalcommits/conventionalcommits_test.go @@ -125,6 +125,24 @@ func TestAnalyzeCommits(t *testing.T) { }, wantErr: assert.NoError, }, + + { + name: "success with body", + commits: []git.Commit{ + { + Message: "feat: some thing (hz/fl!144)\n\nFixes #15\n\nDepends on !143", + }, + }, + expectedCommits: []commitparser.AnalyzedCommit{ + { + Commit: git.Commit{Message: "feat: some thing (hz/fl!144)\n\nFixes #15\n\nDepends on !143"}, + Type: "feat", + Description: "some thing (hz/fl!144)", + BreakingChange: false, + }, + }, + wantErr: assert.NoError, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { From 6c5bdfeee820a0cd1318b9be549b4a3a64c77e41 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 17:46:41 +0100 Subject: [PATCH 07/12] deps: update codecov/codecov-action digest to 5c47607 (#106) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 74127eb..bd79753 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -38,7 +38,7 @@ jobs: run: go test -v -race -coverpkg=./... -coverprofile=coverage.txt ./... - name: Upload results to Codecov - uses: codecov/codecov-action@3b1354a6c45db9f1008891f4eafc1a7e94ce1d18 # v5 + uses: codecov/codecov-action@5c47607acb93fed5485fdbf7232e8a31425f672a # v5 with: token: ${{ secrets.CODECOV_TOKEN }} From e9b3ba8ea2e5c5908cd30da987cf79e9d6ca7215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20T=C3=B6lle?= Date: Fri, 15 Nov 2024 17:51:54 +0100 Subject: [PATCH 08/12] feat(gitlab): make job dependencies configurable and run immediately (#101) In the CI/CD component, make the jobs `needs` setting configurable through an input and change the default to `[]`. This will cause the job to run immediately. Co-authored-by: jo --- docs/reference/gitlab-cicd-component.md | 6 +++++- templates/run.yml | 8 +++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/reference/gitlab-cicd-component.md b/docs/reference/gitlab-cicd-component.md index 4f35e0c..b22d5b2 100644 --- a/docs/reference/gitlab-cicd-component.md +++ b/docs/reference/gitlab-cicd-component.md @@ -10,7 +10,9 @@ It is being distributed through the CI/CD Catalog: [apricote/releaser-pleaser](h The `apricote/releaser-pleaser` action is released together with `releaser-pleaser` and they share the version number. -The component does not support floating tags (e.g. `v1`) right now ([#31](https://github.com/apricote/releaser-pleaser/issues/31)). You have to use the full version or commit SHA instead: `apricote/releaser-pleaser@v0.4.0`. +The component does not support floating tags (e.g. +`v1`) right now ([#31](https://github.com/apricote/releaser-pleaser/issues/31)). You have to use the full version or commit SHA instead: +`apricote/releaser-pleaser@v0.4.0`. ## Inputs @@ -21,3 +23,5 @@ The following inputs are supported by the component. | `branch` | This branch is used as the target for releases. | `main` | `master` | | `token` (**required**) | GitLab access token for creating and updating release PRs | | `$RELEASER_PLEASER_TOKEN` | | `extra-files` | List of files that are scanned for version references. | `""` |
version/version.go
deploy/deployment.yaml
| +| `stage` | Stage the job runs in. Must exists. | `build` | `test` | +| `needs` | Other jobs the releaser-pleaser job depends on. | `[]` |
- validate-foo
- prepare-bar
| diff --git a/templates/run.yml b/templates/run.yml index 3a82cd1..dbae48e 100644 --- a/templates/run.yml +++ b/templates/run.yml @@ -15,17 +15,23 @@ spec: stage: default: build description: 'Defines the build stage' + + needs: + default: [ ] + type: array + description: 'Dependencies of the created Job' # Remember to update docs/reference/gitlab-ci-component.md --- releaser-pleaser: stage: $[[ inputs.stage ]] + needs: $[[ inputs.needs ]] rules: # There is no way to run a pipeline when the MR description is updated :( - if: $CI_COMMIT_BRANCH == "$[[ inputs.branch ]]" image: name: ghcr.io/apricote/releaser-pleaser:v0.4.2 # x-releaser-pleaser-version - entrypoint: [""] + entrypoint: [ "" ] variables: GITLAB_TOKEN: $[[ inputs.token ]] script: From 11f840324160b64a61a0588d7e93fe172a5536d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20T=C3=B6lle?= Date: Fri, 15 Nov 2024 18:07:59 +0100 Subject: [PATCH 09/12] fix: create CHANGELOG.md if it does not exist (#108) During a previous refactoring (#15) the Changelog generation logic stopped creating the file if it did not exist. This makes sure that the file actually gets created. This is primarily required while onboarding new repositories. Closes #85 --- internal/git/git.go | 12 +++++++++--- releaserpleaser.go | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/internal/git/git.go b/internal/git/git.go index 09fd5c9..128f94c 100644 --- a/internal/git/git.go +++ b/internal/git/git.go @@ -18,7 +18,8 @@ import ( ) const ( - remoteName = "origin" + remoteName = "origin" + newFilePermissions = 0o644 ) type Commit struct { @@ -97,13 +98,18 @@ func (r *Repository) Checkout(_ context.Context, branch string) error { return nil } -func (r *Repository) UpdateFile(_ context.Context, path string, updaters []updater.Updater) error { +func (r *Repository) UpdateFile(_ context.Context, path string, create bool, updaters []updater.Updater) error { worktree, err := r.r.Worktree() if err != nil { return err } - file, err := worktree.Filesystem.OpenFile(path, os.O_RDWR, 0) + fileFlags := os.O_RDWR + if create { + fileFlags |= os.O_CREATE + } + + file, err := worktree.Filesystem.OpenFile(path, fileFlags, newFilePermissions) if err != nil { return err } diff --git a/releaserpleaser.go b/releaserpleaser.go index 2b1754f..0b1b846 100644 --- a/releaserpleaser.go +++ b/releaserpleaser.go @@ -253,14 +253,14 @@ func (rp *ReleaserPleaser) runReconcileReleasePR(ctx context.Context) error { // Info for updaters info := updater.ReleaseInfo{Version: nextVersion, ChangelogEntry: changelogEntry} - err = repo.UpdateFile(ctx, updater.ChangelogFile, updater.WithInfo(info, updater.Changelog)) + err = repo.UpdateFile(ctx, updater.ChangelogFile, true, updater.WithInfo(info, updater.Changelog)) if err != nil { return fmt.Errorf("failed to update changelog file: %w", err) } for _, path := range rp.extraFiles { // TODO: Check for missing files - err = repo.UpdateFile(ctx, path, updater.WithInfo(info, rp.updaters...)) + err = repo.UpdateFile(ctx, path, false, updater.WithInfo(info, rp.updaters...)) if err != nil { return fmt.Errorf("failed to run file updater: %w", err) } From ef1d92cff0c6b2cc1e7d57ded4c6470b3e0680c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20T=C3=B6lle?= Date: Fri, 15 Nov 2024 18:43:40 +0100 Subject: [PATCH 10/12] refactor: interface for versioning strategy (#109) --- cmd/rp/cmd/run.go | 2 +- internal/versioning/semver.go | 6 ++++-- internal/versioning/semver_test.go | 4 ++-- internal/versioning/versioning.go | 4 +++- releaserpleaser.go | 11 +++++------ 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/cmd/rp/cmd/run.go b/cmd/rp/cmd/run.go index c29047b..ec11e24 100644 --- a/cmd/rp/cmd/run.go +++ b/cmd/rp/cmd/run.go @@ -86,7 +86,7 @@ func run(cmd *cobra.Command, _ []string) error { logger, flagBranch, conventionalcommits.NewParser(logger), - versioning.SemVerNextVersion, + versioning.SemVer, extraFiles, []updater.NewUpdater{updater.Generic}, ) diff --git a/internal/versioning/semver.go b/internal/versioning/semver.go index 49dc019..e6a58c7 100644 --- a/internal/versioning/semver.go +++ b/internal/versioning/semver.go @@ -10,9 +10,11 @@ import ( "github.com/apricote/releaser-pleaser/internal/git" ) -var _ Strategy = SemVerNextVersion +var SemVer Strategy = semVer{} -func SemVerNextVersion(r git.Releases, versionBump VersionBump, nextVersionType NextVersionType) (string, error) { +type semVer struct{} + +func (s semVer) NextVersion(r git.Releases, versionBump VersionBump, nextVersionType NextVersionType) (string, error) { latest, err := parseSemverWithDefault(r.Latest) if err != nil { return "", fmt.Errorf("failed to parse latest version: %w", err) diff --git a/internal/versioning/semver_test.go b/internal/versioning/semver_test.go index db22c88..702d31c 100644 --- a/internal/versioning/semver_test.go +++ b/internal/versioning/semver_test.go @@ -10,7 +10,7 @@ import ( "github.com/apricote/releaser-pleaser/internal/git" ) -func TestReleases_NextVersion(t *testing.T) { +func TestSemVer_NextVersion(t *testing.T) { type args struct { releases git.Releases versionBump VersionBump @@ -326,7 +326,7 @@ func TestReleases_NextVersion(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := SemVerNextVersion(tt.args.releases, tt.args.versionBump, tt.args.nextVersionType) + got, err := SemVer.NextVersion(tt.args.releases, tt.args.versionBump, tt.args.nextVersionType) if !tt.wantErr(t, err, fmt.Sprintf("SemVerNextVersion(Releases(%v, %v), %v, %v)", tt.args.releases.Latest, tt.args.releases.Stable, tt.args.versionBump, tt.args.nextVersionType)) { return } diff --git a/internal/versioning/versioning.go b/internal/versioning/versioning.go index 3bf8138..182983f 100644 --- a/internal/versioning/versioning.go +++ b/internal/versioning/versioning.go @@ -6,7 +6,9 @@ import ( "github.com/apricote/releaser-pleaser/internal/git" ) -type Strategy = func(git.Releases, VersionBump, NextVersionType) (string, error) +type Strategy interface { + NextVersion(git.Releases, VersionBump, NextVersionType) (string, error) +} type VersionBump conventionalcommits.VersionBump diff --git a/releaserpleaser.go b/releaserpleaser.go index 0b1b846..77f81f6 100644 --- a/releaserpleaser.go +++ b/releaserpleaser.go @@ -23,7 +23,7 @@ type ReleaserPleaser struct { logger *slog.Logger targetBranch string commitParser commitparser.CommitParser - nextVersion versioning.Strategy + versioning versioning.Strategy extraFiles []string updaters []updater.NewUpdater } @@ -34,7 +34,7 @@ func New(forge forge.Forge, logger *slog.Logger, targetBranch string, commitPars logger: logger, targetBranch: targetBranch, commitParser: commitParser, - nextVersion: versioningStrategy, + versioning: versioningStrategy, extraFiles: extraFiles, updaters: updaters, } @@ -117,7 +117,7 @@ func (rp *ReleaserPleaser) createPendingRelease(ctx context.Context, pr *release return err } - changelog, err := pr.ChangelogText() + changelogText, err := pr.ChangelogText() if err != nil { return err } @@ -125,7 +125,7 @@ func (rp *ReleaserPleaser) createPendingRelease(ctx context.Context, pr *release // TODO: pre-release & latest logger.DebugContext(ctx, "Creating release on forge") - err = rp.forge.CreateRelease(ctx, *pr.ReleaseCommit, version, changelog, false, true) + err = rp.forge.CreateRelease(ctx, *pr.ReleaseCommit, version, changelogText, false, true) if err != nil { return fmt.Errorf("failed to create release on forge: %w", err) } @@ -163,7 +163,6 @@ func (rp *ReleaserPleaser) runReconcileReleasePR(ctx context.Context) error { if err != nil { return err } - } releases, err := rp.forge.LatestTags(ctx) @@ -223,7 +222,7 @@ func (rp *ReleaserPleaser) runReconcileReleasePR(ctx context.Context) error { versionBump := versioning.BumpFromCommits(analyzedCommits) // TODO: Set version in release pr - nextVersion, err := rp.nextVersion(releases, versionBump, releaseOverrides.NextVersionType) + nextVersion, err := rp.versioning.NextVersion(releases, versionBump, releaseOverrides.NextVersionType) if err != nil { return err } From dd166ec446046f583933958b1337797c2f1ed189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20T=C3=B6lle?= Date: Fri, 15 Nov 2024 18:49:50 +0100 Subject: [PATCH 11/12] feat(github): mark pre-releases correctly (#110) In theory every forge can support this, but right now only GitHub allows one to define a release as "pre-release". Closes #45 --- internal/versioning/semver.go | 13 ++++++++++++ internal/versioning/semver_test.go | 34 ++++++++++++++++++++++++++++++ internal/versioning/versioning.go | 1 + releaserpleaser.go | 4 ++-- 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/internal/versioning/semver.go b/internal/versioning/semver.go index e6a58c7..07e0fdc 100644 --- a/internal/versioning/semver.go +++ b/internal/versioning/semver.go @@ -110,3 +110,16 @@ func parseSemverWithDefault(tag *git.Tag) (semver.Version, error) { return parsedVersion, nil } + +func (s semVer) IsPrerelease(version string) bool { + semVersion, err := parseSemverWithDefault(&git.Tag{Hash: "", Name: version}) + if err != nil { + return false + } + + if len(semVersion.Pre) > 0 { + return true + } + + return false +} diff --git a/internal/versioning/semver_test.go b/internal/versioning/semver_test.go index 702d31c..936c258 100644 --- a/internal/versioning/semver_test.go +++ b/internal/versioning/semver_test.go @@ -388,3 +388,37 @@ func TestVersionBumpFromCommits(t *testing.T) { }) } } + +func TestSemVer_IsPrerelease(t *testing.T) { + tests := []struct { + name string + version string + want bool + }{ + { + name: "empty string", + version: "", + want: false, + }, + { + name: "stable version", + version: "v1.0.0", + want: false, + }, + { + name: "pre-release version", + version: "v1.0.0-rc.1+foo", + want: true, + }, + { + name: "invalid version", + version: "ajfkdafjdsfj", + want: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equalf(t, tt.want, SemVer.IsPrerelease(tt.version), "IsSemverPrerelease(%v)", tt.version) + }) + } +} diff --git a/internal/versioning/versioning.go b/internal/versioning/versioning.go index 182983f..a4915ff 100644 --- a/internal/versioning/versioning.go +++ b/internal/versioning/versioning.go @@ -8,6 +8,7 @@ import ( type Strategy interface { NextVersion(git.Releases, VersionBump, NextVersionType) (string, error) + IsPrerelease(version string) bool } type VersionBump conventionalcommits.VersionBump diff --git a/releaserpleaser.go b/releaserpleaser.go index 77f81f6..88b2dbb 100644 --- a/releaserpleaser.go +++ b/releaserpleaser.go @@ -122,10 +122,10 @@ func (rp *ReleaserPleaser) createPendingRelease(ctx context.Context, pr *release return err } - // TODO: pre-release & latest + // TODO: Check if version should be marked latest logger.DebugContext(ctx, "Creating release on forge") - err = rp.forge.CreateRelease(ctx, *pr.ReleaseCommit, version, changelogText, false, true) + err = rp.forge.CreateRelease(ctx, *pr.ReleaseCommit, version, changelogText, rp.versioning.IsPrerelease(version), true) if err != nil { return fmt.Errorf("failed to create release on forge: %w", err) } From b61723279775f6ff425884ce78baf158e1aa2357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20T=C3=B6lle?= Date: Fri, 15 Nov 2024 18:54:56 +0100 Subject: [PATCH 12/12] chore(main): release v0.5.0 (#107) Co-authored-by: releaser-pleaser <> --- CHANGELOG.md | 12 ++++++++++++ action.yml | 2 +- templates/run.yml | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e3b5c2..703d6b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [v0.5.0](https://github.com/apricote/releaser-pleaser/releases/tag/v0.5.0) + +### Features + +- **gitlab**: make job dependencies configurable and run immediately (#101) +- **github**: mark pre-releases correctly (#110) + +### Bug Fixes + +- use commits with slightly invalid messages in release notes (#105) +- create CHANGELOG.md if it does not exist (#108) + ## [v0.4.2](https://github.com/apricote/releaser-pleaser/releases/tag/v0.4.2) ### Bug Fixes diff --git a/action.yml b/action.yml index 76afadf..2d492dd 100644 --- a/action.yml +++ b/action.yml @@ -21,7 +21,7 @@ inputs: outputs: {} runs: using: 'docker' - image: docker://ghcr.io/apricote/releaser-pleaser:v0.4.2 # x-releaser-pleaser-version + image: docker://ghcr.io/apricote/releaser-pleaser:v0.5.0 # x-releaser-pleaser-version args: - run - --forge=github diff --git a/templates/run.yml b/templates/run.yml index dbae48e..338a1b6 100644 --- a/templates/run.yml +++ b/templates/run.yml @@ -30,7 +30,7 @@ releaser-pleaser: # There is no way to run a pipeline when the MR description is updated :( - if: $CI_COMMIT_BRANCH == "$[[ inputs.branch ]]" image: - name: ghcr.io/apricote/releaser-pleaser:v0.4.2 # x-releaser-pleaser-version + name: ghcr.io/apricote/releaser-pleaser:v0.5.0 # x-releaser-pleaser-version entrypoint: [ "" ] variables: GITLAB_TOKEN: $[[ inputs.token ]]