介绍
实际工作中,我们可能经常需要进行仓库之前的同步,比如说将OneDev仓库的改动同步到GitHub端以方便其他人访问,或者将其他人在GitHub端贡献的代码同步回OneDev等等。
该教程介绍如何使用OneDev 7.1 引入的仓库同步步骤来实现此功能。
准备工作
首先我们通过如下命令启动OneDev:
$ docker run -t --rm -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd)/onedev:/opt/onedev -p 6610:6610 -p 6611:6611 1dev/server:7.1.6
在浏览器中打开 localhost:6610 来完成基本设置,然后创建一个测试项目,假设项目名为 test。
接着在 GitHub 端创建一个空项目作为我们测试项目的镜像,不妨假定其 URL 为:github.com/youraccount…
将本地改动同步到镜像
现在我们配置 OneDev,使得任何分支或标签的改动可以立即推送到 GitHub 端的镜像仓库:
-
在 GitHub 上创建一个访问令牌 (Personal Access Token)。该访问令牌应有权限写入镜像仓库。
-
在 OneDev 的测试项目内创建一个 job secret, 并将值设为上述访问令牌。
-
设置测试项目的 build spec,定义一个任务 Push to GitHub,并在任务里加入步骤 Repository Sync / Push to Remote。字段 password / access token 使用上述定义的 job secret。
-
设置触发器以便在分支改动或标签创建时运行任务:
保存 build spec,可以看到我们定义的任务自动运行了。在 GitHub 端查看镜像仓库,应该可以看到文件 .onedev-buildspec.yml 被同步过来了。可以试着做些其他操作,比如创建新分支或标签,来继续验证同步结果。
将镜像改动同步到本地
我们在 GitHub 上的镜像仓库可能会合并其他贡献者的代码,所以我们接着配置 OneDev 使得镜像上的改动可以同步到本地:
-
继续编辑测试项目的 build spec,定义一个新的任务 Pull from GitHub,并在其中加入步骤 Repository Sync / Pull from Remote 如下所示:
这里我们使用之前的 job secret 来访问 GitHub 镜像。如果镜像可以公共访问,该配置可以不填。
-
为该任务设置一个定时触发器,比如说每天晚上一点钟运行:
-
如果本地 OneDev 可以从外网访问的话,我们可以让 GitHub 在镜像仓库有改动时自动触发该任务。这可通过设置镜像仓库的 webhook 做到,如下所示:
Payload URL 的定义如下:
http://onedev.example.com/api/trigger-job? project=test&job=Pull%20from%20GitHub&branch=master&access-token=<OneDev access token>这里 onedev.example.com 为本地 OneDev 的 DNS 名。任务名称因为包含空格,所以需要进行 URL 编码。 需要替换为有权限运行指定任务的 OneDev 用户的访问令牌:
注意在生产环境中 Payload URL 务必使用 Https 协议,否则 URL 中的 access token 很容易泄露。
保存 webhook,OneDev就可以实时将 GitHub 镜像改动同步到本地了。
结语
这样我们就完成了从 OneDev 到 GitHub 仓库的双向同步设置。因为同步以标准的 CI 任务运行,我们可以订阅特定的构建查询来及时得知同步失败,通过查看构建日志来分析同步失败的原因,又或者通过资源设置来控制多个同步任务的资源使用等等。
谢谢关注!