本文是《Jenkins流水线(pipeline)实战》系列的第三篇,前面已对Jenkins流水线有了基本认识,也试过从GitHub下载pipeline脚本并执行,今天的实战是编写一段pipeline脚本,该脚本的作用是从GitHub下载一个Java项目(Maven构建的),然后编辑构建此项目,并将构建结果制作成Docker镜像并且推送到私有镜像仓库;

系列文章地址

  1. 《Jenkins流水线(pipeline)实战之:从部署到体验》
  2. 《让Jenkins执行GitHub上的pipeline脚本》
  3. 《Jenkins把GitHub项目做成Docker镜像》

环境信息

为了快速完成Jenkins部署,本次实战用到了Docker,请在实战前准备好以下环境:

  1. 操作系统:Ubuntu 18.04.2 LT
  2. Jenkins:2.176.3
  3. Docker:19.03.1
  4. 私有镜像仓库: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插件部分,如下所示:

  1. <!--使用jib插件-->
  2. <plugin>
  3. <groupId>com.google.cloud.tools</groupId>
  4. <artifactId>jib-maven-plugin</artifactId>
  5. <version>1.3.0</version>
  6. <configuration>
  7. <!--from节点用来设置镜像的基础镜像,相当于Docerkfile中的FROM关键字-->
  8. <from>
  9. <!--使用openjdk官方镜像,tag是8-jdk-stretch,表示镜像的操作系统是debian9,装好了jdk8-->
  10. <image>openjdk:8-jdk-stretch</image>
  11. </from>
  12. <to>
  13. <!--镜像名称和tag,使用了mvn内置变量${project.version},表示当前工程的version-->
  14. <image>bolingcavalry/hellojib:${project.version}</image>
  15. </to>
  16. <!--容器相关的属性-->
  17. <container>
  18. <!--jvm内存参数-->
  19. <jvmFlags>
  20. <jvmFlag>-Xms4g</jvmFlag>
  21. <jvmFlag>-Xmx4g</jvmFlag>
  22. </jvmFlags>
  23. <!--要暴露的端口-->
  24. <ports>
  25. <port>8080</port>
  26. </ports>
  27. </container>
  28. </configuration>
  29. </plugin>
  30. </plugins>
  31. </build>

使用Jib将SpringBoot项目构建成Docker镜像的更多信息,请参考《Docker与Jib(maven插件版)实战》

用私有的GitHub仓库来实战

  1. 考虑到实际工作中大多数源码都没有对外公开,因此我这里也建了个私有GitHub仓库,地址是:https://github.com/zq2599/pipeline.git ,将前面提到的的hellojib工程所有源码都放入此仓库;
  2. pipeline下载私有仓库的源码时需要身份验证,验证方式后面会说到。
  3. 这个私有仓库里面并不只有hellojib一个工程,仓库的根目录下的hellojib目录里面才是构建镜像会用到的Maven工程:

创建Jenkins任务

  1. 创建一个名为build-image流水线任务:

  2. 接来下我们要借助Jenkins提供的语法工具来生成下载GitHub的pipeline代码,如下图,在设置任务的页面点击红框中的流水线语法按钮:

  3. 现在进入的页面是Jenkins辅助我们编写pipeline脚本的地方,请按照下图操作:

  4. 在弹出的窗口配置一个保存了GitHub账号和密码的秘钥配置项,请按照下图的数字顺序操作:

  5. 如下图红框所示,在下拉菜单中选择刚才创建的秘钥配置:

  6. 此时可以发现之前的红色错误提示已经消失(因为鉴权通过了),点击下图红框中的按钮即可生成pipeline源码:

  7. 完整的pipeline脚本内容如下,其中Checkout阶段从GitHub下载的那段脚本,就是上图中自动生成的:
  1. pipeline {
  2. agent any
  3. tools {
  4. maven 'mvn-3.6.2'
  5. }
  6. stages {
  7. stage('Checkout') {
  8. steps {
  9. echo '从GitHub下载项目源码'
  10. checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'git-account-passwd', url: 'https://github.com/zq2599/pipeline.git']]])
  11. }
  12. }
  13. stage('Build') {
  14. steps {
  15. echo '开始编译构建'
  16. sh 'cd hellojib && mvn clean compile -U -DskipTests jib:dockerBuild'
  17. }
  18. }
  19. stage('Push') {
  20. steps {
  21. echo '将本地Docker镜像推送到Harbor镜像仓库'
  22. echo '给当前镜像设置带有Harbor地址和项目名称的Tag,这样才能推送到Harbor的library项目之下'
  23. sh 'docker tag bolingcavalry/hellojib:0.0.1-SNAPSHOT 192.168.50.167/library/hellojib:0.0.1-SNAPSHOT'
  24. echo '登录Harbor'
  25. sh 'docker login 192.168.50.167 -u admin -p Harbor12345'
  26. echo '登录chengg成功,开始推送镜像'
  27. sh 'docker push 192.168.50.167/library/hellojib:0.0.1-SNAPSHOT'
  28. }
  29. }
  30. stage('Clean') {
  31. steps {
  32. echo '清理Maven工程'
  33. sh 'cd hellojib && mvn clean'
  34. echo '删除镜像'
  35. sh 'docker rmi bolingcavalry/hellojib:0.0.1-SNAPSHOT 192.168.50.167/library/hellojib:0.0.1-SNAPSHOT'
  36. echo '清理完毕'
  37. }
  38. }
  39. }
  40. }
  1. 将上面的pipeline脚本填写到build-image任务的流水线脚本输入框中,如下图:

  2. 点击下图红框中的立即构建即可开始执行流水线任务:

  3. 如果配置无误的话任务可以执行成功,如下图,每个阶段的执行结果和耗时都展现出来了:

  4. 如果您的任务构架失败了,点击下图红框中的小圆球,会打开任务执行的详细日志,用来检查错误原因:

  5. 登录Harbor网站,可以看到推送过来的镜像:

把pipeline脚本放在GitHub上

今天的实战中,编写的pipeline脚本是保存在任务的设置中的,还记得 《让Jenkins执行GitHub上的pipeline脚本》一篇的内容么?您可以尝试将今天的pipeline脚本存放在GitHub上,这样从构建脚本到业务项目都实现了版本控制,在多人开发阶段更加实用。

至此,基于pipeline操作的GitHub项目的实战就完成了,如果您正在寻求容器化环境的CI && CD方案,愿本文能给您提供一些参考。

Jenkins把GitHub项目做成Docker镜像的更多相关文章

  1. Docker安装Jenkins打包Maven项目为Docker镜像并运行【保姆级图文教学】

    一.前言 Jenkins作为CI.CD的先驱者,虽然现在的风头没有Gitlab强了,但是还是老当益壮,很多中小公司还是使用比较广泛的.最近小编经历了一次Jenkins发包,感觉还不错,所以自己学习了一 ...

  2. 【Docker】Maven打包SpringBoot项目成Docker镜像并上传到Harbor仓库(Eclipse、STS、IDEA、Maven通用)

    写在前面 最近,在研究如何使用Maven将SpringBoot项目打包成Docker镜像并发布到Harbor仓库,网上翻阅了很多博客和资料,发现大部分都是在复制粘贴别人的东西,没有经过实践的检验,根本 ...

  3. Java SpringBoot 项目构建 Docker 镜像调优实践

    PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取.推送.构建镜像慢,第二.三-次都是几百K大小传输,速度非常快,构建.打包.推 ...

  4. Python环境搭建、python项目以docker镜像方式部署到Linux

    Python环境搭建.python项目以docker镜像方式部署到Linux 本文的项目是用Python写的,记录了生成docker镜像,然后整个项目在Linux跑起来的过程: 原文链接:https: ...

  5. Docker笔记--镜像&基于GO项目创建Docker镜像

    Docker笔记--镜像&基于GO项目创建Docker镜像 核心概念 Doker镜像--包含一个基本的操作系统运行环境和应用程序,镜像是创建Docker容器的基础. Docker容器--如果把 ...

  6. jenkins部署github项目持续集成

    一.先介绍正向代理和反向代理 正向代理 反向代理 二.安装反响代理得到固定域名 http://www.xiaomiqiu.cn/ 三.Jenkins与Github集成 配置前要求: 1.Jenkins ...

  7. 将php项目打包docker镜像

    简介:有时候我们需要将php的项目打包成docker镜像,这里介绍下 思路:我们php和apache结合一个镜像实现php项目的访问,mysql是一个单独的镜像 步骤: 1.首先我们在本地测试好自己的 ...

  8. jenkins构建GitHub项目

    一.Jenkins 配置 Git 首先,登录 Jenkins ,在首页找到 “系统管理 -> Global Tool Configuration -> Git ” Path to Git ...

  9. Azure Devops实践(5)- 构建springboot项目打包docker镜像及容器化部署

    使用Azure Devops构建java springboot项目,创建镜像并容器化部署 1.创建一个springboot项目,我用现有的项目 目录结构如下,使用provider项目 在根目录下添加D ...

随机推荐

  1. 常见ASP脚本攻击及防范技巧

    由于ASP的方便易用,越来越多的网站后台程序都使用ASP脚本语言.但是, 由于ASP本身存在一些安全漏洞,稍不小心就会给黑客提供可乘之机.事实上,安全不仅是网管的事,编程人员也必须在某些安全细节上注意 ...

  2. vue生成element左侧菜单

    首先来总结element ui 官方文档的左侧菜单结构,带有el-submenu为子级节点,el-menu-item表示没有下级.当然,菜单不能写死,因为菜单也许不止两级,所以我们需要递归来实现.根据 ...

  3. Linux x86和x64的区别

    0x01:寄存器分配的不同 (1)64位有16个寄存器,32位只有8个.但是32位前8个都有不同的命名,分别是e _ ,而64位前8个使用了r代替e,也就是r _.e开头的寄存器命名依然可以直接运用于 ...

  4. 10.源码分析---SOFARPC内置链路追踪SOFATRACER是怎么做的?

    SOFARPC源码解析系列: 1. 源码分析---SOFARPC可扩展的机制SPI 2. 源码分析---SOFARPC客户端服务引用 3. 源码分析---SOFARPC客户端服务调用 4. 源码分析- ...

  5. Ubuntu 18.04 下载地址

    http://mirrors.163.com/ubuntu-releases/18.04/

  6. DES加解密工具类

    这两天在跟友商对接接口,在对外暴露接口的时候,因为友商不需要登录即可访问对于系统来说存在安全隐患,所以需要友商在调用接口的时候需要将数据加密,系统解密验证后才执行业务.所有的加密方式并不是万能的,只是 ...

  7. Javaweb之文件的上传与下载

    Javaweb之文件的上传与下载 一.基于表单的文件上传 如果在表单中使用表单元素 <input type=“file” />,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可 ...

  8. 搭建Spark高可用集群

      Spark简介 官网地址:http://spark.apache.org/ Apache Spark™是用于大规模数据处理的统一分析引擎. 从右侧最后一条新闻看,Spark也用于AI人工智能 sp ...

  9. 依赖倒置原则(DIP)、控制反转(IoC)、依赖注入(DI)(C#)

    理解: 依赖倒置原则(DIP)主程序要依赖于抽象接口,不要依赖于具体实现.高层模块不应该依赖底层模块,两个都应该以来抽象.抽象不应该依赖细节,细节应该依赖抽象.(具体看我上一篇贴子) 依赖倒置原则是六 ...

  10. 特殊字符处理 java-jsp

    public String dealStr(String name){ String newStr=""; if(name != null && name.leng ...