由于准备发布所需的步骤较多,软件项目的发布过程需要一段时间,并且容易出现人为错误。通过Jenkins Pipeline自动执行某些步骤来简化发布流程将会大大改善发布的工作流程,这种业界一般称为自动持续集成和自动持续部署(CI/CD),一般来说可以结合Jenkins和Github结合来完成,当然如果是私有仓库用的是gitlab做的话,gitlab自有一套强大的CI/CD流程,在自己体系内就可以完成,而无需Jenkins来做了,以后有机会虫虫会和大家一起探讨gitlab的ci/cd功能。
Jenkins Pipeline(或者简称为"Pipeline",带有大写字母"P")是一套插件,支持在Jenkins中实施和集成持续交付的流程。
今天虫虫和大家一起分享一个通过使用Jenkins Pipeline自动创建进行版本发布的过程。
Pull请求管道的发布
通过以下步骤发布pull请求管道监视开发分支的所有提交:
1)创建一个release /x.y.z分支,其版本相应地更新。
2)在GitHub上创建一个pull请求,将通过变化日志文件(changelog)对版本变化做更新描述,并将Galleon Dev团队添加为审阅者
3)通知我们公司Slack中特定的#channel,新的发布拉取请求已准备好进行审查。
安装设置
Jenkins设置
1)在服务器上安装Jenkins。
2)在Jenkins上安装下面的这些插件
Blue Ocean、Global Slack Notifier Plugin、Pipeline、Pipeline Groovy Libraries、SSH Agent、SSH、SSH Slaves、Workspace Cleanup
3)在服务器上安装[email protected]并确保它可以用jenkins用户进行访问。
hub命令允许jenkins用户在shell中创建请求。
4)在Jenkins凭证上创建以下凭证(凭证ID应符合以下规定):
github-machine-user用户名/密码
github-machine-user-token 加密文本
slack-integration-token加密文本
5)在Manage Jenkins的管理后台\Configure System中配置Global Slack Notifier Settings,配置如下图所示:
测试连接并检查通道:
GitHub设置
为了让Pipeline捕获仓库中的事件(例如push),应该在GitHub上正确设置Jenkins GitHub webhook。
在Payload URL中设置xxx/github-webhook/,如下所示:
Jenkins Pipeline设置
1) 创建一个新的Pipeline。点击New item,输入item名称,选择pipeline类型。
2) 填写基本的通用标签页的字段,如下图所示:
3) 为pipeline添加一个VERSION_BUMP构建参数
自动构建通过PATCH(x.x.1)提升版本。拥有此参数将允许MINOR x.1.x版本增加手动构建。
4)将构建触发器设置GitHub hook触发器为GITScm轮询
5)设置Pipeline字段
从SCM中选择Pipeline脚本并填写如下所示的字段:
确保在分支说明符中设置了正确的开发分支,并在脚本路径中设置了正确的Jenkins路径
结果
我在两个仓库中部署了pipline。开发人员就可以不必手动创建发布拉取请求,而只需push版本到开发分支,而pipeline将自动创建发布拉取请求,进行项目的build和发布。这也可以减少产品发布时与Git相关的人为错误。
遇到的问题
1、使用git pull-request或hub pull-request来自动创建合并请求。
团队用来创建pull请求的当前方法是使用来自git-extras的git pull-request。但是这种方法有一个提示,要求输入GitHub密码,当在shell脚本自动执行命令时会有问题。另一个问题是,git pull-reques是从git config中的user.email配置项中获取电子邮件。
我尝试了一种解决方法:echo ${password}|git pull-request master,但它好像在Jenkinsfile无法工作。考虑到我还需要添加审阅者,因此我放弃了git pull-request,因为它不支持这个功能。
我试过hub,它似乎是一个更好的选择,因为可以通过-r参数添加审阅者,并且可以使用OAuth令牌通过HTTPS进行身份验证。
由于hub拉取请求通过在用户$HOMEdirectory中创建一个./config/hub文件来缓存身份验证令牌,我意识到我可以使用pipeline编写配置文件来使用我们的机器用户的OAuth令牌来验证集线器拉取请求,配置如下所示:
withCredentials([
string(credentialsId: env.GITHUB_MACHINE_USER_TOKEN, variable: 'token'),
usernamePassword(credentialsId: env.GITHUB_MACHINE_USER_PASS, passwordVariable: 'password', usernameVariable: 'username')]) {
writeFile file: env.HUB_CONFIG, text: """github.com:
- user: ${username}
oauth_token: ${token}
protocol: https"""
}
2、添加团队审阅者以发布合并请求
根据hub维护官方说法,添加团队审阅人员通过hub pull -request -r /提取请求尚未包含在任何软件包中。他在master分支中:
因此,审阅者从Jenkins配置文件中添加,如下所示:
// Get reviewers from config
configFileProvider([
configFile(fileId: env.REVIEWERS, variable: 'reviewers')]) {
pullRequestMessage = getPullRequestMessage()
createPullRequest = "hub pull-request -m '${pullRequestMessage}' -b ${PRODUCTION_BRANCH} -h ${releaseBranch} -r ${readFile(reviewers)}"
pullRequestUrl = sh(returnStdout: true, script: createPullRequest).trim()
}
也是为什么使用hub的2.3.0-pre10版本的原因,因为它是hub中的唯一允许通过-r选项添加审阅者的版本。