重要
提前说明
- 开发人员提交代码到 Gitlab 代码仓库
- 通过 Gitlab 配置的 Jenkins Webhook 触发 Pipeline 自动构建
- Jenkins 触发构建构建任务,根据 Pipeline 脚本定义分步骤构建
- 先进行代码静态分析,单元测试
- 然后进行 Maven 构建(Java 项目)
- 根据构建结果构建 Docker 镜像
- 推送 Docker 镜像到 Harbor 仓库
- 触发更新服务阶段,使用 Helm 安装/更新 Release
- 查看服务是否更新成功。
部署Jenkins
chart地址: https://github.com/helm/charts/tree/master/stable/jenkins
|
|
1.后端服务容器化
|
|
- 页面打包到一个jar文件
build-container-/usr/app/target/polls-0.0.1-SNAPSHOT.jar
- 将上面jar文件添加到
jdk-container-/app/polls.jar
目录
2. 前段服务容器化
|
|
- 页面打包到一个build目录
build-container-/usr/src/app/build
- 将上面目录添加到
nginx-container-/usr/share/nginx/html
目录
3. Jenkins task配置
在 Pipeline 中去自定义Slave Pod
中所需要用到的容器模板,需要什么镜像只需要在Slave Pod Template
中声明即可,不需要安装了所有工具的Slave
镜像。
首先Jenkins 中 kubernetes 配置,Jenkins -> 系统管理 -> 系统设置 -> 云 -> Kubernetes区域
新建一个名为polling-app-server
类型为流水线(Pipeline)
的任务:
勾选触发远程构建
的触发器,其中令牌我们可以随便写一个字符串,然后记住下面的 URL,将 JENKINS_URL 替换成 Jenkins 的地址,我们这里的地址就是:http://jenkins.qikqiak.com/job/polling-app-server/build?token=server321
在下面的流水线区域,可以选择Pipeline script
,测试流水线脚本。正常配置选择Pipeline script from SCM
,就是从代码仓库中通过Jenkinsfile
文件获取Pipeline script
脚本定义,选择 SCM 来源为Git。配置仓库地址http://git.qikqiak.com/course/polling-app-server.git
,由于是在一个 Slave Pod 中去进行构建,所以如果使用 SSH 的方式去访问 Gitlab 代码仓库的话就需要频繁的去更新 SSH-KEY,所以直接采用用户名和密码的形式来访问:
在Credentials区域点击添加按钮添加我们访问 Gitlab 的用户名和密码:
配置用于构建的分支,如果所有的分支需要进行构建,将Branch Specifier
区域留空即可,一般情况下,只有不同的环境对应的分支才需要构建,比如 master、develop、test 等,平时开发的 feature 或者 bugfix 的分支没必要频繁构建,下图只配置 master 和 develop 两个分支用户构建:
然后前往 Gitlab 中配置项目polling-app-server Webhook,settings -> Integrations,填写上面得到的 trigger 地址:
保存后,可以直接点击Test
-> Push Event
测试是否可以正常访问 Webhook 地址,这里需要注意的是我们需要配置下 Jenkins 的安全配置,否则这里的触发器没权限访问 Jenkins,系统管理 -> 全局安全配置:取消防止跨站点请求伪造
,勾选上匿名用户具有可读权限
:
如果测试出现了Hook executed successfully: HTTP 201
则证明 Webhook 配置成功了,否则就需要检查下 Jenkins 的安全配置是否正确了。
4. JenkinsFile
Clone 代码 -> 代码静态分析 -> 单元测试 -> Maven 打包 -> Docker 镜像构建/推送 -> Helm 更新服务
|
|
/root/.m2
挂载为了maven
构建添加缓存,否则每次构建重新下载依赖,太慢。~/.kube
挂载为了让kubectl
和helm
访问Kubernetes
集群。/var/run/docker.sock
挂载为了docker
客户端与Docker Daemon
通信,构建镜像。label标签的定义
使用 、UUID
生成随机字符串,让Slave Pod
每次的名称不一样,不会被固定在一个Pod
上面了,而且有多个构建任务的时候就不会存在等待的情况.
Reference
k8s-deploy jenkins 动态slaves
jenkins pipeline 部署k8s应用
jenkin Blue Ocean 使用
jenkins-pipeline to k8s