Teamcity 默认是采用 poll 的形式检查更新,本文尝试让他支持 gitlab webhook
获取 VCS Root ID
teamcity 的 hook 能力其实是配置到对应的 VCS Root 上面的(而不是 project/build),因此需要先找到仓库所对应的 VCS Root ID,这个 ID 可以通过 Project Settings → VCS Roots → 点击对应的 VCS Root 的 Edit 来看到,这个 ID 是一个字符串,会自动生成但是可以手动编辑、全局唯一
创建 Access Token
进入右上角头像 → Profile → Access Tokens 页面,创建一个新的 Access Token,Permission 选择「Limit per Project」,给予 Root Project 的「View project and all parent projects」和「View build configuration settings」权限
组合 commit hook 网址
组合出一个类似于下面的网址(将 <xxx> 替换为对应的内容)
http://<用户名>:<Access Token>@<Teamcity网址>/app/rest/vcs-root-instances/commitHookNotification?locator=vcsRoot:<VCS Root ID>
可以自己利用 curl POST 以上网址,如果输出 Scheduled checking for changes for 1 VCS roots. 就是成功了
配置 Gitlab
打开 Gitlab 仓库的 Integrations Settings,配置「Push events」和「Tag push events」即可,注意 Access Token 在前一步中配置到了 URL 中,gitlab 页面里面的 Secret Token 留空即可
注:配置完成后 polling 的行为
配置 hook 后 Teamcity 仍然会 poll 仓库,但是每次收到 hook 都会使 poll 间隔加倍(最小 15min、最大 4h),而如果 poll 时发现有未进行 hook 通知的更改则会将 poll 间隔恢复到原始值