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¶
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.
Related Documentation¶
- Release Provider โ
Provider,Release, andReleaseAssetinterface reference - GitHub โ GitHub release provider (same interface, richer API client)
- VCS index โ
ResolveTokenand package overview - Auto-Update Lifecycle โ how
release.Providerdrives version checks