This project provides a Command Line Interface (CLI) for Gitlab written in Go. The project uses the go-gitlab client for the communication with Gitlab.
It allows you to run Gitlab administration tasks from your command line.
-
create a user
golab user create --email [email protected] --username username --password 12341234 --name "User McArthur" --skipConfirmation
-
modify a user
golab user modify -i 41 --admin true
-
create a new project / repository
golab project create -g my-group -n my-project
-
add an ssh key for a user
golab user ssh-keys add --key "`cat ~/.ssh/id_rsa.pub`" --title "my dsa key"
-
create commits from the command line
golab commits create --id 30 --actions "`cat cmd/fixtures/commit-actions.json`" --branch new-branch --start_branch master --commit_message "committed with golab"
-
query your json output with jq
golab project list | jq ".[] | {name: .name, id: .id}
For a complete documentation of features, check the generated documentation
Install the CLI tool with
go get -u github.com/michaellihs/golab
go install github.com/michaellihs/golab
or download a binary release.
Run the following command to login with your username and password
golab login --host <hostname> --user <username> [--password <password>]
If --password
is omitted, you'll be prompted to enter your password interactively.
According to this discussion the login with username and password might not work with newer Gitlab versions.
First create a Gitlab personal access token for your user in Gitlab (most likely an admin user).
Create a file .golab.yml
in either ~/
or the directory you want to use golab with the following content:
---
url: "http(s)://<gitlab url>"
token: "<access token>"
Test your configuration - e.g. by running golab project
to get a list of projects from your Gitlab server.
The auto-completion file for ZSH can be generated with
golab zsh-completion --path zsh/_golab
TODO: After the #compdef
header, add a #autoload
- see http://zsh.sourceforge.net/Doc/Release/Completion-System.html
Check where to add your auto-complete files with echo $FPATH
and copy the generated file there with
cp zsh/_golab /usr/local/share/zsh/site-functions/_golab
Don't forget to reload / restart your ZSH shell after changing the auto-complete file (e.g. source ~/.zshrc
).
Run curl
requests against the API:
curl --header "PRIVATE-TOKEN: FqBiTTJ4oRPdskWDTktr" -H "Content-Type: application/json" -X PUT -d '{"admin": true}' http://localhost:8080/api/v4/users/41
There is a makefile
included that can build and test the application and render the automatically generated documentation:
-
make
- build the application -
make test
- run the tests. Before you run the tests, you have to set the environment variables -
GITLAB_HOST
-
GITLAB_ROOT_USER
-
GITLAB_ROOT_PASSWORD
-
make gendoc
- render the documentation
Run Ginkgo tests with
cd cmd
ginkgo -v
govendor fetch github.com/spf13/cobra
Regular expression for replace in IntelliJ
(\s+)([^\s]+?)\s+([^\s]+?)\s+([^\s]+?)\s+(.+)
$1$2 *$3 `flag_name:"$2" type:"$3" required:"$4" description:"$5"`
For local development, you can use a Gitlab Docker image. There are some pitfalls, when using Gitlab Docker image on a Mac:
- You cannot properly mount the
/var/opt/gitlab
directory due to issues with NFS mounts on Mac - The ssh port
22
is already in use on the Mac, if a ssh server is running
Therefore adapt the provided run command to the following:
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 8080:80 --publish 8022:22 \
--name gitlab \
--volume /tmp/gitlab/config:/etc/gitlab \
--volume /tmp/gitlab/logs:/var/log/gitlab \
gitlab/gitlab-ce:9.5.10-ce.0
On my machine:
{bind /Users/mimi/docker/gitlab/config /etc/gitlab true rprivate} {bind /Users/mimi/docker/gitlab/logs /var/log/gitlab true rprivate} {bind /Users/mimi/docker/gitlab/data /var/opt/gitlab true rprivate}]
Afterwards you can start the (existing) container with:
sudo docker start gitlab
Attention we are currently testing against Gitlab version 9.5.10-ce.0
. Make sure to pin the version of the Docker image instead of using latest
.
If you see panic: trying to get string value of flag of type int
, most likely you used a flag type other than *string
for a flag that needs transformation, e.g.
GroupAccess *string `flag_name:"group_access" short:"a" type:"integer" transform:"str2AccessLevel" required:"yes" description:"..."`
Remember: you only can use *string
as field type, when you need a transformation of the value!
If you see json: Unmarshal(non-pointer []*gitlab.ProtectedBranch)
, most likely you forgot to use the pointer of a return value in the XyzService
, e.g.
var p []*ProtectedBranch
resp, err := s.client.Do(req, p)
instead of
var p []*ProtectedBranch
resp, err := s.client.Do(req, &p)
golab login
should take a parameter -e
that sets an environment which we can later on select with -e
in each command or read from $golab_env
.
Therefore we also need to change the structure of the .golab.yml
like this:
---
gitlab.com:
url: "https://gitlab.com"
token: "gitlab_com_token"
localhost:
url: "http://localhost:12345"
token: "localhost_token"
This allows working with multiple Gitlab servers at the same time.
Currently the go-gitlab library provides no support for GPG keys, neither does this to.
Currently there is no support for nested groups since this feature is only available in Gitlab >= 10.3
Currently, when logging in with username and password (on Cygwin) on Windows, the password is not hidden (as it is on MacOS).