由于准备发布所需的步骤较多,软件项目的发布过程需要一段时间,并且容易出现人为错误。通过Jenkins Pipeline自动执行某些步骤来简化发布流程将会大大改善发布的工作流程,这种业界一般称为自动持续集成和自动持续部署(CI/CD),一般来说可以结合Jenkins和Github结合来完成,当然如果是私有仓库用的是gitlab做的话,gitlab自有一套强大的CI/CD流程,在自己体系内就可以完成,而无需Jenkins来做了,以后有机会虫虫会和大家一起探讨gitlab的ci/cd功能。

Jenkins Pipeline(或者简称为"Pipeline",带有大写字母"P")是一套插件,支持在Jenkins中实施和集成持续交付的流程。


通过以下步骤发布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)在服务器上安装hub@2.3.0-pre10并确保它可以用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选项添加审阅者的版本。