# GLab

GLab is an open source GitLab CLI tool. It brings GitLab to your terminal, next to where you are already working with `git` and your code, without switching between windows and browser tabs. While it's powerful for issues and merge requests, `glab` does even more:
- View, manage, and retry CI/CD pipelines directly from your CLI.
- Create changelogs.
- Create and manage releases.
- Ask GitLab Duo Chat (Classic) questions about Git.
- Manage GitLab agents for Kubernetes.
`glab` is available for repositories hosted on GitLab.com, GitLab Dedicated, and GitLab Self-Managed. It supports multiple authenticated GitLab instances, and automatically detects the authenticated hostname from the remotes available in your working Git directory.

## Table of contents
- [Requirements](#requirements)
- [Usage](#usage)
- [Commands](#commands)
- [GitLab Duo for the CLI](#gitlab-duo-for-the-cli)
- [Demo](#demo)
- [Documentation](#documentation)
- [Installation](#installation)
- [Homebrew](#homebrew)
- [Other installation methods](#other-installation-methods)
- [Building from source](#building-from-source)
- [Prerequisites for building from source](#prerequisites-for-building-from-source)
- [Authentication](#authentication)
- [Configuration](#configuration)
- [Environment variables](#environment-variables)
- [Debugging](#debugging)
- [Troubleshooting](#troubleshooting)
- [Issues](#issues)
- [Security](#security)
- [Contributing](#contributing)
- [Versioning](#versioning)
- [Classify version changes](#classify-version-changes)
- [Compatibility](#compatibility)
- [Inspiration](#inspiration)
## Requirements
`glab` officially supports GitLab versions 16.0 and later. Certain commands might require
more recent versions. While many commands might work properly in GitLab versions
15.x and earlier, no support is provided for these versions.
## Usage
To get started with `glab`:
1. Follow the [installation instructions](#installation) appropriate for your operating system.
1. [Authenticate](#authentication) into your instance of GitLab.
1. Optional. Configure `glab` further to meet your needs:
- 1Password users can configure it to [authenticate to `glab`](https://developer.1password.com/docs/cli/shell-plugins/gitlab/).
- Set any needed global, per-project, or per-host [configuration](#configuration).
- Set any needed [environment variables](#environment-variables).
You're ready!
### Commands
Run `glab --help` to view a list of core commands in your terminal.
<!-- commands-list-start: generated by 'make gen-docs'; do not edit by hand -->
- [`glab alias`](docs/source/alias): Create, list, and delete aliases.
- [`glab api`](docs/source/api): Make an authenticated request to the GitLab API.
- [`glab artifact-registry`](docs/source/artifact-registry): Authenticate with GitLab Artifact Registry. (EXPERIMENTAL)
- [`glab attestation`](docs/source/attestation): Manage software attestations. (EXPERIMENTAL)
- [`glab auth`](docs/source/auth): Manage authentication for glab.
- [`glab changelog`](docs/source/changelog): Generate changelogs from your project's commit history.
- [`glab check-update`](docs/source/check-update): Check for the latest glab version.
- [`glab ci`](docs/source/ci): Work with GitLab CI/CD pipelines and jobs.
- [`glab cluster`](docs/source/cluster): Manage GitLab Agents for Kubernetes and their clusters.
- [`glab completion`](docs/source/completion): Generate shell completion scripts.
- [`glab config`](docs/source/config): Manage glab settings.
- [`glab container-registry`](docs/source/container-registry): Work with GitLab container registries.
- [`glab dependency-firewall`](docs/source/dependency-firewall): Configure and monitor GitLab Dependency Firewall for local package managers. (EXPERIMENTAL)
- [`glab deploy-key`](docs/source/deploy-key): Manage deploy keys.
- [`glab deploy-token`](docs/source/deploy-token): Manage deploy tokens.
- [`glab duo`](docs/source/duo): Work with GitLab Duo.
- [`glab govern`](docs/source/govern): Manage AI governance. (EXPERIMENTAL)
- [`glab gpg-key`](docs/source/gpg-key): Manage GPG keys registered with your GitLab account.
- [`glab incident`](docs/source/incident): Work with GitLab incidents.
- [`glab issue`](docs/source/issue): Work with GitLab issues.
- [`glab iteration`](docs/source/iteration): Retrieve iteration information.
- [`glab job`](docs/source/job): Work with GitLab CI/CD jobs.
- [`glab label`](docs/source/label): Manage project and group labels.
- [`glab milestone`](docs/source/milestone): Manage group or project milestones.
- [`glab mr`](docs/source/mr): Create, view, and manage merge requests.
- [`glab opentofu`](docs/source/opentofu): Work with the OpenTofu or Terraform integration.
- [`glab orbit`](docs/source/orbit): Query the GitLab Orbit context graph. (EXPERIMENTAL)
- [`glab packages`](docs/source/packages): Manage packages in the GitLab package registry.
- [`glab release`](docs/source/release): Manage GitLab releases.
- [`glab repo`](docs/source/repo): Work with GitLab repositories and projects.
- [`glab runner`](docs/source/runner): Manage GitLab CI/CD runners.
- [`glab runner-controller`](docs/source/runner-controller): Manage runner controllers. (EXPERIMENTAL)
- [`glab schedule`](docs/source/schedule): Work with GitLab CI/CD schedules.
- [`glab search`](docs/source/search): Search for code and resources in a GitLab project. (BETA)
- [`glab securefile`](docs/source/securefile): Manage secure files for a project.
- [`glab security`](docs/source/security): Manage GitLab security scan profiles for a project. (EXPERIMENTAL)
- [`glab skills`](docs/source/skills): Manage glab agent skills. (EXPERIMENTAL)
- [`glab snippet`](docs/source/snippet): Create snippets.
- [`glab ssh-key`](docs/source/ssh-key): Manage SSH keys registered with your GitLab account.
- [`glab stack`](docs/source/stack): Create, manage, and work with stacked diffs. (EXPERIMENTAL)
- [`glab todo`](docs/source/todo): Manage your to-do list.
- [`glab token`](docs/source/token): Manage personal, project, or group tokens.
- [`glab user`](docs/source/user): Interact with a GitLab user account.
- [`glab variable`](docs/source/variable): Manage variables for a GitLab project or group.
- [`glab version`](docs/source/version): Show version information for glab.
- [`glab whatsnew`](docs/source/whatsnew): Show release notes for new versions of glab.
- [`glab work-items`](docs/source/work-items): Manage work items. (EXPERIMENTAL)
<!-- commands-list-end -->
Commands follow this pattern:
```shell
glab <command> <subcommand> [flags]
```
Many core commands also have sub-commands. Some examples:
- List merge requests assigned to you: `glab mr list --assignee=@me`
- List review requests for you: `glab mr list --reviewer=@me`
- Approve a merge request: `glab mr approve 235`
- Create an issue, and add milestone, title, and label: `glab issue create -m release-2.0.0 -t "My title here" --label important`
### GitLab Duo for the CLI
The GitLab CLI also includes support for using the GitLab Duo Agent Platform directly in your terminal.
Use `glab duo cli` to ask GitLab Duo questions about your codebase and to autonomously perform actions on your behalf.
For more information, see [GitLab Duo CLI](https://docs.gitlab.com/user/gitlab_duo_cli/).
## Demo
[](https://asciinema.org/a/368622)
## Documentation
Read the [documentation](docs/source/_index.md) for usage instructions or check out `glab help`.
## Installation
Download a binary suitable for your OS at the [releases page](https://gitlab.com/gitlab-org/cli/-/releases).
Other installation methods depend on your operating system.
### Homebrew
Homebrew is the officially supported package manager for macOS, Linux, and Windows (through [Windows Subsystem for Linux](https://learn.microsoft.com/en-us/windows/wsl/install))
- Homebrew
- Install with: `brew install glab`
- Update with: `brew upgrade glab`
### Other installation methods
Other options to install the GitLab CLI that may not be officially supported or are maintained by the community are [also available](docs/installation_options.md).
### Building from source
If a supported binary for your OS is not found at the [releases page](https://gitlab.com/gitlab-org/cli/-/releases), you can build from source:
#### Prerequisites for building from source
- `make`
- Go version as defined by [`main/go.mod`](https://gitlab.com/gitlab-org/cli/-/blob/main/go.mod?ref_type=heads#L3)
To build from source:
1. Run `go version` to verify that you have the minimum required Go version.
If Go is not installed, see [Download and install](https://go.dev/doc/install).
1. Clone the repository: `git clone https://gitlab.com/gitlab-org/cli.git`
1. Build the binary: `make build`
1. Install `glab` in `$GOPATH/bin`: `make install`
1. Optional. If `$GOPATH/bin` or `$GOBIN` is not in your `$PATH`,
run `export PATH=$PWD/bin:$PATH`.
1. Confirm the installation: `glab version`
## Authentication
To authenticate `glab` with OAuth, a personal access token, or a CI job token, see
[Authenticate with GitLab](https://docs.gitlab.com/cli/authentication/).
## Configuration
For configuration levels, the configuration search order, and platform-specific file
locations, see [Configure the CLI](https://docs.gitlab.com/cli/configuration/).
For connecting to a GitLab Self-Managed or GitLab Dedicated instance, and for mTLS and
self-signed certificates, see
[Connect to your GitLab instance](https://docs.gitlab.com/cli/connection/).
For authenticating proxies, including custom HTTP headers and Google Identity-Aware
Proxy, see [Connect through a proxy](https://docs.gitlab.com/cli/proxies/).
## Environment variables
`glab` reads its configuration from environment variables as well as the configuration
file. Every configuration key has a matching variable, and the variable wins over the
stored value. Setting them centrally is a good way to give everyone in an organization
the same setup.
For the full reference, see
[Environment variables](https://docs.gitlab.com/cli/configuration/#environment-variables).
For how `glab` picks which token to use, see
[Token precedence](https://docs.gitlab.com/cli/authentication/#token-precedence).
### Debugging
When the `GLAB_DEBUG` environment variable is set to `true`, `glab` outputs more logging information, including:
- Underlying Git commands.
- Expanded aliases.
- DNS error details.
## Troubleshooting
For help with common authentication issues, see
[Troubleshooting](https://docs.gitlab.com/cli/authentication/#troubleshooting) in the GitLab CLI documentation.
## Issues
If you have an issue: report it on the [issue tracker](https://gitlab.com/gitlab-org/cli/-/issues)
## Security
To report a security vulnerability in `glab`, follow the process in
the [security policy](SECURITY.md). Please do not open a public issue.
To learn how the project handles dependency updates and container-scanner CVE
reports, see [dependency management](CONTRIBUTING.md#dependency-management)
and [reporting a vulnerability](CONTRIBUTING.md#reporting-a-vulnerability)
in `CONTRIBUTING.md`.
## Contributing
Feel like contributing? That's awesome! We have a [contributing guide](https://gitlab.com/gitlab-org/cli/-/blob/main/CONTRIBUTING.md) and [Code of conduct](https://about.gitlab.com/community/contribute/code-of-conduct/) to help guide you.
When updating command help text or documentation, follow the
[GitLab CLI documentation style guide](https://docs.gitlab.com/development/documentation/cli_styleguide/).
### Versioning
This project follows the [SemVer](https://github.com/semver/semver) specification.
### Classify version changes
- If deleting a command, changing how it behaves, or adding a new **required** flag, the release must use a new `MAJOR` revision.
- If adding a new command or **optional** flag, the release must use a new `MINOR` revision.
- If fixing a bug, the release must use a new `PATCH` revision.
### Compatibility
We do our best to introduce breaking changes only when releasing a new `MAJOR` version.
Unfortunately, there are situations where this is not possible, and we may introduce
a breaking change in a `MINOR` or `PATCH` version. Some of situations where we may do so:
- If a security issue is discovered, and the solution requires a breaking change,
we may introduce such a change to resolve the issue and protect our users.
- If a feature was not working as intended, and the bug fix requires a breaking change,
the bug fix may be introduced to ensure the functionality works as intended.
- When feature behavior is overwhelmingly confusing due to a vague specification
on how it should work. In such cases, we may refine the specification
to remove the ambiguity, and introduce a breaking change that aligns with the
refined specification. For an example of this, see
[merge request 1382](https://gitlab.com/gitlab-org/cli/-/merge_requests/1382#note_1686888887).
- Experimental features are not guaranteed to be stable, and can be modified or
removed without a breaking change.
Breaking changes are a last resort, and we try our best to only introduce them when absolutely necessary.
## Inspiration
The GitLab CLI was adopted from [Clement Sam](https://gitlab.com/profclems) in 2022 to serve as the official CLI of GitLab. Over the years the project has been inspired by both the [GitHub CLI](https://github.com/cli/cli) and [Zaq? Wiedmann's](https://gitlab.com/zaquestion) [lab](https://github.com/zaquestion/lab).
Lab has served as the foundation for many of the GitLab CI/CD commands including `ci view` and `ci trace`.