Compare commits

...

12 commits

Author SHA1 Message Date
b617232797
chore(main): release v0.5.0 (#107)
Co-authored-by: releaser-pleaser <>
2024-11-15 18:54:56 +01:00
dd166ec446
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
2024-11-15 18:49:50 +01:00
ef1d92cff0
refactor: interface for versioning strategy (#109) 2024-11-15 17:43:40 +00:00
11f8403241
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
2024-11-15 18:07:59 +01:00
e9b3ba8ea2
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 <ljonas@riseup.net>
2024-11-15 17:51:54 +01:00
renovate[bot]
6c5bdfeee8
deps: update codecov/codecov-action digest to 5c47607 (#106)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-15 17:46:41 +01:00
0ae2d909bc
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 <ljonas@riseup.net>
2024-11-15 17:25:15 +01:00
renovate[bot]
faf28fd314
deps: update module github.com/google/go-github/v65 to v66 (#103)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-15 15:10:52 +01:00
renovate[bot]
147148c891
chore(config): migrate config .github/renovate.json5 (#104)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-15 15:10:33 +01:00
renovate[bot]
79c5b13e1f
deps: update codecov/codecov-action action to v5 (#102)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-15 15:09:17 +01:00
renovate[bot]
b6d6270d9e
deps: update actions/checkout digest to 11bd719 (#89)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-15 14:52:43 +01:00
renovate[bot]
59aa7aae02
deps: update actions/setup-go digest to 41dfa10 (#90)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-15 14:52:20 +01:00
21 changed files with 203 additions and 99 deletions

113
.github/renovate.json5 vendored
View file

@ -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": [
": (?<currentValue>.+) # renovate: datasource=(?<datasource>[a-z-]+) depName=(?<depName>[^\\s]+)(?: lookupName=(?<lookupName>[^\\s]+))?(?: versioning=(?<versioning>[a-z-]+))?(?: extractVersion=(?<extractVersion>[^\\s]+))?"
]
}
matchStrings: [
': (?<currentValue>.+) # renovate: datasource=(?<datasource>[a-z-]+) depName=(?<depName>[^\\s]+)(?: lookupName=(?<packageName>[^\\s]+))?(?: versioning=(?<versioning>[a-z-]+))?(?: extractVersion=(?<extractVersion>[^\\s]+))?',
],
},
],
postUpdateOptions: [
'gomodUpdateImportPaths',
'gomodTidy',
],
"postUpdateOptions": [
"gomodUpdateImportPaths",
"gomodTidy"
]
}

View file

@ -10,10 +10,10 @@ 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@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5
uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5
with:
go-version-file: go.mod
@ -27,10 +27,10 @@ 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@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5
uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5
with:
go-version-file: go.mod
@ -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@5c47607acb93fed5485fdbf7232e8a31425f672a # v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
@ -46,10 +46,10 @@ 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@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5
uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5
with:
go-version-file: go.mod

View file

@ -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"

View file

@ -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

View file

@ -14,10 +14,10 @@ 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@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5
uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5
with:
go-version-file: go.mod

View file

@ -18,12 +18,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
ref: main
- name: Set up Go
uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5
uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5
with:
go-version-file: go.mod

View file

@ -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

View file

@ -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

View file

@ -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},
)

View file

@ -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. | `""` | <pre><code>version/version.go<br>deploy/deployment.yaml</code></pre> |
| `stage` | Stage the job runs in. Must exists. | `build` | `test` |
| `needs` | Other jobs the releaser-pleaser job depends on. | `[]` | <pre><code>- validate-foo<br>- prepare-bar</code></pre> |

2
go.mod
View file

@ -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

4
go.sum
View file

@ -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=

View file

@ -35,15 +35,25 @@ 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 {
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)
if !ok {
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

View file

@ -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) {

View file

@ -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"

View file

@ -19,6 +19,7 @@ import (
const (
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
}

View file

@ -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)
@ -108,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
}

View file

@ -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
}
@ -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)
})
}
}

View file

@ -6,7 +6,10 @@ 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)
IsPrerelease(version string) bool
}
type VersionBump conventionalcommits.VersionBump

View file

@ -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,15 +117,15 @@ func (rp *ReleaserPleaser) createPendingRelease(ctx context.Context, pr *release
return err
}
changelog, err := pr.ChangelogText()
changelogText, err := pr.ChangelogText()
if err != nil {
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, changelog, 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)
}
@ -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
}
@ -253,14 +252,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)
}

View file

@ -15,16 +15,22 @@ 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
name: ghcr.io/apricote/releaser-pleaser:v0.5.0 # x-releaser-pleaser-version
entrypoint: [ "" ]
variables:
GITLAB_TOKEN: $[[ inputs.token ]]