使用 Jenkins + Github + dokcer-compose 部署项目-实战篇
需要声明的一点是,此处实现的项目自动构建原理是 Github+Jenkins 的 webhook,因此得保证 github 能访问 到 jenkins,需要一台具有公网ip的服务器用于部署jenkins,或配合nps/fpr作为内网穿透的代理。
用于测试的项目是周志明老师的"凤凰书城",详情参考------ https://github.com/fenixsoft/microservice_arch_springcloud 需要把该项目 fork 到自己的仓库。
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的服务配置,添加启动参数
bash
sudo systemctl edit jenkins
添加如下内容
bash
[Service]
Environment="JAVA_OPTS=-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"
重启服务
bash
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