使用 Jenkins + Github + dokcer-compose 部署项目-实战篇
需要声明的一点是,此处实现的项目自动构建原理是 Github+Jenkins 的 webhook,因此得保证 github 能访问 到 jenkins,需要一台具有公网ip的服务器用于部署jenkins,或配合nps/fpr作为内网穿透的代理。
用于测试的项目是周志明老师的“凤凰书城”,详情参考—— https://github.com/fenixsoft/microservice_arch_springcloud 需要把该项目 fork 到自己的仓库。
github 配置
jenkins关联github
在github 个人信息 --> Settings --> Developer Settings --> Personal access tokens --> Tokens(calssic) --> Generate new token 生成token。生成前勾选"repo"和"admin:repo_hook"的权限。保存token备用。
进入 github 刚刚 fork 的"凤凰书城"项目 --> Settings --> Webhooks --> Add Webhook --> 输入刚刚部署 jenkins 的服务器的IP + /github-webhook/
例如: "http://123.123.123.123:8080/github-webhook/" jenkins的github插件会在该接口上监听。一定要留意,不能忽略url后面的斜杠"/",如果没有这个斜杠,jenkins会回302
参考——jenkins - Github Webhook 与 Jenkins 返回 302 Found
Jenkins 配置
系统管理 --> 系统设置 --> GitHub --> 添加Github服务器(URL填"https://api.github.com")
凭证 Credentials 点击添加,类型选择 Secret Text,把github生成的token填入保存。
点击添加按钮后,下拉选择凭证,选择刚才新增的凭证,然后点击连接测试按钮,此处还需要把“管理Hook”勾选上
Jenkinx 新增任务
新增“多分支流水线”任务,该种类型的任务对后续的操作更方便。
选择“GitHub项目”,填写项目地址
配置“构建触发器”,选择"Github hook trigger for GITSCM polling"
配置流水线信息
1、选择流水线类型“Pipeline script from SCM”,
配置SCM信息,即设定github项目路径、设定github的凭证、指定要构建的项目分支
2、指定Jenkins流水线脚本的路径,此处"Jenkinsfile"表示项目根目录下的"Jenkinsfile"文件
修改项目代码并发布
1、把 fork 的项目代码 clone 到本地,使用 Idea 打开,在项目根目录新建名为"Jenkinsfile" 的 jenkins 流水线脚本文件,内容可参考下文——
pipeline {
agent any
environment {
WS = "$WORKSPACE"
}
//定义流水线的加工流程
stages {
stage('1.环境检查'){
steps {
sh 'printenv'
sh 'id'
sh 'docker version'
sh 'java -version'
sh 'git --version'
sh 'mvn -v'
sh 'pwd && ls -alh'
}
}
stage('2.项目编译'){
steps {
sh 'mvn clean package -Dmaven.test.skip=true'
}
}
stage('3.应用部署'){
steps {
sh 'docker-compose -f docker-compose.dev.yml -p fenix up -d'
}
}
}
}
2、编辑好Jenkinsfile文件后,把项目 push 到 github,即可在项目中的Settings --> Webhooks --> Recent Deliveries 看到 github 触发的deleveries
点击对应的delivery即可查看详细的请求信息,如果想做测试,可以点击"Redeliver"按钮
打开Jenkins,即可看到构建历史
访问对应的IP+端口即可看到项目页面
排错
在操作过程中,可能会遇到github webhook请求不成功,构建不触发等问题,需要针对不同情况做不同处理
1、Github webhook 不生效,提示403 No valid crumb was included in the request,因为被 jenkins 跨域拦截了,解决方法——
使用systemctl edit打开jenkins的服务配置,添加启动参数
sudo systemctl edit jenkins
添加如下内容
[Service]
Environment="JAVA_OPTS=-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"
重启服务
sudo systemctl restart jenkins
详情参考——Ubuntu Jenkins升级2.346.3后远程调用403解决方案(HTTP ERROR 403 No valid crumb was included in the request)
2、github webhook 提示 403 Authentication required
git使用webhook触发Jenkins构建问题Error 403 No valid crumb was included in the reques和Authentication required
在Jenkins全局安全配置 --> 授权策略 --> 登录用户可以做任何事下,勾选"匿名用户具有可读权限"即可解决。注意,该方法只用于临时的测试,有安全风险。
3、github请求jenkins成功,但项目不自动构建。这里有个问题需要注意,对于pipeline类型的job,要在配置job时取消勾选"轻量级检出"("lightweight checkout"),并且要手动构建一次,后续才会触发自动构建。参考——Jenkins not triggering pipeline build on successful github webhook