From f3f6c26557c246c4fff6c0d4e2114136da58df1d Mon Sep 17 00:00:00 2001 From: Massaki Archambault Date: Thu, 31 Dec 2020 16:29:25 -0500 Subject: [PATCH] write README --- README.md | 119 ++++++++++++++++++++++++++++++++++++++++++++- media/group_id.jpg | Bin 0 -> 30682 bytes 2 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 media/group_id.jpg diff --git a/README.md b/README.md index bbda2ef..41b731f 100644 --- a/README.md +++ b/README.md @@ -1 +1,118 @@ -# gitlabfs \ No newline at end of file +# gitlabfs + +`gitlabfs` allows you to mount and navigate Gitlab groups and user personal projects as a FUSE filesystem with every groups represented as a folder and every projects represented as a symlink pointing on a local clone of the project. + +Partial output of `tree`, truncated and with a max of 4 levels: +``` +$ tree -L 4 +. +├── projects +│   └── gitlab-org +│   ├── 5-minute-production-app +│   │   ├── deploy-template -> /home/marchambault/.local/share/gitlabfs/gitlab.com/22487050 +│   │   ├── examples +│   │   ├── hipio -> /home/marchambault/.local/share/gitlabfs/gitlab.com/23344605 +│   │   ├── sandbox +│   │   └── static-template -> /home/marchambault/.local/share/gitlabfs/gitlab.com/23203100 +│   ├── allocations -> /home/marchambault/.local/share/gitlabfs/gitlab.com/684698 +│   ├── apilab -> /home/marchambault/.local/share/gitlabfs/gitlab.com/2383700 +│   ├── architecture +│   │   └── tasks -> /home/marchambault/.local/share/gitlabfs/gitlab.com/22351703 +│   ├── async-retrospectives -> /home/marchambault/.local/share/gitlabfs/gitlab.com/7937396 +│   ├── auto-deploy-app -> /home/marchambault/.local/share/gitlabfs/gitlab.com/6329546 +│   ├── auto-deploy-helm -> /home/marchambault/.local/share/gitlabfs/gitlab.com/3651684 +│   ├── auto-devops-v12-10 -> /home/marchambault/.local/share/gitlabfs/gitlab.com/18629149 +│   ├── backstage-changelog -> /home/marchambault/.local/share/gitlabfs/gitlab.com/7602162 +│   ├── blob-examples -> /home/marchambault/.local/share/gitlabfs/gitlab.com/3094319 +│   ├── build +│   │   ├── CNG -> /home/marchambault/.local/share/gitlabfs/gitlab.com/4359271 +│   │   ├── CNG-mirror -> /home/marchambault/.local/share/gitlabfs/gitlab.com/7682093 +│   │   ├── dsop-scripts -> /home/marchambault/.local/share/gitlabfs/gitlab.com/19310217 +│   │   ├── omnibus-mirror +│   │   └── tr-test-dependency-proxy -> /home/marchambault/.local/share/gitlabfs/gitlab.com/20085049 +│   ├── charts +│   │   ├── apparmor -> /home/marchambault/.local/share/gitlabfs/gitlab.com/18991900 +│   │   ├── auto-deploy-app -> /home/marchambault/.local/share/gitlabfs/gitlab.com/11915984 +│   │   ├── components +│   │   ├── consul -> /home/marchambault/.local/share/gitlabfs/gitlab.com/18663049 +│   │   ├── deploy-image-helm-base -> /home/marchambault/.local/share/gitlabfs/gitlab.com/7453181 +│   │   ├── elastic-stack -> /home/marchambault/.local/share/gitlabfs/gitlab.com/18439881 +│   │   ├── fluentd-elasticsearch -> /home/marchambault/.local/share/gitlabfs/gitlab.com/17253921 +│   │   ├── gitlab -> /home/marchambault/.local/share/gitlabfs/gitlab.com/3828396 +│   │   ├── gitlab-runner -> /home/marchambault/.local/share/gitlabfs/gitlab.com/6329679 +│   │   ├── knative -> /home/marchambault/.local/share/gitlabfs/gitlab.com/16590122 +│   │   └── plantuml -> /home/marchambault/.local/share/gitlabfs/gitlab.com/14372596 +│   [...] +└── users + └── badjware + └── test_project -> /home/marchambault/.local/share/gitlabfs/gitlab.com/23370783 + +696 directories, 0 files +``` + + +## Install + +Install [go](https://golang.org/) and run +``` sh +go get github.com/badjware/gitlabfs +``` + +The executable will be in `$GOPATH/bin/gitlabfs` or `~/go/bin/gitlabfs` by default. For convenience, copy `gitlabfs` somewhere suitable or add `~/go/bin` in your `PATH`. + +## Usage + +Download the [example configuration file](./config.example.yaml) and edit the default configuration to suit your needs. + +### Getting an API token + +To generate an api token, log into your Gitlab instance, and go in your user settings > Access Token. Create a personal access token with the following permissions at the minimum: +* `read_user` +* `read_api` + +### Getting the group ids + +The group id can be seen just under the name of the group in Gitlab. + +![group-id](media/group_id.jpg) + +### Getting the user ids + +Log into gitlab and go to https://gitlab.com/api/v4/users?username=USERNAME where `USERNAME` is the username of the user you wish to know the id of. The json response will contain the user id. + +See https://forum.gitlab.com/t/where-is-my-user-id-in-gitlab-com/7912 + +### Mounting the filesystem + +You can mount the filesystem with the following command: +``` sh +~/go/bin/gitlabfs -config /path/to/your/config.yaml /path/to/mountpoint +``` +Once the filesystem is mounted, you can `cd` into it and navigate it like any other filesystem. The first time `ls` is run the list of groups and projects is fetched from Gitlab. This operation can take a few seconds and the command will appear frozen until it's completed. Subsequent `ls` will fetch from the cache and should be much faster. + +If `on_clone` is set to `init` or `no-checkout`, the locally cloned project will appear empty. Simply running `git pull` manually in the project folder will sync it up with Gitlab. + +### Unmounting the filesystem + +To stop the filesystem, use the command `umount /path/to/mountpoint` to cleanly unmount the filesystem. + +If `gitlabfs` is not cleanly stopped, you might start seeing the error "transport endpoint is not connected" when trying to access the mountpoint, even preventing from mounting back the filesystem on the same mountpoint. To fix this, use `umount` as root user, eg: `sudo umount /path/to/mountpoint`. + +## Caching + +To reduce the number of calls to the Gitlab api and improve the responsiveness of the filesystem, `gitlabfs` will cache the content of the group in memory. If a group or project is renamed, created or deleted from Gitlab, these change will not appear in the filesystem. To force `gitlabfs` to refresh its cache, use `touch .refresh` in the folder to refresh to force `gitlabfs` to query Gitlab for the list of groups and projects again. + +While the filesystem lives in memory, the git repositories that are cloned are saved on disk. By default, they are saved in `$XDG_DATA_HOME/gitlabfs` or `$HOME/.local/share/gitlabfs`, if `$XDG_DATA_HOME` is unset. `gitlabfs` symlink to the local clone of that repo. The local clone is unaffected by project rename or archive/unarchive in Gitlab and a given project will always point to the correct local folder. + +## Known issues / Future improvements +* There is a race condition that could happen when interacting with git that needs to be fixed. +* Cloning and pulling repositories is currently very resource-intensive, especially on large set of repositories. Need to track down what causes this to happen. For now, leaving `on_clone` set to `init` and `auto_pull` to `false` in the configuration avoids the issue. +* Cache persists forever until a manual refresh is requested. Some way to automatically refresh would be nice. +* The filesystem is currently read-only. Implementing `mkdir` to create groups, `ln` or `touch` to create projects, etc. would be nice. +* Code need some cleanup and could maybe be optimized here and there. + +## Building + +Simply use `make` to create the executable. The executable will be in `bin/`. + +See `make help` for all available targets. \ No newline at end of file diff --git a/media/group_id.jpg b/media/group_id.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a41e9bb838c5ac1ed4e10217c4765b1923f092ea GIT binary patch literal 30682 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 literal 0 HcmV?d00001