【CI/CD】基于 Jenkins+Docker+Git 的简单 CI 流程实践(下)

news2024/11/25 0:40:21

基于 Jenkins+Docker+Git 的简单 CI 流程实践(下)

5.环境测试

5.1 远程 clone 代码测试

clone 云主机 docker-git 上的仓库 tomcat-java-demo.git

[root@docker-jenkins ~]# yum install git vim wget -y
[root@docker-jenkins ~]# git config --global user.email "hcc@c.com"
[root@docker-jenkins ~]# git config --global user.name "hcc"
[root@docker-jenkins ~]# git clone git@10.0.0.22:/home/git/tomcat-java-demo.git
Cloning into 'solo'...
The authenticity of host '10.0.0.22 (10.0.0.22)' can't be established.
ECDSA key fingerprint is SHA256:XNWQhGsAsqd84k/6OYV3xl1+mPGjtASsxeV1YVLZVas.
ECDSA key fingerprint is MD5:b4:bd:16:2b:de:e7:7c:fd:c5:dd:91:75:20:ff:3e:0a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.22' (ECDSA) to the list of known hosts.
git@10.0.0.22's password:
warning: You appear to have cloned an empty repository.
[root@docker-jenkins ~]# ls
tomcat-java-demo
[root@docker-jenkins ~]# ls tomcat-java-demo/
doc  Dockerfile  LICENSE  pom.xml  README.md  src
[root@docker-jenkins ~]# 

5.2 拉取 Github demo 代码

模拟生产项目,拉取 Github 上的一个 demo,并上传至本地 git 库:

[root@docker-jenkins ~]# mv tomcat-java-demo tomcat-java-demo.bak
[root@docker-jenkins ~]# git clone https://github.com/dingkai163/tomcat-java-demo.git
Cloning into 'tomcat-java-demo'...
remote: Enumerating objects: 185, done.
remote: Counting objects: 100% (185/185), done.
remote: Compressing objects: 100% (165/165), done.
remote: Total 185 (delta 5), reused 178 (delta 4), pack-reused 0
Receiving objects: 100% (185/185), 4.50 MiB | 870.00 KiB/s, done.
Resolving deltas: 100% (5/5), done.
[root@docker-jenkins ~]# cd tomcat-java-demo
[root@docker-jenkins tomcat-java-demo]# vim .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@10.0.0.22:/home/git/tomcat-java-demo.git  # 修改为本地的git库地址
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[root@docker-jenkins tomcat-java-demo]# git add .
[root@docker-jenkins tomcat-java-demo]# git status
# On branch master
nothing to commit, working directory clean
[root@docker-jenkins tomcat-java-demo]# git commit -m "all"
# On branch master
nothing to commit, working directory clean
[root@docker-jenkins tomcat-java-demo]# git push origin master
git@10.0.0.22's password:
Counting objects: 229, done.
Compressing objects: 100% (185/185), done.
Writing objects: 100% (229/229), 4.52 MiB | 0 bytes/s, done.
Total 229 (delta 25), reused 229 (delta 25)
To git@10.0.0.22:/home/git/tomcat-java-demo.git
 * [new branch]      master -> master
[root@docker-jenkins tomcat-java-demo]#

5.3 自建镜像仓库上传下载

用云主机 buildimage 上传及下载镜像。

(1)修改主机名为:buildimage

[root@c-dfjgjesgqe ~]# hostnamectl set-hostname buildimage
[root@c-dfjgjesgqe ~]# hostname  buildimage

Ctrl+D 退出后重新登陆生效。

(2)安装 DOCKER CE

安装所需包:

yum install -y yum-utils device-mapper-persistent-data lvm2 -y

设置稳定存储库:

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo -y

在这里插入图片描述
安装 DOCKER CE(这一步比较慢,耐心等会儿!):

yum install docker-ce docker-ce-cli containerd.io -y

在这里插入图片描述
启动 Docker

systemctl start docker

首先在云主机 buildimage 上做本地 hosts 解析:

[root@buildimage ~]# echo "10.0.0.21 reg.marin.com" >> /etc/hosts

其次编辑 /etc/docker/daemon.json 文件,保存退出:

[root@buildimage ~]# vim /etc/docker/daemon.json
{"insecure-registries":["reg.marin.com"] }

最后重启下 docker,让配置生效:

[root@buildimage ~]# systemctl restart docker

如果没有此步 docker login 将会报错:

[root@buildimage ~]# docker login reg.marin.com
Username (admin): admin
Password: 
Error response from daemon: Get https://reg.marin.com/v1/users/: x509: certificate signed by unknown authority

此时可以通过 docker login reg.marin.com 登录 harbor,输入用户名及密码:

[root@buildimage ~]# docker login reg.marin.com
Username (admin): admin
Password: 
Login Succeeded

在这里插入图片描述
buildimage 云主机上构建 Tomcat 基础镜像,并推送到 harbor 镜像库:

[root@buildimage ~]# mkdir tomcat
[root@buildimage ~]# cd tomcat
[root@buildimage tomcat]# vim Dockerfile-tomcat
FROM centos:7
MAINTAINER hanchaochao www.jdcloud.com
 
ENV VERSION=8.5.39
 
RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \
    yum clean all && \
    rm -rf /var/cache/yum/*
RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \
    tar zxf apache-tomcat-${VERSION}.tar.gz && \
    mv apache-tomcat-${VERSION} /usr/local/tomcat && \
    rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \
    mkdir /usr/local/tomcat/webapps/test && \
    echo "ok" > /usr/local/tomcat/webapps/test/status.html && \
    sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
 
ENV PATH $PATH:/usr/local/tomcat/bin
 
EXPOSE 8080
CMD ["catalina.sh", "run"]
[root@harbor tomcat]# docker build -t tomcat:v1 -f Dockerfile-tomcat .

在这里插入图片描述

[root@harbor tomcat]# docker tag tomcat:v1 reg.marin.com/test/tomcat:v1
[root@docker-git-harbor tomcat]# docker login reg.marin.com
[root@docker-git-harbor tomcat]# docker push reg.marin.com/test/tomcat:v1

在这里插入图片描述
打开 harbortest 仓库,查看镜像已经 push 成功。

在这里插入图片描述

6.CI 流程测试

6.1 Jenkins 安装必要插件

由于 Jenkins 是离线安装,所以在此需要配置一下插件下载地址:系统管理 → 插件管理 → Advanced(高级)。

在这里插入图片描述
在这里插入图片描述
修改下方地址,将 https 修改为 http 再点提交。

在这里插入图片描述
若出现问题无法获取插件,请尝试更换地址,如:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json

提交后点击可选插件,此时我们可以看到很多可获得插件。

在这里插入图片描述
首先搜索并安装 Pipeline 插件(如果搜索不到,在已安装中查看是否已经安装完毕)。

Pipeline 是一套运行于 Jenkins 上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。

在这里插入图片描述
再安装 SCM to job 插件,同上步骤(搜索,安装)。

在这里插入图片描述

6.2 Jenkins 项目创建

创建 Jobs。

在这里插入图片描述
选择【流水线】类型。

在这里插入图片描述
到这里我们就开始配置 Pipeline script,点击【流水线语法】,来自动生成我们需要的配置。

在这里插入图片描述
如下图,我们选择 Git 方式,配置 Git 仓库地址,再添加认证相关。

在示例步骤中下拉选择如图选项,在 Repository URL 中填写 docker-git 上的 git 仓库地址,因为没有添加 jenkinsdocker-git 容器的免密码登陆,所以截图中我们可以看到连接被拒绝的一大串红色提示,我们点击【添加】按钮。

在这里插入图片描述
这里我们使用的是秘钥认证方式,需要在容器 docker-jenkins 上生成密钥,然后将 jenkins 上生成的公钥发送到(docker-gitgit 服务器上,然后将 jenkins 上的生成的私钥内容粘贴到下图 Key 中,这样 jenkins 就可以免交互的拉取 git 仓库中的代码了。

[root@docker-jenkins ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:RQZ78bcVhLRQi8fWFPYmyvcnOqlxy980QwLsYFT/iz8 root@docker-jenkins
The key's randomart image is:
+---[RSA 2048]----+
|        .o=oooo*.|
|        .+.o=.* o|
|        .oo+.Bo.+|
|        .oo.+o.= |
|        S  .o.oo |
|             .+..|
|          . .o.++|
|           +oo.E+|
|          ..+o..o|
+----[SHA256]-----+
[root@docker-jenkins ~]# cd
[root@docker-jenkins ~]# ls .ssh/
id_rsa  id_rsa.pub  known_hosts
[root@docker-jenkins ~]# ssh-copy-id git@10.0.0.22
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
git@10.0.0.22's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'git@10.0.0.22'"
and check to make sure that only the key(s) you wanted were added.

[root@docker-jenkins ~]# cat .ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAvrI8lBov+W8v+zSGdu2EP4BPP7Ml+T5KUwc2MKX1RNMMNQxc
tPUf7PjhbJJvuTpPPbS1+9PAlrPhikDrug3K4+sF/Fiy+/YgoVMlEFrXiSJK1xHi
ErDLA39WGq+E4ssth3JfrQHV+AINGAh1/NR+Uk+YmPDAuQgA1l7jSH1PN6qTdrYt
95HbklAA+Q3omAJJ4Uc80lk7ZdMcdCc0OAtHjCfbRv287qrH4U2OKSlOLljiBHBN
......
-----END RSA PRIVATE KEY-----
[root@docker-jenkins ~]# 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置完成后,我们就可以生成 Pipeline 脚本了。点击下方【生成流水线脚本】,然后复制方框内的内容。

在这里插入图片描述
将生成的流水线脚本复制出来,我生成的流水线脚本如下:

checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '9baf7156-9ac6-435d-b0db-86cae51c8fe6', url: 'git@10.0.0.22:/home/git/tomcat-java-demo.git']]])

将生成的流水线脚本记录完成后,我们点击左上角【返回】。

在这里插入图片描述

继续点击【配置】,完成流水线项目 tomcat-java-demo 的配置。

在这里插入图片描述
点击【流水线】,我们所需要的 Pipeline 脚本如下,将其粘贴到 script 的拉取代码模块中,并修改分支 */master${branch},其他模块内容自行编写,具体需要修改的地方和脚本如下:

在这里插入图片描述

node { 
   // 拉取代码
   stage('Git Checkout') { 
       checkout([$class: 'GitSCM', branches: [[name: '${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '9baf7156-9ac6-435d-b0db-86cae51c8fe6', url: 'git@10.0.0.22:/home/git/tomcat-java-demo.git']]])
   }
   // 代码编译
   stage('Maven Build') {
        sh '''
        export JAVA_HOME=/usr/local/jdk
        /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true
        '''
   }
   // 项目打包到镜像并推送到镜像仓库
   stage('Build and Push Image') {
sh '''
REPOSITORY=reg.marin.com/test/tomcat-java-demo:${branch}
cat > Dockerfile << EOF
FROM reg.marin.com/test/tomcat:v1 
MAINTAINER marin
RUN rm -rf /usr/local/tomcat/webapps/*
ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
EOF
docker build -t $REPOSITORY .
docker login reg.marin.com -u admin -p 123456
docker push $REPOSITORY
'''
   }
   // 部署到Docker主机
   stage('Deploy to Docker') {
        sh '''
        REPOSITORY=reg.marin.com/test/tomcat-java-demo:${branch}
        docker rm -f tomcat-java-demo |true
        docker pull $REPOSITORY
        docker container run -d --name tomcat-java-demo -p 88:8080 $REPOSITORY
        '''
   }
}

在这里插入图片描述
Pipeline 脚本里面我们指定了一个 branch 参数,所以我们需要传递一个参数变量,这里我们选择参数化构建,默认值为 master 分支。

在这里插入图片描述
在这里插入图片描述
然后保存配置。

6.3 Jenkins 构建任务

构建前我们还需要做两个操作:

(1)添加 reg.marin.comhosts 解析。

[root@docker-jenkins ~]# echo "10.0.0.21 reg.marin.com" >> /etc/hosts

(2)编辑 /etc/docker/daemon.json 文件,输入如下信息,保存退出。

[root@docker-jenkins ~]# vim /etc/docker/daemon.json
{"insecure-registries":["reg.marin.com"] }

最后重启下 docker,让配置生效。

[root@docker-jenkins ~]# systemctl restart docker

返回到工作台,我们开始构建任务。

在这里插入图片描述
在这里插入图片描述
构建开始。

在这里插入图片描述
构建完成。

在这里插入图片描述
可以通过【Console Output】输出查看 Jenkins 构建流程。

在这里插入图片描述
在这里插入图片描述
成功构建会提示:SUCCESS

在这里插入图片描述
通过浏览器来访问 tomcat-java-demo 项目:http://Jenkins主机公网IP:88/

在这里插入图片描述
可以看到正常访问,至此在京东云上基于 Jenkins+Docker+Git 的简单 CI 流程实践已经成功部署了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/874629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】-- 栈和队列

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;数据结构 &#x1f4a8;吾生也有涯&#xff0c;而知也无涯 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 文章目录 前言一、栈&#x1f4d9;1.1 栈…

windows程序基础

一、windows程序基础 1. Windows程序的特点 1.用户界面统一、友好 2.支持多任务:允许用户同时运行多个应用程序(窗口) 3.独立于设备的图形操作 使用图形设备接口( GDI, Graphics Device Interface )屏蔽了不同硬件设备的差异&#xff0c;提供了设备无关的图形输出能力…

“新基建”重新定义大数据安全

摘要&#xff1a;数字信息经济发展时代,大数据已逐渐成为最新和最重要的生产要素。国家大力支持推进“新基建”发展战略,由此带来的大数据安全挑战俨然愈发严峻。“新基建”重新定义了大数据安全&#xff0c;面对层出不穷的网络安全事件,需要构建主动安全防御体系。 关键词:新…

前端开发环境搭建,换新电脑前端开发的步骤,node环境配置

一、下载安装nodeJS 1、下载地址官方网址 NodeJs 2、下载完成后&#xff0c;双击“node-v11.5.0-x64.msi”&#xff0c;开始安装Node.js&#xff0c;一路next&#xff0c;注意&#xff1a;安装目录看自己需求&#xff0c;本人安装在D:\nodejs目录下 3、测试 键盘按下【winR…

Kotlin读写分离CopyOnWriteArrayList

Kotlin读写分离CopyOnWriteArrayList 基于读写分离思想Copy-On-Write(COW)设计的线程安全ArrayList变体&#xff0c;读读共享、写写互斥、读写互斥、写读互斥。读时直接读&#xff0c;不用加锁同步&#xff0c;线程安全。写/删/修改数据时复制一个副本&#xff0c;在新的List副…

挣钱和赚钱是两个概念

挣钱和赚钱虽然听起来很相似&#xff0c;但实际上是两个完全不同的概念。 挣钱通常指的是通过劳动或者服务换取报酬&#xff0c;比如说工资、兼职、打零工等等。而赚钱则是指通过投资、创业等方式获得利润或者收益。 挣钱是一种被动的收入方式&#xff0c;需要付出时间和劳动才…

政策因子条件列表类型

type:1&#xff08;多选下拉输入&#xff09; 目前选项是本地写死得&#xff0c;传参拼接了carOwner这些东西&#xff0c;形式是多选输入 type:2 &#xff08;普通指定形式&#xff09; type:3&#xff08;普通区间形式&#xff09; type:4 (指定输入) 指定除外得特殊一种&…

Chrome浏览器安装Axure插件无法打开本地axure文件

Chrome浏览器安装Axure插件无法打开本地axure文件 Chrome浏览器按照axure插件即可打开 1&#xff0c;下载axure插件&#xff0c;由于Chrome国内连不了商店&#xff0c;只能另外下载 https://download.csdn.net/download/u013303534/88204888 2&#xff0c;Chrome安装插件&#…

c++11 标准模板(STL)(std::basic_stringbuf)(二)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allocator<CharT> > class basic_stringbuf : public std::basic_streambuf<CharT, Traits> std::basic_stringbuf…

从零开始学习 Java:简单易懂的入门指南之抽象类接口内部类(十一)

面向对象进阶&#xff08;抽象类&接口&内部类&#xff09; 第一章 抽象类1.1 概述1.1.1 抽象类引入 1.2 abstract使用格式1.2.1 抽象方法1.2.2 抽象类1.2.3 抽象类的使用 1.3 抽象类的特征1.4 抽象类的细节1.5 抽象类存在的意义 第二章 接口2.1 概述2.2 定义格式2.3 接…

排序算法——基数排序(C语言)

基数排序的概念&#xff1a; 什么是基数排序&#xff1f;&#xff1f;&#xff1f;基数排序是一种和快排、归并、希尔等等不一样的排序...它不需要比较和移动就可以完成整型的排序。它是时间复杂度是O&#xff08;K*N&#xff09;&#xff0c;空间复杂度是O&#xff08;KM&…

【C语言】memcpy()函数

目录 一.memcpy()函数简介 1.函数功能 2.函数参数 1>.void * destination 2>.const void * source 3>.size_t num 3.函数返回值 4.函数头文件 二.memcpy()函数的具体使用 1.使用memcpy()函数完成拷贝整型数组数据 2.使用memcpy()函数拷贝结构体数据 三.模…

善于用兵的人,军队粮草取自敌人

善于用兵的人&#xff0c;军队粮草取自敌人 【安志强趣讲《孙子兵法》第8讲】 【原文】 善用兵者&#xff0c;役不再籍&#xff0c;粮不三载&#xff1b;取用于国&#xff0c;因粮于敌&#xff0c;故军食可足也。 【注释】 役不再籍&#xff1a;役&#xff0c;兵役&#xff1b;…

横向移动-域控提权

横向移动-域控提权 CVE-2021-42287 由于Active Directory没有对域中计算机和服务器账号进行验证&#xff0c;经过身份验证的攻击者利用该漏洞绕过完全限制&#xff0c;可将域中普通用户权限提升为域管理员权限并执行任意代码。 利用条件 前提条件&#xff1a;一个域内普通账…

js jquery写一个画板 实现撤回、清空、换色的功能

画布的canvas画板的大小就是这个画板图片的大小 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><metaname"viewport&qu…

鸿蒙剥离 AOSP 不兼容 Android 热门问题汇总,不吹不黑不吵

上周发了一篇 《鸿蒙终于不套壳了&#xff1f;纯血 HarmonyOS NEXT 即将到来》的相关资讯&#xff0c;没想到大家「讨&#xff08;fa&#xff09;论&#xff08;xie&#xff09;」的热情很高&#xff0c;莫名蹭了一波流量&#xff0c;虽然流量对我来说也没什么用&#xff0c;但…

HOT82-杨辉三角

leetcode原题链接&#xff1a;杨辉三角 题目描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例…

python什么版本比较稳定,python哪个版本用得最多

这篇文章主要介绍了哪个版本的python最好用&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 想学习Python的人都会有一个困惑&#xff0c;那就是Python目前有两个版本Python2和…

windows下dll文件的创建详细教程

1、前言 dll文件是啥&#xff0c;就不作过多赘述了。现在直接教大家如何创建与使用dll文件。 本文基于windows系统&#xff0c;使用的编译相关工具为visual studio 2019。 2、创建dll 2.1 创建dll工程 首先打开visual studio&#xff0c;然后选择创建新项目&#xff0c;在搜…

11、Nvidia显卡驱动、CUDA、cuDNN、Anaconda及Tensorflow Pytorch版本

Nvidia显卡驱动、CUDA、cuDNN、Anaconda及Tensorflow-GPU版本 一、确定版本关系二、安装过程1.安装显卡驱动2、安装CUDA3、安装cudnn4、安装TensorFlow5、安装pytorch 三、卸载 一、确定版本关系 TensorFlow Pytorch推出cuda和cudnn的版本&#xff0c;cuda版本推出驱动可选版本…