Skip to content

GitLab

Package: pkg/vcs/gitlab

Provides a release.Provider implementation backed by the GitLab Releases API. Supports both GitLab.com and self-managed GitLab instances. GitLab support is focused on release management and self-updating โ€” there is no full API client equivalent to GHClient.


Constructor

func NewReleaseProvider(cfg config.Containable) (release.Provider, error)

cfg should be a props.Config.Sub("gitlab") subtree. Reads url.api and authentication via vcs.ResolveToken.

Token is optional โ€” public projects work without one. Private projects will receive a 401 if no token is set.

Configuration keys (under the gitlab subtree):

Key Default Description
url.api https://gitlab.com/api/v4 GitLab API base URL. Override for self-managed instances.
auth.env โ€” Name of the environment variable holding the token
auth.value โ€” Literal token value (use auth.env in preference)

If neither auth.env nor auth.value is present, NewReleaseProvider falls back to the GITLAB_TOKEN environment variable.


Usage

import (
    "gitlab.com/phpboyscout/go-tool-base/pkg/vcs/gitlab"
    "gitlab.com/phpboyscout/go-tool-base/pkg/vcs/release"
)

var provider release.Provider
provider, err = gitlab.NewReleaseProvider(props.Config.Sub("gitlab"))
if err != nil {
    return err
}

// Get latest release
latest, err := provider.GetLatestRelease(ctx, "my-group", "my-project")
if err != nil {
    return err
}
fmt.Println(latest.GetTagName(), latest.GetName())

// List releases (up to 20)
releases, err := provider.ListReleases(ctx, "my-group", "my-project", 20)

// Get a specific release
rel, err := provider.GetReleaseByTag(ctx, "my-group", "my-project", "v1.2.0")

// Download an asset
rc, _, err := provider.DownloadReleaseAsset(ctx, "my-group", "my-project", rel.GetAssets()[0])
if err != nil {
    return err
}
defer rc.Close()
io.Copy(outFile, rc)

Platform Differences

Behaviour GitHub GitLab
GetDraft() Returns actual draft status Always false โ€” GitLab has no draft release concept
DownloadReleaseAsset redirect URL May be non-empty (CDN redirect) Always empty string
Assets github.ReleaseAsset list gitlab.ReleaseLink list
GetLatestRelease Dedicated API endpoint Fetches first page (1 item) of sorted releases

Testing

Use the release.Provider mock โ€” there is no GitLab-specific mock:

import mock_release "gitlab.com/phpboyscout/go-tool-base/mocks/pkg/vcs/release"

mockProvider := mock_release.NewMockProvider(t)
mockProvider.EXPECT().
    GetLatestRelease(mock.Anything, "my-group", "my-project").
    Return(mockRelease, nil)

For HTTP-level tests, use net/http/httptest and pass the test server URL as url.api in the test config. See pkg/vcs/gitlab/release_test.go for the established pattern.


  • Release Provider โ€” Provider, Release, and ReleaseAsset interface reference
  • GitHub โ€” GitHub release provider (same interface, richer API client)
  • VCS index โ€” ResolveToken and package overview
  • Auto-Update Lifecycle โ€” how release.Provider drives version checks