本文是《Jenkins 流水线 (pipeline) 实战》系列的第三篇, 前面已对 Jenkins 流水线有了基本认识, 也试过从 GitHub 下载 pipeline 脚本并执行, 今天的实战是编写一段 pipeline 脚本, 该脚本的作用是从 GitHub 下载一个 Java 项目(Maven 构建的), 然后编辑构建此项目, 并将构建结果制作成 Docker 镜像并且推送到私有镜像仓库;
系列文章地址
《Jenkins 流水线 (pipeline) 实战之: 从部署到体验》;
《让 Jenkins 执行 GitHub 上的 pipeline 脚本》;
《Jenkins 把 GitHub 项目做成 Docker 镜像》;
环境信息
为了快速完成 Jenkins 部署, 本次实战用到了 Docker, 请在实战前准备好以下环境:
操作系统: Ubuntu 18.04.2 LT
- Jenkins:2.176.3
- Docker:19.03.1
私有镜像仓库: Harbor 1.9.0
实战内容简介
今天的实战功能如下图所示:
关于 Docker 私有镜像仓库 Harbor
构建好的 Docker 镜像, 会被推送到 Docker 镜像仓库 Harbor, 此仓库是我自己在本地搭建的, 详细搭建步骤请参考《CentOS 部署 Harbor 镜像仓库》
如果您有 hub.docker.com 网站的账号, 也可以直接将镜像推送到此网站, 这样大家都能使用到您制作的镜像了.
关于本次用到的 GitHub 项目
本次实战会将一个 GitHub 上的项目先编译, 再构建成 Docker 镜像, 我这边准备了一个基于 Maven 构建的 SpringBoot 项目, 这是个 Hello world 级别的工程, 唯一特别之处是 pom.xml 中用到了 Jib 插件, 用来将 SpringBoot 项目构建成 Docker 镜像.
该项目的源码可以从 GitHub 上下载, 地址和链接信息如下表所示:
| 名称 | 链接 | 备注 |
| :-------- | :----| :----|
| 项目主页 | https://github.com/zq2599/blog_demos | 该项目在 GitHub 上的主页 |
| Git 仓库地址(https)| https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址, https 协议 |
| Git 仓库地址(SSH)| Git@GitHub.com:zq2599/blog_demos.Git | 该项目源码的仓库地址, SSH 协议 |
这个 Git 项目中有多个文件夹, 本章的应用在 hellojib 文件夹下, 如下图所示:
来看看此工程的 pom.xml, 重点是 Jib 插件部分, 如下所示:
- <!-- 使用 jib 插件 -->
- <plugin>
- <groupId>com.google.cloud.tools</groupId>
- <artifactId>jib-maven-plugin</artifactId>
- <version>1.3.0</version>
- <configuration>
- <!--from 节点用来设置镜像的基础镜像, 相当于 Docerkfile 中的 FROM 关键字 -->
- <from>
- <!-- 使用 openjdk 官方镜像, tag 是 8-jdk-stretch, 表示镜像的操作系统是 debian9, 装好了 jdk8-->
- <image>openjdk:8-jdk-stretch</image>
- </from>
- <to>
- <!-- 镜像名称和 tag, 使用了 mvn 内置变量 ${project.version}, 表示当前工程的 version-->
- <image>bolingcavalry/hellojib:${project.version}</image>
- </to>
- <!-- 容器相关的属性 -->
- <container>
- <!--jvm 内存参数 -->
- <jvmFlags>
- <jvmFlag>-Xms4g</jvmFlag>
- <jvmFlag>-Xmx4g</jvmFlag>
- </jvmFlags>
- <!-- 要暴露的端口 -->
- <ports>
- <port>8080</port>
- </ports>
- </container>
- </configuration>
- </plugin>
- </plugins>
- </build>
使用 Jib 将 SpringBoot 项目构建成 Docker 镜像的更多信息, 请参考《Docker 与 Jib(maven 插件版)实战》;
用私有的 GitHub 仓库来实战
考虑到实际工作中大多数源码都没有对外公开, 因此我这里也建了个私有 GitHub 仓库, 地址是: https://github.com/zq2599/pipeline.git , 将前面提到的的 hellojib 工程所有源码都放入此仓库;
pipeline 下载私有仓库的源码时需要身份验证, 验证方式后面会说到.
这个私有仓库里面并不只有 hellojib 一个工程, 仓库的根目录下的 hellojib 目录里面才是构建镜像会用到的 Maven 工程:
创建 Jenkins 任务
创建一个名为 build-image 流水线任务:
接来下我们要借助 Jenkins 提供的语法工具来生成下载 GitHub 的 pipeline 代码, 如下图, 在设置任务的页面点击红框中的流水线语法按钮:
现在进入的页面是 Jenkins 辅助我们编写 pipeline 脚本的地方, 请按照下图操作:
在弹出的窗口配置一个保存了 GitHub 账号和密码的秘钥配置项, 请按照下图的数字顺序操作:
如下图红框所示, 在下拉菜单中选择刚才创建的秘钥配置:
此时可以发现之前的红色错误提示已经消失(因为鉴权通过了), 点击下图红框中的按钮即可生成 pipeline 源码:
完整的 pipeline 脚本内容如下, 其中 Checkout 阶段从 GitHub 下载的那段脚本, 就是上图中自动生成的:
- pipeline {
- agent any
- tools {
- maven 'mvn-3.6.2'
- }
- stages {
- stage('Checkout') {
- steps {
- echo '从 GitHub 下载项目源码'
- checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'git-account-passwd', url: 'https://github.com/zq2599/pipeline.git']]])
- }
- }
- stage('Build') {
- steps {
- echo '开始编译构建'
- sh 'cd hellojib && mvn clean compile -U -DskipTests jib:dockerBuild'
- }
- }
- stage('Push') {
- steps {
- echo '将本地 Docker 镜像推送到 Harbor 镜像仓库'
- echo '给当前镜像设置带有 Harbor 地址和项目名称的 Tag, 这样才能推送到 Harbor 的 library 项目之下'
- sh 'docker tag bolingcavalry/hellojib:0.0.1-SNAPSHOT 192.168.50.167/library/hellojib:0.0.1-SNAPSHOT'
- echo '登录 Harbor'
- sh 'docker login 192.168.50.167 -u admin -p Harbor12345'
- echo '登录 chengg 成功, 开始推送镜像'
- sh 'docker push 192.168.50.167/library/hellojib:0.0.1-SNAPSHOT'
- }
- }
- stage('Clean') {
- steps {
- echo '清理 Maven 工程'
- sh 'cd hellojib && mvn clean'
- echo '删除镜像'
- sh 'docker rmi bolingcavalry/hellojib:0.0.1-SNAPSHOT 192.168.50.167/library/hellojib:0.0.1-SNAPSHOT'
- echo '清理完毕'
- }
- }
- }
- }
将上面的 pipeline 脚本填写到 build-image 任务的流水线脚本输入框中, 如下图:
点击下图红框中的立即构建即可开始执行流水线任务:
如果配置无误的话任务可以执行成功, 如下图, 每个阶段的执行结果和耗时都展现出来了:
如果您的任务构架失败了, 点击下图红框中的小圆球, 会打开任务执行的详细日志, 用来检查错误原因:
登录 Harbor 网站, 可以看到推送过来的镜像:
### 把 pipeline 脚本放在 GitHub 上
今天的实战中, 编写的 pipeline 脚本是保存在任务的设置中的, 还记得 《让 Jenkins 执行 GitHub 上的 pipeline 脚本》一篇的内容么? 您可以尝试将今天的 pipeline 脚本存放在 GitHub 上, 这样从构建脚本到业务项目都实现了版本控制, 在多人开发阶段更加实用.
至此, 基于 pipeline 操作的 GitHub 项目的实战就完成了, 如果您正在寻求容器化环境的 CI && CD 方案, 愿本文能给您提供一些参考.
来源: https://www.cnblogs.com/bolingcavalry/p/11568774.html