ci/cd——构建企业级docker+jenkins+git+harbor流水线自动化持续集成持续发布平台(代码片段)

烈火吞噬 烈火吞噬     2022-12-13     704

关键词:

构建企业级Docker+Jenkins+Git+Harbor流水线自动化持续集成持续发布平台

CI/CD是什么?

  • CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法
  • CI/CD 的核心概念是持续集成持续交付持续部署
  • 作为一个面向开发和运营团队的解决方案,CI/CD 主要针对在集成新代码时所引发的问题(亦称:“集成地狱”)

持续集成(CI)/持续交付(CD)的优势

  • 持续集成/持续交付是现代软件开发周期的基础
  • 在传统的软件开发方法中,每个功能更新或修复错误都会每隔一段时间进行发布,这显著增加了在部署时耦合更改的机会
  • 持续集成/持续交付可以解决所有这些问题,并使整个过程更易于管理高效
  • 在现代软件开发实践中,持续集成(CI)/持续交付(CD)是构建测试应用程序并将其部署到生产中的基础
  • 持续交付(CD)有助于降低风险,并通过自动化来自不同项目开发人员的多个代码更改来实现生产一致性
  • 另一方面,持续交付使开发人员能够无缝地将集成代码交付到生产中,从而提供快速有效的自动化流程,以向客户轻松发布新功能和更新
  • 持续集成/持续交付管道的优势
    • 管理较小的代码更改
    • 故障隔离可在短期内防止错误
    • 缩短平均解决时间(MTTR)
    • 提高测试可靠性
    • 加快释放速度
    • 减少积压
    • 推动客户实现
    • 加强团队的透明沟通和责任感
    • 降低成本
    • 易于维护和更新
  • 结论
    • 部署CI / CD流程后,您可能会在开发人员工作流程中实现更平滑的过渡
    • 关键是,测试质量首先需要在工作流程中引起很多注意,这使您成为其他人可以效仿的灯塔
    • 无论您的产品交付有多快和连续,没有质量意识都没有关系
    • 当CI / CD管道的更多步骤可以自动化时,质量也意味着更快的质量发布

自动化部署流程图


  • 首先,开发人员每天进行代码提交,提交到Git仓库
  • 然后,Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK, Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程
  • 最后,Jenkins把生成的jar或war包分发到测试服务器或者生产服务器,测试人员或用户就可以访问 应用

Git Github Gitlab的区别

  • Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
  • 是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
  • Github是在线的基于Git的代码托管服务。GitHub是2008年由Ruby on Rails编写而成。GitHub同时提供付费账户和免费账户。这两种账户都可以创建公开的代码仓库,只有付费账户可以创建私有的代码仓库。Gitlab解决这个问题,可以在上面创建免费的私人repo。

前言:一些自己想说的话

  • 关于实验的开头,本意想使用Docker部署Jenkins,但是在调试MavenJDK的时候一直报错
  • 从7月8号到7月9号的凌晨4点,一直报错,各种解决方案已经被我翻烂了…各种问题接踵而至…
  • 于是带着懵逼询问了专业人士,朋友让我使用传统的方式,好家伙,话不多说上操作
  • Docker部署的流程就放这把,可以直接跳过,只是作为一个笔记!
#下载Jenkins镜像
[root@jenkins ~]# docker pull jenkins/jenkins:lts-jdk11

#创建Jenkins挂载路径
[root@jenkins ~]# mkdir -p /docker/jenkins

#对此目录开放权限,否则容器启动时会报错
[root@jenkins ~]# chmod 777 /docker/jenkins/

#启动容器
[root@jenkins ~]# docker run -itd -p 8080:8080 -p 50000:50000 --restart always -v /docker/jenkins:/var/jenkins_home --name jenkins jenkins/jenkins:lts-jdk11


#通过文件形式查看解锁密码
[root@jenkins ~]# cat /docker/jenkins/secrets/initialAdminPassword 
8bf67325c495443a869b249d1f4bb853

#通过日志形式查看解锁密码
[root@jenkins ~]# docker logs -f jenkins
8bf67325c495443a869b249d1f4bb853

部署Docker+Jenkins+Git+Harbor流水线自动化CI/CD

CentOS Linux release 7.5.1804 (Core)
  • 主机规划
主机IP地址
Git-server192.168.100.20
Harbor192.168.100.30
Jenkins192.168.100.40

安装部署Git

#安装Git
[root@git-server ~]# yum -y install git
[root@git-server ~]# git --version
git version 1.8.3.1

#创建用户并配置密码
[root@git-server ~]# useradd git
[root@git-server ~]# passwd git

#进入Git用户
[root@git-server ~]# su - git

#创建git仓库目录
[git@git-server ~]$ mkdir /home/git/demo.git
[git@git-server ~]$ cd /home/git/demo.git/

#初始化git仓库
[git@git-server demo.git]$ git --bare init

#查看初始化后的仓库
[git@git-server demo.git]$ ls
branches  config  description  HEAD  hooks  info  objects  refs

安装Harbor

#下载harbor安装包
[root@harbor ~]# wget https://storage.googleapis.com/harbor-releases/release-1.9.0/harbor-offline-installer-v1.9.1.tgz
[root@harbor ~]# tar xf harbor-offline-installer-v1.9.1.tgz -C /usr/src/

#启动Docker并开机自启
[root@harbor ~]# systemctl start docker && systemctl enable docker
#当前已经安装Docker
[root@harbor ~]# docker --version
Docker version 20.10.7, build f0df350

#安装Docker-compose
#由于官方镜像是国外的太慢,使用国内镜像下载
[root@git ~]# curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

#为compose授权
[root@harbor ~]# chmod +x /usr/local/bin/docker-compose
[root@harbor ~]# docker-compose version
docker-compose version 1.25.5, build 8a1c60f6
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

#安装并运行harbor
[root@harbor ~]# cd /usr/src/harbor/

#编辑配置文件
[root@harbor harbor]# vim harbor.yml

#主机修改为本机IP地址
hostname: 192.168.100.30

#检测并创建harbor需要文件
[root@harbor harbor]# ./prepare

#安装harbor
[root@harbor harbor]# ./install.sh
Now you should be able to visit the admin portal at http://192.168.100.30

#添加http仓库信任,默认不信任镜像仓库
[root@harbor ~]# vim /etc/docker/daemon.json
"insecure-registries":["192.168.100.30"]
[root@harbor ~]# systemctl restart docker


  • 新建项目

  • 查看推送镜像要求

#下载官方Tomcat镜像
[root@harbor ~]# docker pull tomcat

#根据网站提示为Tomcat镜像打标签
[root@harbor ~]# docker tag tomcat:latest 192.168.100.30/pakho/tomcat:v1

#登陆Harbor镜像仓库
[root@harbor ~]# docker login 192.168.100.30 -uadmin -pHarbor12345

#上传镜像
[root@harbor ~]# docker push 192.168.100.30/pakho/tomcat:v1


  • 刷新网页查看
    • 镜像存在,说明上传镜像成功!

安装Jenkins

  • 测试能否正常拉取代码
#安装Git测试是否能够拉取代码
[root@jenkins ~]# yum -y install git

#拉取Java项目
[root@jenkins ~]# git clone https://github.com/407777853/java-demo

#修改项目默认仓库路径
[root@jenkins ~]# cd java-demo/
[root@jenkins java-demo]# vim .git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = git@192.168.100.20:/home/git/demo.git      #指明本地镜像仓库
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master

#添加本地版本仓库
[root@jenkins java-demo]# git add .

#声明上传作者及邮箱
[root@jenkins java-demo]# git config --global user.email "1064981253@qq.com"
[root@jenkins java-demo]# git config --global user.name "pakho"

#提交代码到本地仓库,-m 一般为开发人员本次修改的BUG注释
[root@jenkins java-demo]# git commit -m "java"

#上传代码至远程Git仓库,并为本项目主分支
[root@jenkins java-demo]# git push origin master

#创建秘钥对
[root@jenkins ~]# ssh-keygen
[root@jenkins ~]# ssh-copy-id git@192.168.100.20

#执行拉取免密测试
[root@jenkins ~]# mkdir test
[root@jenkins ~]# cd test/
[root@jenkins test]# git clone git@192.168.100.20:/home/git/demo.git
Cloning into 'demo'...
remote: Counting objects: 183, done.
remote: Compressing objects: 100% (165/165), done.
remote: Total 183 (delta 7), reused 173 (delta 4)
Receiving objects: 100% (183/183), 1.12 MiB | 0 bytes/s, done.
Resolving deltas: 100% (7/7), done.
[root@jenkins ~]# docker --version
Docker version 20.10.7, build f0df350

#安装Java
[root@jenkins ~]# tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/
[root@jenkins ~]# cd /usr/local/

#将JDK改名为Java
[root@jenkins local]# mv jdk1.8.0_291/ jdk

#添加环境变量
[root@jenkins ~]# vim /etc/bashrc
JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin

#刷新配置文件
[root@jenkins ~]# source /etc/bashrc

#验证是否安装成功
[root@jenkins ~]# java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)

#安装Maven
[root@jenkins ~]# yum install -y maven

#官网下载Jenkins最新安装包
[root@jenkins ~]# wget https://get.jenkins.io/war-stable/2.289.2/jenkins.war

#前台运行Jenkins,如果希望后台运行可以安装Tomcat或其他操作
[root@jenkins ~]# java -jar jenkins.war
#运行中会产生默认Jenkins密码
31cce3f846b54efa8d9f150a468cbc92

#通过文件夹查看密码
[root@jenkins ~]# cat /root/.jenkins/secrets/initialAdminPassword
31cce3f846b54efa8d9f150a468cbc92

#Jenkins添加信任Harbor仓库
[root@jenkins ~]# vim /etc/docker/daemon.json
"insecure-registries":["192.168.100.30"]
[root@jenkins ~]# systemctl restart docker

#浏览器访问
http://192.168.100.40:8080







  • 登录进入以后,将默认Jenkins下载源替换为国内源
#Jenkins.war路径下有个隐藏文件
[root@jenkins ~]# ls -a
.jenkins
[root@jenkins ~]# cd .jenkins/updates/
[root@jenkins updates]# sed -i 's/http:\\/\\/updates.jenkinsci.org\\/download/https:\\/\\/mirrors.tuna.tsinghua.edu.cn\\/jenkins/g' default.json && sed -i 's/http:\\/\\/www.google.com/https:\\/\\/www.baidu.com/g' default.json



https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

#提交后浏览器输入重启Jenkins
http://192.168.100.40:8080/restart

  • 安装插件
    • PS:由于实验做了无数遍,可能清除环境不是很彻底,有些默认的插件没有清理干净
    • 需要下载安装GitPipeline插件,我这里以为安装了DockerJenkins上需要安装Docker版本的,可以忽略!

  • 创建凭据




#查看Jenkins主机私钥
[root@jenkins ~]# cat .ssh/id_rsa


  • 生成凭据

  • 新建项目



  • 添加流水线脚本


node  
   // 拉取代码
   stage('Git Checkout')  
       checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '70ddbc0b-8fb4-4a17-8d70-5bb3a720da7d', url: 'git@192.168.100.20:/home/git/demo.git']]])
   
   // 代码编译
   stage('Maven Build') 
        sh '''
        /usr/bin/mvn clean package -Dmaven.test.skip=true
        '''
   
   // 项目打包到镜像并推送到镜像仓库
   stage('Build and Push Image') 
        sh '''
        REPOSITORY=192.168.100.30/pakho/tomcat-java-demo:$Branch
        echo ' 
        FROM 192.168.100.30/pakho/tomcat:v1
        MAINTAINER pakho<1064981253@qq.com>
        RUN rm -rf /usr/local/tomcat/webapps/*
        ADD target/*.war /usr/local/tomcat/webapps/ROOT.war 
        ' > Dockerfile
        docker build -t  $REPOSITORY .
        docker login 192.168.100.30 -u admin -p Harbor12345
        docker push $REPOSITORY
        '''
   
   // 部署到Docker主机
   stage('Deploy to Docker') 
        sh '''
        REPOSITORY=192.168.100.30/pakho/tomcat-java-demo:$Branch
        docker rm -f java-demo |true
        docker image rm $REPOSITORY |true
        docker login 192.168.100.30 -u admin -p Harbor12345
        docker run -d --name java-demo -p 88:8080 $REPOSITORY
        '''
   


  • 部署测试
#同时Jenkins日志抓取到部署成功的日志信息
2021-07-09 15:06:37.699+0000 [id=199]	INFO	o.j.p.workflow.job.WorkflowRun#finish: JAVA #1 completed: SUCCESS


  • 模拟程序员修改代码后的再次构建
#基于刚才的测试路径
[root@jenkins demo]# pwd
/root/test/demo

#修改代码
[root@jenkins demo]# vim src/main/resources/templates/index.ftl
                  whatToType: "学生管理系统v2",

[root@jenkins demo]# git add .
[root@jenkins demo]# git config --global user.email "1064981253@qq.com"
[root@jenkins demo]# git config --global user.name "pakho"
[root@jenkins demo]# git commit -m "v2"
[master f0150ea] v2
 1 file changed, 1 insertion(+), 1 deletion(-)
[root@jenkins demo]# git push origin master
Counting objects: 13, done.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (7/7), 553 bytes | 0 bytes/s, done.
Total 7 (delta 3), reused 0 (delta 0)
To git@192.168.100.20:/home/git/demo.git
   f0150ea..6663acd  master -> master

  • 执行二次构建


  • 至此,实验完成!

  • 镜像仓库Harbor上也会有对应构建的镜像


关于实验的一些总结

  • 实验做了很久,失败了无数次,环境搭了无数次,关键在于脚本的编写
  • 网上有很多相似的实验,但是脚本拷贝过来修改了无数次,大都报错,对于脚本修改的地方,主要为Dockerfile文件
  • 之前采用cat <<EOF的形式,一直在部署Docker时报错,改为echo方式,成功执行!

docker——jenkins+git+registry构建自动化持续集成环境(ci/cd)(代码片段)

...员提交代码到Git或Svn版本仓库;Jenkins人工/定时触发项目构建;Jenkins拉取代码、代码编码、打包镜像、推送到镜像仓库;Jenkins在Docker主机创建容器并发布。  二、环境设计1、服务器部署信息服务器主机名IP运行服务jenkins... 查看详情

通过jenkins与docker构建ci/cd基础架构(代码片段)

###前言提到容器平台,最早接触的便是LXC(LinuxContainer),是2010年刚刚接触虚拟化平台的时候,当时开源解决方案是xen的天下(后来KVM才后来者居上),且性能各方面都不弱,价值当时还不是移动互联网时代,业务量远远没有那么... 查看详情

jenkins与docker的自动化ci/cd实战(代码片段)

...发人员提交代码到Git版本仓库;Jenkins人工/定时触发项目构建;Jenkins拉取代码、代码编码、打包镜像、推送到镜像仓库;Jenkins在Docker主机创建容器并发布。环境规划如下:角色IPGit/Registry192.168.56.11Docker192.168.56.12Jenkins/Docker192.168.... 查看详情

jenkins与docker的自动化ci/cd实战(代码片段)

...发人员提交代码到Git版本仓库;Jenkins人工/定时触发项目构建;Jenkins拉取代码、代码编码、打包镜像、推送到镜像仓库;Jenkins在D 查看详情

ci与cd之docker上安装jenkins(代码片段)

...天一次)来避免这种情况的出现,通过自动检测、拉取、构建和(在大多数情况下)进行单元测试的过程,来保障代码的质量可以进行下一步的使用,这也是持续集成的目的,CI是属于开发人员的自动化流程。 CD:持续交付(C... 查看详情

ci/cd的实践

...钥添加到jenkins源码管理本地文件添加DockerFile和nginx配置构建脚本然后构建生成一个新的镜像镜像库就是集中存放镜像的一个文件服务。镜像库在CI/CD中,又称制品库。构建后的产物称为制品,制品则要放到制品库做中转和版本管... 查看详情

docker与jenkins的自动化ci/cd流水线实战(svn)

...任务2、如果保留多个,会占用主机的磁盘空间3、参数化构建过程,就是让你构建时选择4、填写Pipeline若是不知道,可以让系统自动生成5、先Apply,再保存save验证:构建6、用户管理;权限分配请参见自己写的Evernote上的笔记 查看详情

jenkins与docker的自动化ci/cd流水线实战(代码片段)

...么是CI/CD持续集成(ContinuousIntegration,CI):代码合并、构建、部署、测试都在一起,不断地执行这个过程,并对结果反馈。持续部署(ContinuousDeployment,CD):部署到测试环境、预生产环境、生产环境。持续交付(ContinuousDelivery... 查看详情

docker与jenkins的自动化ci/cd流水线实战(代码片段)

docker与jenkins的自动化CI/CD流水线实战在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经形成一套标准的流程,最重要的组成部分就是持续集成(CI)及持续部署、交付(CD)。本文基于Jenkins+Docker+Git... 查看详情

ci/cd1jenkins,actions(代码片段)

文章目录1.jenkins:构建/测试/部署就是CICD工具即jenkins,但jenkins需要个人提供一台运行jenkins的机器2.GitLab与Jenkins集成:Jenkins镜像像nginx一样2.1Jenkins-docker配置:运行在8080端口上,机器只要安装docker就能装载image... 查看详情

ci与cd之docker上安装jenkins(代码片段)

一.CI,CD,Jenkins的介绍CI:持续集成(Continuousintegration,简称CI),在传统的软件开发环境中,有集成,但是没有持续集成这种说法,长时间的分支与主干脱离,导致分支与主干可能存在较大偏差,在集成代码的时候可能需要花费数... 查看详情

实践:基于azure部署jenkins服务并开发mern应用的ci/cd构建管道

...用程序​​——这是我们将在本文中使用的MERN项目。从构建应用程序到将其推送到Docker中心,我们必须完成许多步骤。首先,我们必须使用命令运行测试以确定所有测试是否通过。如果所有测试都通过,我们将构建Docker镜像,... 查看详情

ci/cd技术专题「jenkins实战系列」如何通过gitlab对接jenkins构建提交自动触发部署构建体系指南(上部)(代码片段)

前因后果最近,发现我们公司的自动化体系做的实在是不咋地,每次提交push完代码之后,还需要登录到服务器进行执行下docker脚本,之后才能拿到镜像,一说到这里我就要吐了,CI/CD做的简直是一团糟࿰... 查看详情

devops学习笔记-jenkins实现基础ci/cd操作

...gitlab,jenkins拉取gitlab的代码,由maven插件build,打包好后,构建docker镜像,上传到目标服务器中运行,可以通过tag选择版本代码。本地编写代码使用idea编写一个基础的springbootw 查看详情

springboot+git+jenkins+docker实现ci/cd

...解,不去实践,这次就以Springboot为底,利用Git,jenkins,Docker实现持续集成和持续部署!开发流程下面是常用的开发流程图:我们简单说说这张图:首先我们会将代码文件、测试文件以及Dockerfile都存在代码仓库里,版本控制利用... 查看详情

jenkins企业应用

...DevOps介绍持续集成(ContinuousIntegration,CI):代码合并,构建,部署,测试都在一起,不断地执行这个过程,并对结果反馈持续交付(ContinuousDelivery,CD):部署到生产环境,给用户使用持续部署(ContinuousDeployment,CD): 部署... 查看详情

ci/cd之jenkins(代码片段)

...更使用webhook实时检查gitlab代码变更推送dockerfile文件自动构建镜像新增agent节点jenkins用户管理CI/CD简介CI(Continuousintegration持续集 查看详情

ci/cd之jenkins(代码片段)

...更使用webhook实时检查gitlab代码变更推送dockerfile文件自动构建镜像新增agent节点jenkins用户管理CI/CD简介CI(Continuousintegration持续集 查看详情