#gitlab #gitlab-api #git #command-line #command-line-arguments #env-var #cli

app gitlab-butler

Gitlab 命令行工具,用于自动化无聊的工作

2 个版本

0.9.1 2020 年 11 月 19 日
0.9.0 2020 年 11 月 16 日

#1560 in 开发工具

MIT/Apache

76KB
1.5K SLoC

GitLab pipeline Crates.io Matrix

Gitlab Butler

什么是 gitlab-butler

gitlab-butler 是一个 GitLab 命令行工具,它封装了越来越多的 GitLab API。

大多数选项可以作为命令行参数或通过环境变量提供。

示例用法

asciicast

用法

.env 支持,还有一个特殊的 .private.env 也会被加载,以便在常见的配置之外允许使用私有未提交条目

  • .env 可以包含 GITLAB_BUTLER_PROJECTGITLAB_BUTLER_API_SERVER (已提交)
  • .private.env 可以包含 GITLAB_BUTLER_PRIVATE_TOKEN (未提交 / 上级目录)

您也可以像您喜欢的那样混合使用 dotenvdirenv

获取私有令牌

您可以从 Gitlab 个人资料页面 或使用 ssh 获取私有令牌

$ ssh [email protected] personal_access_token
remote: 
remote: ========================================================================
remote: 
remote: Usage: personal_access_token <name> <scope1[,scope2,...]> [ttl_days]
remote: 
remote: ========================================================================
remote: 
$ ssh [email protected] personal_access_token cli-friendly-token read_repository,read_api 10
Token:   7...ixvzoW...szp
Scopes:  read_repository,read_api
Expires: 2020-11-08

使用命令 ssh git@gitlab.com personal_access_token gitlab-butler api 创建一个 API 范围的令牌,并将其放入一个 .private.env 文件中,例如

GITLAB_BUTLER_PRIVATE_TOKEN=7...ixvzoW...szp

然后创建一个标准的 .env 文件,以指向正确的服务器和项目,例如

GITLAB_BUTLER_API_SERVER=https://gitlab.com/
GITLAB_BUTLER_PROJECT=naufraghi/gitlab-butler

示例帮助

使用 gitlab-butler install 创建一个指向 git-lab 的符号链接,以便可以使用 git lab <command> 使用它

大多数命令会打印带有颜色的响应,但如果使用 -x / --execute 选项,则会启动一个子shell,其中包含有关当前命令的一组环境变量。请参阅下面的列表,在 git lab issues list --help 消息中。

gitlab-butler-issue-list 0.9.0
List issues

USAGE:
    gitlab-butler issue list [OPTIONS]

FLAGS:
    -h, --help
            Prints help information

    -V, --version
            Prints version information


OPTIONS:
    -x, --execute <execute>
            Execute command for each returned issue (in a bash subshell)

            The current issue is exported as environment variables:
              - `issue_id`: 234
              - `issue_title`: Resolve some problem
              - `issue_description` (optional): Long description
              - `issue_slug`: 234-resolve-some-problem
              - `issue_reference`: #234
              - `issue_full_reference`: group/project#234
              - `issue_web_url`: http://gitlab.com/group/project/issues/234

            Example:
              - `... issue list -x 'echo ${issue_reference}: ${issue_title}'`

            Or to use the fully qualified reference:
              - `... issue list -x 'echo ${issue_full_reference}: ${issue_title}'`
    -l, --labels <labels>
            Filter issues by comma-separated list of label names

            Issues must have all labels to be returned.
            - `None` lists all issues with no labels. `Any` lists all issues with at least one label.
            - `No+Label` (Deprecated) lists all issues with no labels. Predefined names are case-insensitive.
    -n, --limit <limit>
             [default: 100]

    -m, --milestone <milestone>
            Filter issues by the milestone title. `None` lists all issues with no milestone.

            - `Any` lists all issues that have an assigned milestone.
    -p, --project <project>
            Project name or id (defaults to CI_PROJECT_PATH) [env: GITLAB_BUTLER_PROJECT=naufraghi/gitlab-butler]

    -s, --state <state>
            Filter issues by state: all, opened, closed [default: opened]

此功能允许创建复杂的管道,如 backport 命令,该命令从当前分支(映射到特定问题)

  1. 在描述中创建一个带有反向引用的新问题
  2. 创建一个新的本地分支,其名称为规范化的 <issue>-<title-slug> 名称
  3. 创建一个新的MR,该MR从当前分支开始,并针对提供的分支

这里使用的是 just 命令执行器

backport TARGET:
    git lab issue get -x "just _backport-issue {{TARGET}}"
_backport-issue TARGET:
    git lab issue new "$issue_title ({{TARGET}})" -d "Backport of issue $issue_reference" -x "just _backport-mr {{TARGET}}"
_backport-mr TARGET:
    git branch $issue_slug origin/{{TARGET}}
    git push origin $issue_slug
    git lab mr new "Resolve \"$issue_title\"" -d "Closes $issue_reference" -s $issue_slug -t {{TARGET}}

这里是执行日志

image

merge-ready 子命令

merge-ready 子命令尝试合并队列中标记的MR,进行变基,并等待管道成功完成。

Marge-bot 非常相似,但专门为在CI内部运行而设计(实际上,gitlab-butler 仍在alpha版本,可能会吃掉您的仓库)。

总结:您有一个项目,希望有一个 始终为绿色 的master分支和一个 半线性 的历史记录,所以如果您的团队足够大,您将陷入争夺首先变基和合并的斗争。一个初始的解决方案可以是让某个人成为 合并者,TL实际上可以这样做,在代码合并前再次检查,但变基/合并的工作很繁琐。

这时就出现了 gitlab-butler

  1. Alice正在开发一个功能并创建了MR1,并将其分配给Bob
  2. Bob进行审查,最终将 ~"Merge ready 🐙" 标签添加到MR中,并将MR分配给技术负责人
  3. TL进行最终审查,并最终添加🐙表情符号
  4. gitlab-butler 触发变基和/或合并操作

merge-ready CI 使用

您可以在 while 循环中运行 gitlab-butler,或者在CI本身中直接运行(您需要导出一些变量,并设置一个计划),如下所示

gitlab-butler:
  image: registry.gitlab.com/naufraghi/gitlab-butler:latest
  variables:
    GIT_STRATEGY: none
  script:
    - /run/gitlab-butler mr merge-ready
  only:
    - schedules
    - master

当前实现不使用 批准 功能,而仅依赖于标签/表情符号约定,因为我开始使用它之前还没有解锁该功能。

注意

[^1]: 现代代码审查:谷歌案例研究,2次审查似乎是一个好数字:image

许可

根据您的选择,许可方式如下

贡献

除非您明确说明,否则您提交的任何有意包含在作品中的贡献都应按上述方式双许可,而不附加任何其他条款或条件。

依赖关系

~16–30MB
~519K SLoC