目录
前言
目标
GitHub 持续集成
提交代码到 GitHub
从 GitHub 更新代码
Git 上显示构建状态
自动触发构建
GitLab 持续集成
安装插件
配置 GitLab 账号
配置 Git 地址
配置钩子
通知 GitLab 状态
结语
参考文档
目录
Jenkins 持续集成学习 - Windows 环境进行. Net 开发 1
Jenkins 持续集成学习 - Windows 环境进行. Net 开发 2
Jenkins 持续集成学习 - Windows 环境进行. Net 开发 3
前言
前面三篇介绍了使用 SVN 的持续集成, 本篇就来学习如何使用 Git 进行持续集成.
目标
探究 .net + Git + jenkins 方案的持续集成.
前面 3 篇文章总结的最终流程如下.
我们需要修改 3 个方面.
代码提交到 Git 上
提交到 Git 上自动触发构建
从 Git 上更新代码
GitHub 持续集成
Jenkins 需要先需要安装 GitHub 相关插件 GitHub plugin.
提交代码到 GitHub
首先新建一个 Git 仓库
提交前需要把 obj 目录下的 project.assets.JSON 排出忽略, obj 其他的文件添加忽略.
关于 project.assets.JSON 的作用可以查看 Jenkins 持续集成学习 - Windows 环境进行. Net 开发 2
同时要把源代码管理中的插件修改为 Git
最后提交即可.
从 GitHub 更新代码
在 jenkins 我们也新添加一个项目, 名称为 gittest, 为了方便, 直接从 SVN 的测试项目复制, 这样我们可以最大程度的减少重复配置.
将项目设置为 GitHub 项目, Job 的菜单就会显示 GitHub 项.
将源代码管理 Subversion 改为 Git
由于我之前 Git 的插件都已经安装好, 因此这里没有碰到任何问题.
添加 Git 凭据, 暂时使用用户名和密码
暂时先通过手动构建, 测试一下流程是否通畅, 暂时先把 Build Triggers 的钩都去掉
配置完后 Job 的左边的菜单就会出现 GitHub 项, 点击就会调转到配置的 GitHub 项目的仓库中.
点击构建
构建成功, Git 日志如下
10:55:27 由用户 jake 启动
10:55:27 构建中 在工作空间 D:\Program Files (x86)\Jenkins\workspace\gittest 中
- 10:55:27> Git.exe rev-parse --is-inside-work-tree # timeout=10
- 10:55:27 Fetching changes from the remote Git repository
- 10:55:27> Git.exe config remote.origin.url https://Github.com/GuojieLin/Jenkins.Core.git # timeout=10
- 10:55:27 Fetching upstream changes from https://Github.com/GuojieLin/Jenkins.Core.git
- 10:55:27> Git.exe --version # timeout=10
10:55:27 using GIT_ASKPASS to set credentials Git 账号
- 10:55:27> Git.exe fetch --tags --progress https://Github.com/GuojieLin/Jenkins.Core.git +refs/heads/*:refs/remotes/origin/*
- 10:55:34> Git.exe rev-parse "refs/remotes/origin/master^{commit}" # timeout=10
- 10:55:34> Git.exe rev-parse "refs/remotes/origin/origin/master^{commit}" # timeout=10
- 10:55:34 Checking out Revision 75be92d4a4c131924a4601504cde7ba613f57b9f (refs/remotes/origin/master)
- 10:55:34> Git.exe config core.sparsecheckout # timeout=10
- 10:55:34> Git.exe checkout -f 75be92d4a4c131924a4601504cde7ba613f57b9f
- 10:55:34 Commit message: "同上"
- 10:55:34> Git.exe rev-list --no-walk da3b7456cf40552cdc66daf2d2db4ed43762c8e4 # timeout=10
- 10:55:34 Path To MSBuild.exe: D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe
- ...
- 10:55:43 [WS-CLEANUP] Deleting project workspace...
- 10:55:43 [WS-CLEANUP] done
- 10:55:43 Finished: SUCCESS
Git 上显示构建状态
在 Build 中添加
Set build status to "pending on Github commit"
, 在构建前可以更新 Git 的提交的状态为 pending
若构建时上面步骤出现异常错误为
ERROR: [GitHub Commit Status Setter] Failed to update commit state on GitHub. Ignoring exception [Cannot retrieve Git metadata for the build]
, 则检查 Git 和 GitClient 插件的版本, 下面的 rc 版本有 bug 会导致无法更新状态待 Git, 使用后面的版本即可.
在 Post-build Action 添加
Set GitHub commit status(universal)
修改圈中的项, 构建成功后就会更新对应的状态到 Git.
通过上面配置完后就可以显示 Jenkins 的构建状态了
自动触发构建
Jenkins 支持 2 种配置方式
手工模式
手工模式需要在 Git 人工配置 jenkins 的 webhook 的通知接收地址, 地址格式为
$JENKINS_BASE_URL/GitHub-webhook/
, 如:
- http://127.0.0.1:8080/Github-webhook/
- .
自动模式
自动模式会通过 GitHub 的 API 自动创建 webhook
详细文档可以查看 GitHub Plugin 插件文档.
手工模式
在 Build Triggers 选择
GitHub hook trigger for GITScm polling
GitHub 上面需要添加一个钩子, 用于代码 push 完成后通知 jenkins 构建.
在设置中点击 Webhooks
点击添加 Webhooks
由于 GitHub 需要通知到我本地的 jenkins 服务, 因此 Jenkins 的钩子回调地址必须能被 GitHub 访问到, 我用花生壳做了内网穿透.
将 Jenkins 的钩子地址配置到 GitHub 的 webhooks 中. 只需要 push 事件即可.
自动模式
在系统设置中找到 GitHub 服务器, 添加一个凭证, 点击连接测试. 若显示
Credentials verified for user XXXX, rate limit: XXXX
即表示连接成功, 由于 GitHub 有访问限制具体查看 Understanding rate limits for GitHub Apps.
然后点击 Advanced 后可以修改 hook 的 url, 我在本地默认是 127.0.0.1 的地址, GitHub 肯定是访问不到的, 需要修改为正确的可被外部访问到的外网地址.
设置完后当修改 Job 的配置保存时就会触发创建 GitHub 的钩子.
但是发现通过 GitHub 无法通知到我本地的 jenkens, 一值显示超时.
测试了下通知地址外网是可以访问到的, 因此怀疑是不是由于某些原因导致 GitHub 无法访问进来.
GitLab 持续集成
由于在国内 GitHub 访问速度不是很理想, 大部分公司都会搭建私有的 Git 仓库, 比如 GitLab.
为了方便, 我直接将 GitHub 的项目导入到了 GitLab 中, 具体导入方法可以查看如何从 GitHub 迁移到 GitLab?
同时我需要在 VS 项目中添加 GitLab 的远程库.
在 VS
团队资源管理器
- 存储库中添加一个远程.
安装插件
安装必要的插件 GitLab Authentication plugin ,GitLab Hook Plugin,GitLab Plugin.
需要注意的是安装 GitLab Hook Plugin 插件的时候, 若 Jenkins 的安装目录路径存在空格, 则可能安装失败. 原因是因为 GitLab Hook Plugin 依赖于 Ruby-runtime, 而 Ruby-runtime 不支持有空格的路径. 因此解决办法是将 jenkins 迁移到无空格的路径下, 如我本来安装的目录是 D:\Program Files (x86)\Jenkins, 将其迁移到 D:\Jenkins. 具体步骤如下:
打开任务管理器或到 Windows 服务中找到 Jenkins, 关闭 Jenkins 服务.
将 Jenkins 整个复制到 D:\Jenkins.
去注册表
计算机 \ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Jenkins
修改 Jenkins 服务路径. 为 D:\Jenkins.
启动 Jenkins 服务
GitLab Hook Plugin 插件可能有个安全问题会提示警告.
通过上述步骤 GitLab Hook Plugin 插件就能安装成功了
配置 GitLab 账号
在 Jenkins 系统设置中找到 GitLab 的配置
钩起
Enable authentication for '/project' end-point
, 这样在 GitLab 通知时需要身份验证, 保证安全性.
添加 Token
到 GitLab 右上角的用户头像点击右键找到 Setting
然后找到 Access Token 生成一个 Token, 只需要勾选 API 权限即可.
添加凭据
将生成好的 Token 复制下来, 回到 Jenkins 配置
添加一个凭据, 选择 GitLab API token, 使用刚才生成的 token 添加即可.
添加完成后测试连通性显示 Success 即可.
在 GitLab connections 我们需要增加如何连接 GitLab, 和 GitHub 一样, 我们需要增加一个 token, 用于授权 Jenkins 的访问.
配置 Git 地址
修改 Git 路径. 选择刚才添加的 GitLab 连接.
修改源码管理中的项目路径
我们可以使用用户名密码或者 token 的方式访问 GitLab
配置钩子
在 Build Triggers 中勾选
Build when a change is pushed to GitLab
, 后面会生成钩子路径, 如果是本地注意将后面的回环地址 ip 改为本地 ip.
在 Secret token 点击生成一个 token, 这个 token 是用于授权 Web hook 访问的. 若没有配置在钩子触发是可能会返回
403
错误码.
到 GitLab 添加一个 Web 钩子, 在 Setting-Integrations 中配置
将刚才的钩子通知地址输入, 我本地无需 SSL, 因此去除了勾选, 只有在 Push 的时候才需要触发. 然后添加钩子.
添加完成点击 Push events 发起一个测试,
返回 200 则表明触发成功.
通知 GitLab 状态
在 Job 的配置中 Post-build action 添加
Publish build status to GitLab
, 构建完后就可通知到 GitLab 上构建状态.
结语
本章完成了使用 GitHub 和 GitLab 进行源代码管理进行持续集成. 但是 GitHub 由于无法通知到我本地的 jenkins 所以无法自动构建.
无论使用 SVN 还是 Git 进行源码管理, 整体流程不变, 自动通知的关键都是代码提交后通知 Jenkins 触发构建.
|SVN|Git|
|-|-|
| 通过客户端或 SVN 服务器钩子, 代码提交后执行脚本通知 Jenkins.| 代码 push 后, Git 通过 Web hook 通知 Jenkins|
参考文档
手把手教你搭建 Jenkins+GitHub 持续集成环境 https://www.jianshu.com/p/22b7860b4e81
- Webhooks Guide https://developer.github.com/webhooks/
- Understanding rate limits for GitHub Apps
使用 GitHub 的 webhooks 进行网站自动化部署
Jenkins 详细实践: SpringBoot+Jenkins+GitLab+Docker-Maven 插件
GitHub Commit Status Setter - Cannot retrieve Git metadata
来源: https://www.cnblogs.com/Jack-Blog/p/10346032.html