Jenkins把GitHub项目做成Docker镜像

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 利用Jenkin的流水线脚本,从GitHub的私有仓库下载一个Java工程,将其编译构建成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上下载,地址和链接信息如下表所示:
名称 链接 备注
项目主页 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>

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

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。 &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
22天前
|
Docker 容器
将本地的应用程序打包成Docker镜像
将本地的应用程序打包成Docker镜像
|
6天前
|
NoSQL PHP MongoDB
docker push推送自己搭建的镜像
本文详细介绍了如何搭建和复盘两个Web安全挑战环境:人力资源管理系统和邮件管理系统。首先,通过Docker搭建MongoDB和PHP环境,模拟人力资源管理系统的漏洞,包括nosql注入和文件写入等。接着,复盘了如何利用这些漏洞获取flag。邮件管理系统部分,通过目录遍历、文件恢复和字符串比较等技术,逐步绕过验证并最终获取flag。文章提供了详细的步骤和代码示例,适合安全研究人员学习和实践。
24 3
docker push推送自己搭建的镜像
|
23天前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
43 9
|
1月前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
1865 30
|
23天前
|
存储 缓存 运维
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像。此机制减少存储占用,提高构建和传输效率。Docker还通过缓存机制提升构建和运行效率,减少重复工作。文章深入解析了Docker镜像分层存储与缓存机制,包括具体实现、管理优化及实际应用案例,帮助读者全面理解其优势与挑战。
43 4
|
1月前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
1月前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
158 2
|
1月前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
176 1
|
1月前
|
缓存 JavaScript 安全
深入理解Docker镜像构建过程
深入理解Docker镜像构建过程
72 0