docs/dev-tools/backends/gitlab.md
You may install GitLab release assets directly using the gitlab backend. This backend downloads release assets from GitLab repositories and is ideal for tools that distribute pre-built binaries through GitLab releases.
The code for this is inside of the mise repository at ./src/backend/github.rs.
The following installs the latest version of gitlab-runner from GitLab releases and sets it as the active version on PATH:
$ mise use -g gitlab:gitlab-org/gitlab-runner
$ gitlab-runner --version
gitlab-runner 16.8.0
The version will be set in ~/.config/mise/config.toml with the following format:
[tools]
"gitlab:gitlab-org/gitlab-runner" = { version = "latest", asset_pattern = "gitlab-runner-linux-x64" }
For private repositories or higher API limits, mise supports several GitLab token sources.
mise checks these sources in order and uses the first token found:
MISE_GITLAB_ENTERPRISE_TOKEN (for non-gitlab.com hosts)MISE_GITLAB_TOKENGITLAB_TOKENcredential_command (if set)gitlab_tokens.toml (per host)config.yml, if enabled)git credential fill (if gitlab.use_git_credentials=true)export MISE_GITLAB_TOKEN="glpat-xxxxxxxx"
For self-hosted GitLab instances:
export MISE_GITLAB_ENTERPRISE_TOKEN="glpat-yyyyyyyy"
gitlab_tokens.toml)# ~/.config/mise/gitlab_tokens.toml
[tokens."gitlab.com"]
token = "glpat-xxxxxxxx"
[tokens."gitlab.mycompany.com"]
token = "glpat-yyyyyyyy"
credential_commandYou can provide a shell command that prints a token to stdout:
[settings.gitlab]
credential_command = "op read 'op://Private/GitLab Token/credential'"
The target hostname is passed as $1 to the command.
mise can read tokens from glab config as a fallback. It checks:
$GLAB_CONFIG_DIR/config.yml$XDG_CONFIG_HOME/glab-cli/config.yml (defaults to ~/.config/glab-cli/config.yml)~/Library/Application Support/glab-cli/config.yml (macOS)Disable this fallback with:
[settings.gitlab]
glab_cli_tokens = false
git credential fill fallbackAs a last resort, mise can query git credential helpers:
[settings.gitlab]
use_git_credentials = true
This uses git credential fill and supports credentials stored by helpers such as macOS Keychain.
Use mise token gitlab to see which token mise would use for a given host:
mise token gitlab
mise token gitlab --unmask
mise token gitlab gitlab.mycompany.com
The following tool-options are available for the gitlab backend—these
go in [tools] in mise.toml.
When no asset_pattern is specified, mise automatically selects the best asset for your platform. The system scores assets based on:
For most tools, you can simply install without specifying patterns:
mise install gitlab:user/repo
::: tip
The autodetection logic is implemented in src/backend/asset_matcher.rs, which is shared by both the GitHub and GitLab backends.
:::
asset_patternSpecifies the pattern to match against release asset names. This is useful when there are multiple assets for your OS/arch combination or when you need to override autodetection.
[tools."gitlab:gitlab-org/gitlab-runner"]
version = "latest"
asset_pattern = "gitlab-runner-linux-x64"
version_prefixSpecifies a custom version prefix for release tags. By default, mise handles the common v prefix (e.g., v1.0.0), but some repositories use different prefixes like release-, version-, or no prefix at all.
When version_prefix is configured, mise will:
[tools]
"gitlab:user/repo" = { version = "latest", version_prefix = "release-" }
Examples:
version_prefix = "release-":
1.0.0 → mise searches for release-1.0.0 tag1.0.0 (prefix stripped)version_prefix = "" (empty string):
1.0.0 → mise searches for 1.0.0 tag (no prefix)For different asset patterns per platform:
[tools."gitlab:gitlab-org/gitlab-runner"]
version = "latest"
[tools."gitlab:gitlab-org/gitlab-runner".platforms]
linux-x64 = { asset_pattern = "gitlab-runner-linux-x64" }
macos-arm64 = { asset_pattern = "gitlab-runner-macos-arm64" }
checksumVerify the downloaded file with a checksum:
[tools."gitlab:owner/repo"]
version = "1.0.0"
asset_pattern = "tool-1.0.0-x64.tar.gz"
checksum = "sha256:a1b2c3d4e5f6789..."
Instead of specifying the checksum here, you can use mise.lock to manage checksums.
[tools."gitlab:gitlab-org/gitlab-runner"]
version = "latest"
[tools."gitlab:gitlab-org/gitlab-runner".platforms]
linux-x64 = {
asset_pattern = "gitlab-runner-linux-x64",
checksum = "sha256:a1b2c3d4e5f6789...",
}
macos-arm64 = {
asset_pattern = "gitlab-runner-macos-arm64",
checksum = "sha256:b2c3d4e5f6789...",
}
sizeVerify the downloaded asset size:
[tools]
"gitlab:gitlab-org/gitlab-runner" = { version = "latest", size = "12345678" }
You can specify different sizes for different platforms:
[tools."gitlab:gitlab-org/gitlab-runner"]
version = "latest"
[tools."gitlab:gitlab-org/gitlab-runner".platforms]
linux-x64 = { size = "12345678" }
macos-arm64 = { size = "9876543" }
strip_componentsNumber of directory components to strip when extracting archives:
[tools]
"gitlab:gitlab-org/gitlab-runner" = { version = "latest", strip_components = 1 }
::: info
If strip_components is not explicitly set, mise will automatically detect when to apply strip_components = 1. This happens when the extracted archive contains exactly one directory at the root level and no files. This is common with tools like ripgrep that package their binaries in a versioned directory (e.g., ripgrep-14.1.0-x86_64-unknown-linux-musl/rg). The auto-detection ensures the binary is placed directly in the install path where mise expects it.
:::
binRename the downloaded binary to a specific name. This is useful when downloading single binaries that have platform-specific names:
[tools."gitlab:myorg/mytool"]
version = "1.0.0"
asset_pattern = "mytool-linux-x86_64"
bin = "mytool" # Rename from mytool-linux-x86_64 to mytool
::: info
When downloading single binaries (not archives), mise automatically removes OS/arch suffixes from the filename. For example, mytool-linux-x86_64 becomes mytool automatically. Use the bin option only when you need a specific custom name.
:::
rename_exeRename the executable after extraction from an archive. This is useful when the archive contains a binary with a platform-specific name that you want to rename:
[tools."gitlab:myorg/mytool"]
version = "latest"
asset_pattern = "mytool_linux.zip"
rename_exe = "mytool" # Rename the extracted binary to mytool
::: tip
Use rename_exe for archives where the binary inside has a different name than desired. Use bin for single binary downloads (non-archives).
:::
no_appSkip macOS .app bundle assets during autodetection and prefer standalone CLI binaries instead. This is useful when a repository provides both a macOS .app bundle (often an Xcode extension or GUI application) and a standalone command-line tool:
[tools."gitlab:myorg/mytool"]
version = "latest"
no_app = true
When no_app = true:
.app. (e.g., Tool.app.zip, Tool.for.Xcode.app.zip) are penalized during autodetection.app. assets are already penalized by platform matchingasset_pattern values are used as-isbin_path::: v-pre
Specify the directory containing binaries within the extracted archive, or where to place the downloaded file. This supports Tera templating with variables like {{ version }}, {{ os }}, {{ arch }}, and arch aliases ({{ darwin_os }}, {{ amd64_arch }}, {{ x86_64_arch }}, {{ gnu_arch }}):
:::
[tools."gitlab:gitlab-org/gitlab-runner"]
version = "latest"
bin_path = "gitlab-runner-{{ version }}/bin" # expands to gitlab-runner-1.0.0/bin
Binary path lookup order:
bin_path is specified, use that directorybin_path is not set, look for a bin/ directory in the install pathbin/ directory exists, search subdirectories for bin/ directoriesbin/ directories are found, searches immediate subdirectories for any executable files. If an executable is found directly within a subdirectory, that entire subdirectory is considered a binary path.filter_binsComma-separated list of binaries to symlink into a filtered .mise-bins directory. This is useful when the tool comes with extra binaries that you do not want to expose on PATH.
[tools]
"gitlab:myorg/mytool" = { version = "1.0.0", filter_bins = "mybin" }
When enabled:
.mise-bins subdirectory is created with symlinks only to the specified binariesapi_urlFor self-hosted GitLab instances, specify the API URL. mise uses this URL for release listing and release asset lookup, and may also use it to download assets when browser download URLs are not reachable or when using custom/private instances:
[tools]
"gitlab:myorg/mytool" = { version = "latest", api_url = "https://gitlab.mycompany.com/api/v4" }
If you want to install a tool from a private repository on gitlab.com, set the MISE_GITLAB_TOKEN environment variable for authentication:
export MISE_GITLAB_TOKEN="your-token"
If you are using a self-hosted GitLab instance, set the api_url tool option and optionally the MISE_GITLAB_ENTERPRISE_TOKEN environment variable for authentication:
export MISE_GITLAB_ENTERPRISE_TOKEN="your-token"
gitlab:gitlab-org/gitlab-runnergitlab:gitlab-org/[email protected]