Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文详解 Jenkins 与 Docker 的自动化 CI/CD 实战

一文详解 Jenkins 与 Docker 的自动化 CI/CD 实战

作者头像
DevOps时代
发布于 2021-05-07 08:16:24
发布于 2021-05-07 08:16:24
4K01
代码可运行
举报
运行总次数:1
代码可运行

高效的 CI/CD 环境能获得什么呢?

  1. 及时发现问题:提早得到集成反馈和修复
  2. 大幅度减少故障率:业务流程化,减少人工出错风险
  3. 加快迭代速度:可以在几分钟内运行几十次、甚至上百次持续集成
  4. 减少时间成本:多项目管理及繁琐的部署工作没有了,不必再花费一定时间去准备
  5. 研发端到端流水线,一键部署,应用弹性伸缩,灰度发布

要想做到一个高效的 CI/CD 流程,需要有能力整合 DevOps 工具链及多环境适配,并且设计之初以自动化为原则,如一键部署、一键升级。

发布流程设计

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
开发语言:Java
项目代码版本管理:Git
代码编译:Maven
持续集成:Jenkins
交付:以Docker镜像形式交付,提交至Harbor
部署:Docker主机创建容器

环境规划如下:

工作流程:

  1. 开发人员提交代码到 Git 版本仓库;
  2. Jenkins 人工/定时触发项目构建;
  3. Jenkins 拉取代码、代码编译、打包镜像、推送到镜像仓库
  4. Jenkins 在 Docker 主机创建容器并发布。

部署Git仓库

首先部署一个Git仓库,存储测试的代码,这里选择solo博客程序做测试:https://github.com/b3log/solo 。该步骤在 192.168.30.130 上执行。

安装Git:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# yum install -y git

创建 Git 用户并设置密码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# useradd git# passwd git

创建仓库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# su - git
# mkdir solo.git
# cd solo.git
# git init --bare           #创建裸仓库
# vim config                #添加用户,否则commit报错[user]
        name = lzx
        email = lzx@lzx.com

上传项目到仓库:

拉取代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# git clone https://github.com/b3log/solo.git

添加私有仓库地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# cd solo/
# git remote remove origin
# git remote add origin git@192.168.30.130:/home/git/solo.git

提交到私有仓库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# git add .
# git commit -m "all"# git push origin master

部署 Harbor 镜像仓库 之前部署过,此处省略,参考这里:部署Harbor

安装Docker 需要安装Docker及配置Java环镜。该步骤在 192.168.30.128 上执行。

安装依赖包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# yum install -y yum-utils device-mapper-persistent-data lvm2

添加 Docker 软件包源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo

安装 Docker CE:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# yum install -y docker-ce

启动并开机启动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# systemctl start docker && systemctl enable docker

安装 Java 和 Maven 环境:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# tar zxf jdk-8u191-linux-x64.tar.gz && mv jdk1.8.0_191/ /usr/local/jdk# wget http://mirrors.shu.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz# tar zxf apache-maven-3.6.0-bin.tar.gz && mv apache-maven-3.6.0/ /usr/local/maven# vim /etc/profileMAVEN_HOME=/usr/local/maven
JAVA_HOME=/usr/local/jdk
PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport JAVA_HOME PATH CLASSPATH# source !$

授权 Docker 主机免密登陆Git仓库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ssh-keygen# ssh-copy-id git@192.168.30.130# ssh git@192.168.30.130            #测试登录

安装 Jenkins 基于CentOS镜像构建Jenkins镜像,同时将安装jdk、maven。该步骤在 192.168.30.129 上执行。

编辑Dockerfile:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# vim Dockerfile-java
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FROM centos:latest
MAINTAINER lzx  lzx@lzxlinux.com

RUN yum install -y wget vim curl unzip iproute net-tools && \
    yum clean all && \
    rm -rf /var/cache/yum/*

ADD jdk-8u191-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_191/ /usr/local/jdk && \
    wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.39/bin/apache-tomcat-8.5.39.tar.gz && \
    tar zxf apache-tomcat-8.5.39.tar.gz && \
    mv apache-tomcat-8.5.39 /usr/local/tomcat && \
    wget http://mirrors.shu.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz && \
    tar zxf apache-maven-3.6.0-bin.tar.gz && \
    mv apache-maven-3.6.0 /usr/local/maven && \
    wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war && \
    rm -rf /usr/local/tomcat/webapps/* && \
    unzip jenkins.war -d /usr/local/tomcat/webapps/ROOT && \
    rm -rf jenkins.war jdk-* apache-*
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME /usr/local/jdk/jre
ENV CATALINA_HOME /usr/local/tomcat
ENV MAVEN_HOME /usr/local/maven
ENV CLASSPATH $JAVA_HOME/lib:$JRE_HOME/lib:$JRE_HOME/lib/charsets.jar

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib:$MAVEN_HOME/bin
WORKDIR /usr/local/tomcat
EXPOSE 8080
CMD ["catalina.sh","run"]

Docker构建Jenkins镜像:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# docker build -t jenkins-2.164 -f Dockerfile-java .

启动Jenkins:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# docker run -d -p 8080:8080 --name jenkins jenkins-2.164:latest

启动完打开网页访问 192.168.30.129:8080,安装推荐插件,设置账户密码。

添加凭据: 系统管理 → 凭据配置 → 凭据 → Jenkins → 全局凭据 → 添加凭据

  • 新建节点:

系统管理 → 节点管理 → 新建节点

标签请注意不要填错,用于识别哪一个slave执行任务。

  • 新建任务:

新建任务 → 流水线 ,名称任意。

Jenkinsfile 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
node ("192.168.30.128") {        #指定slave标签#拉取代码stage('Git Checkout') {
    checkout([$class: 'GitSCM',branches: [[name: '$Tag']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'git@192.168.30.130:/home/git/solo.git']]])}       #$Tag引用用户交互输入的tag#代码编译stage('Maven Build') {
    sh '''
    export JAVA_HOME=/usr/local/jdk
    /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true
    '''}#项目打包到镜像并推送到镜像仓库stage('Build and Puah Image') {
    sh '''
    docker login -u admin -p Harbor12345 harbor.uqp.com
    REPOSITORY=harbor.uqp.com/project/solo:${Tag}
    cat > Dockerfile2 <<EOF
    FROM harbor.uqp.com/library/tomcat-85:latest
    RUN rm -rf /usr/local/tomcat/webapps/ROOT
    COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
    CMD ["catalina.sh","run"]EOF
    docker build -t $REPOSITORY -f Dockerfile2 . 
    docker push $REPOSITORY
    '''             #根据$Tag作为镜像版本号}#部署到Docker主机stage('Deploy to Docker') {
    sh '''
    REPOSITORY=harbor.uqp.com/project/solo:${Tag}
    docker rm -f blog-solo | true
    docker image rm $REPOSITORY | true
    docker login -u amdin -p Harbor12345 harbor.uqp.com
    docker container run -d -v /usr/local/jdk:/usr/local/jdk --name blog-solo -p 88:8080 $REPOSITORY
    '''}}

发布测试:

  • Git仓库模拟提交代码创建tag:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# cd solo/
# touch src/main/webapp/123.txt
# git add .
# git commit -m "touch 123.txt"# git tag 1.0.0
# git push origin 1.0.0

Jenkins上执行任务:

带参数执行构建

  • 到 Docker 主机上查看:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# docker ps -a
CONTAINER ID   IMAGE   COMMAND    CREATED    STATUS       PORTS                  NAMES
386b2097e507        harbor.uqp.com/project/solo:1.0.0    "catalina.sh run"   3 minutes ago       Exited (255) 2 minutes ago                          blog-solo

容器ID与Jenkins上一致,但意外退出,查看原因

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# docker logs 38[ERROR]-[2019-03-26 16:41:47]-[org.b3log.latke.Latkes:786]: Read skin [Pinghsu]'s  configuration failed: null
[ERROR]-[2019-03-26 16:41:47]-[org.b3log.solo.SoloServletListener:316]: Can't load the default skins, please make sure skin [Pinghsu] is under skins directory and structure correctly

提示皮肤配置为空,因此容器启动不起来。整个过程中,maven构建这一步可能有误,但jenkins执行过程中未报错;也有可能是b3log官方仓库有问题。

  • 查看 harbor 是否有对应镜像:

对应业务的 docker 镜像已经上传到 harbor 中。

大致过程是没有问题的,基本上可以实现业务基于 Jenkins 与 Docker 的自动化发布。后续有空再更新优化 maven 过程。作为自动化 CI/CD 流水线还是有很多优点的,例如:

  1. 项目发布可视化,明确阶段,方便处理问题;
  2. 一个 Jenkinsfile 文件就可以管理整个项目生命周期;
  3. 代码版本管理方便,版本发布、回退一键完成。

来源:https://blog.51cto.com/u_10272167/2730581

XOPS 风向标!GOPS 全球运维大会 2021 · 深圳站,互联网、金融、通信、传统行业近80位名企专家已集结,哪些议题是你的最爱?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps时代 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Jenkins与Docker的自动化CI/CD实战
在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经形成一套标准的流程,最重要的组成部分就是持续集成(CI)及持续部署、交付(CD)。本文基于Jenkins+Docker+Git实现一套CI自动化发布流程。
星哥玩云
2022/07/28
8220
Jenkins与Docker的自动化CI/CD实战
Docker下搭建Jenkins构建环境
然后编写一个dockerfile来生成一个镜像,dockerfile其实就是一系列命令的集合,有点像windows的批处理文件,
朝雨忆轻尘
2019/06/18
6000
Docker安装Jenkins实现项目自动部署(Java Web项目) 顶
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
wuweixiang
2018/12/12
2.9K0
CI / CD+ Docker 综合实战
3、打包生成的代码,生成一个新版本的镜像,push到本地docker仓库harbor
BUG弄潮儿
2021/05/17
6830
CI / CD+ Docker 综合实战
Jenkins+Gitlab+Maven+Tomcat实现自动集成、打包、部署
192.168.1.10 由于刚才已经与gitlab进行sshd密钥部署,就不重新获取了
互联网-小阿宇
2022/11/21
1.1K0
Jenkins+Gitlab+Maven+Tomcat实现自动集成、打包、部署
利用 Jenkins 实现CI/CD
​软件开发中,集成是一个很可能发生未知错误的过程。持续集成是一种软件开发实践,希望团队中的成员频繁提交代码到代码仓库,且每次提交都能通过自动化测试进行验证,从而使问题尽早暴露和解决。
星哥玩云
2022/09/15
7600
利用 Jenkins 实现CI/CD
在Linux 上部署Jenkins和项目
目前持续集成(CI)已成为当前许多软件开发团队在整个软件开发生命周期内侧重于保证代码质量的常见做法。它是一种实践,旨在缓和和稳固软件的构建过程。并且能够帮助您的开发团队应对如下挑战:
我被狗咬了
2019/09/23
2.6K1
在Linux 上部署Jenkins和项目
04 . Jenkins部署Java项目
https://img2020.cnblogs.com/blog/1871335/202006/1871335-20200604173550160-1696672787.png
iginkgo18
2020/09/27
7330
04 . Jenkins部署Java项目
【黄啊码】centos7配置docker教程
之前项目使用tomcat部署,随着后期项目越来越多,同一个tomcat下启动N个项目,造成的问题就是更新其中某一个项目会导致整个tomcat重启,其他同一个tomcat下的项目导致暂时无法访问,非常影响工作效率。为了解决这一个痛点,所以目前想到使用docker容器部署配置项目,希望以此可以隔离不同项目环境,使之不互相影响。
黄啊码
2022/06/10
6300
.NETCore下CI/CD之自动化测试
为了呼应《中国.NET开发者峰会2019上海站》,作为演讲嘉宾,我希望和各位同行建立更多的互动,为此,我特地将部分演讲内容,整理成文章先行发布。本文从零开始,一步一步的引导,从安装JDK/Tomcat/jenkins 到建立第一个 CI/CD 项目,确保按照本文指引,能快速的在 CentOS 下,将 .NET Core 通过 jenkins 进行持续集成/持续部署,通过 jenkins,实现集成测试自动化,最终达到,快速构建项目,执行单元测试,生成测试报告,发送测试报告等工作,让测试工作伴随着 CI/CD 的持续进行而不断的对输出进行测试和校正,真正实现让本地单元测试在 CI/CD 中发挥其巨大的威力。
梁规晓
2019/10/31
9760
Jenkins教程(自动化部署)
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。
全栈程序员站长
2022/08/27
10.4K0
Jenkins教程(自动化部署)
devops[单节点版本]
DevOps 是 Development(开发)和 Operations(运维)的组合,是 ⼀种⽅法论,是⼀组过程、⽅法与系统的统称,⽤于促进应⽤开发、应2 ⽤运维和质量保障(QA)部⻔之间的沟通、协作与整合,以期打破传 统开发和运营之间的壁垒和鸿沟 CI/CD 的主要概念是持续集成、持续交付和持续部署。 CI/CD 是解决集成新代码可能给开发和运营团队带来的问题(⼜名“集 成地狱”)的解决⽅案。
高大北
2023/03/19
1K0
墙裂推荐!看完全面掌握,最详细的 Docker 学习笔记总结(2021最新版)
Docker 是一个开源的容器引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者和系统管理员在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括 VMs(虚拟机)、bare metal、OpenStack 集群、云端、数据中心和其他的基础应用平台。容器是完全使用沙箱机制,相互之间不会有任何接口。
民工哥
2021/04/18
3.6K0
干货:构建一个可实现CI/CD的tomcat容器应用镜像
一、应用容器化的方法 应用容器化,常见的方法有三种: 以上三种方式: 第一种本地构建最常见,也比较简单,但效率太低。 第二种方式是通过CI构建。这种方式则是比较传统的方法。需要指出的:CI/CD的实
魏新宇
2018/03/22
1.4K0
干货:构建一个可实现CI/CD的tomcat容器应用镜像
1.Jenkins入门基础介绍与持续化集成部署
Tips :个人理解 Jenkins 是一个调度平台,本身不需要处理任何事情,而是通过众多的插件来完成所有的工作;
全栈工程师修炼指南
2022/09/29
6.4K0
1.Jenkins入门基础介绍与持续化集成部署
『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)
几年前没用过jenkins的时候,每次都需要用eclipse打个war包,然后小心翼翼的上传到服务器,给服务器原有的war包改个名字,mv到bak目录中,停止服务,删除原有的webapps的项目,再把新上传的war包放进到tomcat的webapp说的目录下,启动项目。每次改个html的标签的名字都需要重新上传,每次都是这么繁琐的操作。其实小公司还可以容忍,如果是比较大的项目,还持续停留在这个脚本上运维人员都累死了,因为有可能一次部署几十个项目。源码:https://github.com/limingios/netFuture/tree/master/jenkins/ysource/idig8
IT架构圈
2019/03/04
8650
『互联网架构』软件架构-jenkins搭建和 maven gitlab自动化部署流程(上)(五)
使用Dockerfile制作JDK+Tomcat镜像
记录下使用Dockerfile制作JDK+Tomcat镜像的过程笔记,希望对大家有所帮助。
星哥玩云
2022/07/14
1.2K0
Docker利用Dockerfile来制作镜像
在前面的例子(Docker Tomcat镜像制作)中,我们从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低。所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其中,然后让docker读取并分析、执行,那么重复构建、更新将变得很方便,所以Dockerfile就此诞生了。
星哥玩云
2022/07/26
4680
Docker利用Dockerfile来制作镜像
jenkins实战系列
本文主要介绍了在linux 下如何部署jenkins.以及通过jenkins 如何发布php.以及java 程序,利用jenkins 来实现邮件告警及时了解项目发布过程中产生的问题。
互联网老辛
2018/12/10
1.1K0
Jenkins+Gitlab+Nginx+Maven编译Java项目自动发布与基于tag版本回退(重复构建问题已解决)
实现流程: 手动部署Java项目至后端Web集群 1.搭建Nginx+Tomcat集群架构。 2.开发提交Java源代码至Gitlab仓库。 3.手动获取Java源代码,然后使用Maven进行编译。 4.将编译后的War包部署至后端Tomcat集群。 5.通过浏览器访问测试,检测项目部署情况。 自动部署Java项目至Web集群 1.Jenkins安装Maven Integration插件,使其支持Maven项目构建。 2.Jenkins配置JDK路径以及Maven路径。 3.配置Build-->Maven编
非著名运维
2022/06/22
1.9K0
Jenkins+Gitlab+Nginx+Maven编译Java项目自动发布与基于tag版本回退(重复构建问题已解决)
推荐阅读
相关推荐
Jenkins与Docker的自动化CI/CD实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验