使用 Jenkins + Github + dokcer-compose 部署项目-实战篇

使用 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的服务配置,添加启动参数

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