#gitlab #github #ci #rest-api #restful #ssh-key

夜间版 构建 labhub

用于在GitHub上运行与GitLab CI的构建的机器人

10 个版本

0.1.10 2019年7月11日
0.1.9 2019年5月9日
0.1.7 2019年4月17日
0.1.6 2019年3月16日

#24 in #rest-api

无许可

730KB
3K SLoC

pipeline status codecov Current Crates.io Version

🤖 LabHub

一个用Rust编写的GitHub机器人,用于在开源项目中使用GitLab CI。

特性

  • 监听来自GitHub的webhooks
  • 从外部(分叉)PR将分支推送到GitLab
  • 通过PR评论接受命令
  • 可能很快会有更多功能 👻

命令

可以通过在PR上用CI用户的登录名评论来执行命令。

  • @labhub retry: 重试失败的流水线

问题

GitLab有一个很棒的CI系统,但是它不适合开源项目 😧(撰写本文时)因为它默认不会构建外部PR。外部构建中暴露秘密的风险引起了安全问题,GitLab出于谨慎考虑,默认不构建外部PR。

有关该问题的更多详细信息,请查看这个GitLab讨论

✨ 解决方案

如果您不担心秘密泄露,那么LabHub可能适合您!LabHub监听来自GitHub的webhooks以通知新pull请求。如果PR来自分叉的仓库,它将把分支推送到GitLab(对应于PR)以测试构建。

🏃‍♀️ 实际应用

使用LabHub?请打开PR在此处添加您的项目! 😀

以下项目正在使用LabHub

编译

LabHub需要Rust夜间版。要使用rustup编译

$ rustup toolchain install nightly
$ rustup default nightly
$ cargo build

如果这是您首选的工具链,请务必使用rustup default stable切换回stable

🎛 配置

LabHub使用LabHub.toml进行配置。有关详细信息,请参阅src/config.rs。您可以通过设置环境变量LABHUB_TOML来指定LabHub.toml的路径。

🚀 部署

设置Webhooks

您需要为任何您希望启用LabHub的仓库设置webhooks。目前,仅需要GitHub的webhooks。要开始,请访问 github.com/<org>/<repo>/settings/hooks 并添加一个新的webhook。

配置webhook以发送PR和push事件。

  • 将payload URL路径设置为 /github/events,这是LabHub期望的GitHub事件路径。
  • 创建一个密钥(例如:cat /dev/urandom | LC_CTYPE=C tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)并在webhook配置中设置与LabHub相同的值。
  • 确保payload类型为 application/json
  • 这是您的webhook应该看起来像的样子

创建SSH密钥

您需要一个CI用户,该用户在GitHub和GitLab上都有SSH密钥。在两个网站上创建账户(如果您还没有CI用户),并为LabHub创建一个SSH密钥。

$ ssh-keygen -f labhub-key.ecdsa -t ecdsa -b 521

请妥善保管 labhub-key.ecdsa,并将 labhub-key.ecdsa.pub 上传到GitHub和GitLab的CI用户。

创建个人访问令牌

在GitHub和GitLab上为您CI用户创建个人访问令牌。通过在 LabHub.toml 中设置 api_token 参数,为GitHub和GitLab提供这些令牌。

GitHub的个人访问令牌

GitLab的个人访问令牌

使用Helm部署到Kubernetes

此存储库中包含一个Helm图表,这是首选的部署方法。要使用它,您必须首先使用kubectl创建SSH密钥密钥。假设您的SSH私钥是 labhub-key.ecdsa

$ kubectl create secret generic labhub-ssh-keys --from-file=github=labhub-key.ecdsa --from-file=gitlab=labhub-key.ecdsa

如果您选择,可以为GitHub和GitLab使用不同的密钥。

一旦您有了密钥,请从 helm/labhub/ 安装Helm图表。

$ cd helm/labhub/
$ cp values.yaml myvalues.yaml
### Edit myvalues.yaml to your liking ###
$ helm upgrade --install labhub . -f myvalues.yaml

未实现

  • 未实现GitLab分支与打开的PR的周期性协调:如果由于任何原因错过webhook,GitLab管道可能无法正确反映PR状态

依赖关系

~36–49MB
~1M SLoC