在OneDev里配置仓库同步

527 阅读3分钟

介绍

实际工作中,我们可能经常需要进行仓库之前的同步,比如说将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 端的镜像仓库:

  1. 在 GitHub 上创建一个访问令牌 (Personal Access Token)。该访问令牌应有权限写入镜像仓库。

  2. 在 OneDev 的测试项目内创建一个 job secret, 并将值设为上述访问令牌。

    job-secret.png

  3. 设置测试项目的 build spec,定义一个任务 Push to GitHub,并在任务里加入步骤 Repository Sync / Push to Remote。字段 password / access token 使用上述定义的 job secret。

    push-step.png

  4. 设置触发器以便在分支改动或标签创建时运行任务:

    push-trigger.png

保存 build spec,可以看到我们定义的任务自动运行了。在 GitHub 端查看镜像仓库,应该可以看到文件 .onedev-buildspec.yml 被同步过来了。可以试着做些其他操作,比如创建新分支或标签,来继续验证同步结果。

将镜像改动同步到本地

我们在 GitHub 上的镜像仓库可能会合并其他贡献者的代码,所以我们接着配置 OneDev 使得镜像上的改动可以同步到本地:

  1. 继续编辑测试项目的 build spec,定义一个新的任务 Pull from GitHub,并在其中加入步骤 Repository Sync / Pull from Remote 如下所示:

    pull-step.png

    这里我们使用之前的 job secret 来访问 GitHub 镜像。如果镜像可以公共访问,该配置可以不填。

  2. 为该任务设置一个定时触发器,比如说每天晚上一点钟运行:

    pull-trigger.png

  3. 如果本地 OneDev 可以从外网访问的话,我们可以让 GitHub 在镜像仓库有改动时自动触发该任务。这可通过设置镜像仓库的 webhook 做到,如下所示:

    webhook.png

    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 用户的访问令牌:

    access-token.png

    注意在生产环境中 Payload URL 务必使用 Https 协议,否则 URL 中的 access token 很容易泄露。

    保存 webhook,OneDev就可以实时将 GitHub 镜像改动同步到本地了。

结语

这样我们就完成了从 OneDev 到 GitHub 仓库的双向同步设置。因为同步以标准的 CI 任务运行,我们可以订阅特定的构建查询来及时得知同步失败,通过查看构建日志来分析同步失败的原因,又或者通过资源设置来控制多个同步任务的资源使用等等。

谢谢关注!