写点什么

Jenkins 把 GitHub 项目做成 Docker 镜像

作者:程序员欣宸
  • 2022-10-23
    广东
  • 本文字数:3069 字

    阅读完需:约 10 分钟

Jenkins把GitHub项目做成Docker镜像

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 本文是《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 上下载,地址和链接信息如下表所示:


  • 这个 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>
复制代码


用私有的 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 方案,愿本文能给您提供一些参考。

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...


发布于: 刚刚阅读数: 3
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018-04-19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
Jenkins把GitHub项目做成Docker镜像_Docker_程序员欣宸_InfoQ写作社区