Linux-Jenkins

Jenkins

一、概述

Jenkins 是一个开源持续集成的工具,是由 JAVA 开发而成。

Jenkins 是一个调度平台,本身不处理任何事情,调用插件来完成所有的工作。

二、Jenkins快速上手

系统要求/软件要求 主机名 ip 配置
系统 jenkins 10.0.0.72/172.16.1.72 2c4G
java 要求jdk11

1.部署JDK

[root@jenkins ~]# cat /etc/yum.repos.d/jenkins.repo
[jenkins]
name=Jenkins-stable
baseurl=http:pkg.jenkins.io/redhat-stable
gpgcheck=0

2.部署Jenkins(最新版)

[root@jenkins ~]# cat /etc/yum.repos.d/jenkins.repo
[jenkins]
name=Jenkins-stable
baseurl=http:pkg.jenkins.io/redhat-stable
gpgcheck=0

[root@jenkins ~]# ll
total 91124
-rw-------. 1 root root     1340 Jan  9 09:09 anaconda-ks.cfg
-rw-r--r--  1 root root 93304199 Mar 24 08:27 jenkins-2.361.4-1.1.noarch.rpm
[root@jenkins ~]# yum -y localinstall jenkins-2.361.4-1.1.noarch.rpm 
[root@jenkins ~]# systemctl enable jenkins
[root@jenkins ~]# systemctl start jenkins
[root@jenkins ~]# ps -ef |grep jenkins
jenkins    2500      1 22 21:04 ?        00:00:45 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=%C/jenkins/war --httpPort=8080

第一次登陆的时候很慢,一直是下图页面

在Jenkins安装目录下,找到hudson.model.UpdateCenter.xml
把http://updates.jenkins-ci.org/update-center.json,
修改成http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json,并保存
重新启动Jenkins服务

[root@aliyun jenkins]# cat hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
 <id>default</id>
 <url>http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
</site>
</sites>

image-20230328214947801

3.解锁Jenkins

解锁 Jenkins,当您第一次访问新的Jenkins实例时,系统会要求您使用自动生成的密码对其进行解锁。

http://jk.cn:8080/

登录的用户名是admin

image-20230327210757837

[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword

image-20230327210948486

image-20230327211001081

三、安装插件

Jenkins插件安装方式
web页面,选择与安装(联网) 一个一个找选择,安装重启jenkins
自己下载插件,jenkins替你安装(hpi) web页面一个一个安装,未来批量安装需要脚本
导入插件(手动,批量) 去一个机器上面把已经下载安装的插件打包,新机器解压,修改所有者

注:jenkins不同版本的插件不通用

1.使用插件包安装

[root@jenkins ~]# ll
total 196840
-rw-------. 1 root root      1340 Jan  9 09:09 anaconda-ks.cfg
-rw-r--r--  1 root root  93304199 Mar 24 08:27 jenkins-2.361.4-1.1.noarch.rpm
-rw-r--r--  1 root root 108250480 Mar 27 09:38 jenkins-2.361-plugins.tar.gz  #插件的包
[root@jenkins ~]# tar xf jenkins-2.361-plugins.tar.gz -C /var/lib/jenkins/plugins/
[root@jenkins ~]# systemctl restart jenkins

安装完之后,会进行汉化

image-20230327212126788

2.手动添加插件

image-20230327212655451

image-20230327212744016

安装完之后一般要重启jenkins

四、创建一个项目-初体验Jenkins-Shell集成

1.对jk配置

为了方便JK进行操作与管理各种节点,避免出现权限问题。

这里把把jenkins运行用户改为root。

当然也可以给Jenkins配置sudo权限,这里我们选择修改为root。

之前的旧版本/etc/sysconfig/jenkins #文件即可.
现在版本:
/usr/lib/systemd/system/jenkins.service

[root@jenkins ~]# egrep -i '^User|^Group' /usr/lib/systemd/system/jenkins.service 
User=root
Group=root
[root@jenkins ~]# systemctl daemon-reload 
[root@jenkins ~]# systemctl restart jenkins

2. 创建并运行jenkins项目,执行 Shell命令

通过运行jenkins 任务
提示我们进行:
选择
dev  #开发环境
prod #生产环境
把选择结果放在变量中choose

3.项目详细步骤

3.1.创建对应的的目录

dev目录和prod目录,表示测试环境和生产环境。

创建文件夹

image-20230327213252835

image-20230327213324466

image-20230327213349143

image-20230327213426174

3.2 创建freestyle项目

进入到dev目录创建1个项目

image-20230327213505442

image-20230327213538534

自由风格: 一般用于部署静态,各种都可以。

maven项目:java代码。

流水线(pipeline):把第1个或第2个任务通过指令(代码)方式实现。

3.3配置项目基础信息

image-20230327213722021

3.4 配置构建保存(丢弃旧的构建)

image-20230327213758223

3.5 配置参数化构建

image-20230327213844326

3.6配置构建与shell

image-20230327213931583

case   "$choose"  in  
     dev)  echo "部署到测试环境"  ;;
     prod) echo "部署到生产环境"  ;;
esac

echo "当前用户:`whoami`"
echo "当前目录:`pwd`"

image-20230327214320574

4. 运行任务

image-20230327214118633

image-20230327214134018

image-20230327214337324

image-20230327214353025

温馨提示:项目运行的时候
工作目录在/var/lib/jenkins/workspace/项目名字目录下
运行项目的默认用户是jenkins,这里因为修改为root,所以是root了

[root@jenkins ~]# cd /var/lib/jenkins/workspace
[root@jenkins /var/lib/jenkins/workspace]# ll
total 0
drwxr-xr-x 3 root root 40 Mar 27 21:41 dev
[root@jenkins /var/lib/jenkins/workspace]# cd dev
[root@jenkins /var/lib/jenkins/workspace/dev]# ll
total 0
drwxr-xr-x 2 root root 6 Mar 27 21:41 choose-shell-freestyle-job

五、Jenkins实现Gitlab集成

1.准备windows环境

准备代码目录(代码目录绝对路径中不要包含中文字符)

image-20230327214623498

2.创建密钥并配置gitlab/gitee

 ssh-keygen.exe
 
pc MINGW64 /e/code
$  ssh-keygen.exe

pc MINGW64 /e/code
$ cat /c/Users/test/.ssh/id_rsa.pub

image-20230327214745037

image-20230327214953978

3.创建gitlab/gitee项目

image-20230327215121512

4.初始化并上传代码

pc MINGW64 /e/code
$ git config --global user.name "Administrator"

pc MINGW64 /e/code
$ git config --global user.email "admin@example.com"

pc MINGW64 /e/code
$ git init
Initialized empty Git repository in E:/code/.git/

pc MINGW64 /e/code (master)
$ git remote add origin git@gitlab.cn:root/test.git

pc MINGW64 /e/code (master)
$ git add .

pc MINGW64 /e/code (master)
$ git commit -m "v1.0"

pc MINGW64 /e/code (master)
$ git push -u origin --all


#打标签并上传
pc MINGW64 /e/code (master)
$ git tag -a v1.0 -m "v1.0"

pc MINGW64 /e/code (master)
$ git push -u origin --tags

image-20230327215458226

5. 配置jenkins

5.1 进行hosts解析

[root@jenkins ~]# cat /etc/hosts
172.16.1.71 gitlab.cn
172.16.1.72 jk.cn

5.2 添加任务

image-20230327215828025

image-20230327215918146

配置git仓库地址

image-20230327220000029

配置访问凭证。

image-20230327220034085

配置私钥的凭证

image-20230327220019160

pc MINGW64 /e/code (master)
$ cat /c/Users/test/.ssh/id_rsa

image-20230327220223365

补充:

添加完私钥还提示错误

#进入jenkins服务器进行添加yes/no提示,执行ssh命令也行
[root@jenkins ~]# git ls-remote -h git@gitlab.cn:root/test.git HEAD
The authenticity of host 'gitlab.cn (172.16.1.71)' can't be established.
ECDSA key fingerprint is SHA256:fVjvhVF2qU+PCOqsrVTrbxa/aNB4dzNmGRJTw1iIZ1s.
ECDSA key fingerprint is MD5:0f:00:32:1c:41:31:af:a2:f5:e8:64:40:2c:cf:98:98.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitlab.cn,172.16.1.71' (ECDSA) to the list of known hosts.
git@gitlab.cn's password:

image-20230327220445332

image-20230327220456104

5.3 执行任务

image-20230327220538562

image-20230327220622905

[root@jenkins ~]# cd /var/lib/jenkins/workspace/dev/test-job
[root@jenkins /var/lib/jenkins/workspace/dev/test-job]# ll
total 24
-rw-r--r-- 1 root root 2265 Mar 27 22:05 about.md
-rw-r--r-- 1 root root   12 Mar 27 22:05 CNAME
drwxr-xr-x 2 root root   41 Mar 27 22:05 css
drwxr-xr-x 2 root root 4096 Mar 27 22:05 images
-rw-r--r-- 1 root root 6509 Mar 27 22:05 index.html
drwxr-xr-x 2 root root   86 Mar 27 22:05 js
-rw-r--r-- 1 root root 1067 Mar 27 22:05 LICENSE

6. 配置脚本

image-20230327220904135

image-20230327220929947

[root@jenkins /tmp]# ll
total 5316
-rw-r--r-- 1 root    root    2054403 Mar 27 22:08 test.tar.gz

六、Jenkins基于tag标签的 代码拉取与部署

之前拉取的代码总是最新的.

目前我们需要部署指定的tag标签(版本)的代码.

最后代码打包并分发web服务器.

1.准备代码

修改index.html,修改标题

#提交2.0
pc MINGW64 /e/code (master)
$ grep title index.html
                <title>打篮球 v2.0</title>
pc MINGW64 /e/code (master)
$ git add .
warning: LF will be replaced by CRLF in index.html.
The file will have its original line endings in your working directory

pc MINGW64 /e/code (master)
$ git commit -m "v2.0"
[master 9e74674] v2.0
 1 file changed, 1 insertion(+), 1 deletion(-)

pc MINGW64 /e/code (master)
$ git tag -a v2.0 -m "v2.0"

pc MINGW64 /e/code (master)
$ git push -u origin --all
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 299 bytes | 299.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To gitlab.cn:root/test.git
   1d9b6f6..9e74674  master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

pc MINGW64 /e/code (master)
$ git push -u origin --tags

#提交3.0
依照2.0创造

image-20230327221709916

2.安装jenkins获取git tag标签的插件

image-20230327221801371

[root@jenkins ~]# systemctl restart jenkins

3.创建Jenkins任务

image-20230327221951617

image-20230327222052902

image-20230327222138563

image-20230327222320343

image-20230327222343371

image-20230327222500042

image-20230327222524813

image-20230327222545847

[root@jenkins ~]# ll /tmp/
-rw-r--r-- 1 root    root    2060746 Mar 27 22:25 test-v2.0.tar.gz

4.部署到web节点

[root@web01 /etc/nginx/conf.d]# cat ball.conf 
server {
 listen 80;
 server_name ball.cn;
 access_log /var/log/nginx/ball.access.log main;
 error_log   /var/log/nginx/ball.error.log notice;
 root /app/code/ball;
 location / {
   index index.html;
 }
}

#配置密钥
[root@jenkins ~]#  ssh-keygen
[root@jenkins ~]#  ssh-copy-id root@172.16.1.7

image-20230327223033478

echo "您当前部署的版本是${tag}"

tar zcf /tmp/test-${tag}.tar.gz .

scp /tmp/test-${tag}.tar.gz   root@172.16.1.7:/tmp/

ssh root@172.16.1.7  "mkdir -p /app/code/ball/"

ssh root@172.16.1.7  "tar xf /tmp/test-${tag}.tar.gz -C /app/code/ball/"

image-20230327223009293

七、搭建 开发测试专用的任务

开发人员书写代码,上传到代码仓库.

只要仓库收到开发上传的代码,触发测试任务.

jenkins去拉取代码仓库最新的代码并部署到测试环境中.

一般用于测试环境自动化部署代码.

1.安装插件

image-20230328193306900

image-20230328193417099

2.创建任务

image-20230328193720393

image-20230328193827744

image-20230328194205555

image-20230328194245543

image-20230328194302807

image-20230328194540708

3.gitlab配置钩子

3.1 解除钩子局域网访问限制

image-20230328194651242

image-20230328194711635

3.2 gitlab配置钩子

image-20230328194750381

image-20230328194834375

image-20230328195007706

image-20230328195047897

3.3 测试钩子

注意:一定要进行hosts解析

image-20230328195128438

image-20230328195406962

image-20230328195504007

查看jenkins的项目,出现了自动构建的步骤

image-20230328195525607

4.修改代码测试钩子

修改代码push之后,gitlab调用jenkins,jenkins自动拉取代码

image-20230328200005260

image-20230328195916061

八、java项目代码上线项目

java程序的源代码存放在了代码仓库中.

通过jk拉取java源代码,通过工具(maven,gradle)对代码进行编译,最终生成war或jar包.

通过jk,分发部署,重启服务.

1.项目环境

环境 角色 ip
gitlab 代码仓库 10.0.0.71/172.16.1.71
jenkins jk 10.0.0.72/172.16.1.72
web03 tomcat+jdk 10.0.0.9/172.16.1.9
lb01 负载均衡 10.0.0.5/172.16.1.5

2.手动实现

手动上传代码到gitlab

手动在jenkins机器上拉取代码.

手动通过maven(mvn)编译代码生产war/jar包.

war包改名ROOT.war

部署:

  1. war包发送到web节点.
  2. war包部署webapps/目录下.
  3. 重启tomcat.

2.1 代码上传到gitlab

新建仓库

image-20230328200715197

pc MINGW64 /e/code/hello-world (master)
$ ll
total 5
drwxr-xr-x 1 test 197609   0 3月  28 20:06 dist/
-rw-r--r-- 1 test 197609 930 5月  23  2014 pom.xml
-rw-r--r-- 1 test 197609 213 5月  23  2014 README.md
drwxr-xr-x 1 test 197609   0 3月  28 20:06 src/

pc MINGW64 /e/code/hello-world (master)
$ git init
Initialized empty Git repository in E:/code/hello-world/.git/

pc MINGW64 /e/code/hello-world (master)
$ git remote -v

pc MINGW64 /e/code/hello-world (master)
$ git remote add origin git@gitlab.cn:root/hello-world.git

pc MINGW64 /e/code/hello-world (master)
$ git add .
warning: LF will be replaced by CRLF in .gitignore.
The file will have its original line endings in your working directory
warning: LF will be replaced by CRLF in README.md.
The file will have its original line endings in your working directory
warning: LF will be replaced by CRLF in pom.xml.
The file will have its original line endings in your working directory
warning: LF will be replaced by CRLF in src/main/webapp/WEB-INF/web.xml.
The file will have its original line endings in your working directory
warning: LF will be replaced by CRLF in src/main/webapp/index.jsp.
The file will have its original line endings in your working directory

pc MINGW64 /e/code/hello-world (master)
$ git commit -m 'v1.0'
[master (root-commit) e9aa2df] v1.0
 6 files changed, 57 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 README.md
 create mode 100644 dist/hello-world.war
 create mode 100644 pom.xml
 create mode 100644 src/main/webapp/WEB-INF/web.xml
 create mode 100644 src/main/webapp/index.jsp

pc MINGW64 /e/code/hello-world (master)
$ git tag -a v1.0 -m v1.0

pc MINGW64 /e/code/hello-world (master)
$ git push -u origin --all
Enumerating objects: 13, done.
Counting objects: 100% (13/13), done.
Delta compression using up to 12 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (13/13), 3.01 KiB | 1.50 MiB/s, done.
Total 13 (delta 0), reused 0 (delta 0)
To gitlab.cn:root/hello-world.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

pc MINGW64 /e/code/hello-world (master)
$ git push -u origin --tags
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 154 bytes | 154.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To gitlab.cn:root/hello-world.git
 * [new tag]         v1.0 -> v1.0

image-20230328203435965

2.2配置maven

对java源代码进行编译.读取当前目录下面的pom.xml文件.

pom.xml是java代码配置文件,里面记录代码依赖.代码war或jar名字.

#1. 安装jdk
#2. 安装 maven 
[root@jenkins ~]# ll
total 206124
-rw-------. 1 root root      1340 Jan  9 09:09 anaconda-ks.cfg
-rw-r--r--  1 root root   9506321 Mar 28 14:54 apache-maven-3.6.3-bin.tar.gz
-rw-r--r--  1 root root  93304199 Mar 24 08:27 jenkins-2.361.4-1.1.noarch.rpm
-rw-r--r--  1 root root 108250480 Mar 27 09:38 jenkins-2.361-plugins.tar.gz
[root@jenkins ~]# mkdir -p /app/tools
[root@jenkins ~]# tar xf apache-maven-3.6.3-bin.tar.gz -C /app/tools/
[root@jenkins ~]# ln -s /app/tools/apache-maven-3.6.3/ /app/tools/maven
#添加环境变量
[root@jenkins ~]# echo 'export PATH=/app/tools/maven/bin/:$PATH' >>/etc/profile
[root@jenkins ~]# source  /etc/profile
#查看maven版本
[root@jenkins ~]# mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /app/tools/maven
Java version: 11.0.18, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"

#3.配置maven下载源
[root@jenkins ~]# vim /app/tools/maven/conf/settings.xml 
146   <mirrors>
147         <mirror>
148                 <id>aliyunmaven</id>
149                 <mirrorOf>*</mirrorOf>
150                 <name>阿里云公共仓库</name>
151                 <url>https://maven.aliyun.com/repository/public</url>
152         </mirror>
153   </mirrors>

2.3jenkins拉取代码与手动编译代码

image-20230328204122068

image-20230328204152907

image-20230328204225881

[root@jenkins ~]# cd /var/lib/jenkins/workspace/hello_word_job
[root@jenkins /var/lib/jenkins/workspace/hello_word_job]# ll
total 8
drwxr-xr-x 2 root root  29 Mar 28 20:42 dist
-rw-r--r-- 1 root root 930 Mar 28 20:42 pom.xml
-rw-r--r-- 1 root root 213 Mar 28 20:42 README.md
drwxr-xr-x 3 root root  18 Mar 28 20:42 src
[root@jenkins /var/lib/jenkins/workspace/hello_word_job]# mvn clean package
[INFO] WEB-INF/web.xml already added, skipping
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  59.419 s
[INFO] Finished at: 2023-03-28T20:52:36+08:00
[INFO] ------------------------------------------------------------------------
[root@jenkins /var/lib/jenkins/workspace/hello_word_job]# ll
total 8
drwxr-xr-x 2 root root  29 Mar 28 20:42 dist
-rw-r--r-- 1 root root 930 Mar 28 20:42 pom.xml
-rw-r--r-- 1 root root 213 Mar 28 20:42 README.md
drwxr-xr-x 3 root root  18 Mar 28 20:42 src
drwxr-xr-x 4 root root  90 Mar 28 20:52 target
[root@jenkins /var/lib/jenkins/workspace/hello_word_job]# cd target/
[root@jenkins /var/lib/jenkins/workspace/hello_word_job/target]# ll
total 4
drwxr-xr-x 4 root root   54 Mar 28 20:52 hello-world-war-1.0.0
-rw-r--r-- 1 root root 2407 Mar 28 20:52 hello-world-war-1.0.0.war
drwxr-xr-x 2 root root   28 Mar 28 20:52 maven-archiver

# mvn clean package
clean清除已经生成的war/jar.
package创建war或jar包,打包.

2.4war包的部署

准备好tomcat环境

传输war包到web节点上/opt/

进入/opt/改war包名字 ROOT.war

清理已有的目录和文件rm -fr /app/tools/tomcat/webapps/ROOT*

/opt/ROOT.war移动到/app/tools/tomcat/webapps/

重启tomcat.

注意事项:传输的时候要传递公钥ssh-copy-id root@172.16.1.9

3.自动实现

前提是准备好tomcat在web03上
一个干净的tomcat
安装在/app/tools/tomcat
[root@web03 /app/tools]# ll
total 0
drwxr-xr-x 9 root root 220 Mar 28 16:22 apache-tomcat-9.0.52
lrwxrwxrwx 1 root root  23 Feb 21 11:04 jdk -> /app/tools/jdk1.8.0_351
drwxr-xr-x 8 root root 273 Feb 21 11:04 jdk1.8.0_351
lrwxrwxrwx 1 root root  32 Mar 28 16:21 tomcat -> /app/tools/apache-tomcat-9.0.52/

3.1创建项目

image-20230328205532566

3.2连接git

image-20230328205620650

3.3配置maven

image-20230328205702482

image-20230328205724042

image-20230328205845158

image-20230328205858567

image-20230328205952445

3.4 配置编译成功后执行的命令

image-20230328210119947

echo "您当前部署的代码版本为: ${TAG_NAME}"
echo "您任务的URL地址:${JOB_DISPLAY_URL}"
#0.vars
date=$(date +%F)
#web_list后面可以设置为参数化构建,文本参数
web_list="172.16.1.9"
#路径 $WORKSPACE
src_dir=./target/
dst_dir=/opt/
#web节点的变量
code_dir=/app/tools/tomcat/webapps/ROOT
code_file=/app/tools/tomcat/webapps/ROOT.war
#1. 分发
fenfa() {
for ip in ${web_list}
	do
	 scp  ${src_dir}/hello-world-war-1.0.0.war  root@${ip}:${dst_dir}
	done
}
#2. 部署
#进入/opt/改war包名字 ROOT-时间.war
#清理已有的目录和文件
#给 /opt/ROOT-时间.war 创建软连接到/app/tools/tomcat/webapps/ROOT.war
#重启tomcat
deploy() {
for ip in ${web_list}
do
      ssh root@${ip} "cd ${dst_dir} ;
      mv hello-world-war-1.0.0.war ROOT-${date}.war;
     [ -d ${code_dir} ] && {
      mkdir -p /tmp/${date};
      mv ${code_dir} ${code_file} /tmp/${date} ;
     };
      ln -s ${dst_dir}/ROOT-${date}.war ${code_file} ;
      systemctl restart tomcat
     "
done
}
#主函数
main() {
   fenfa
 deploy
}
main

3.5测试

http://10.0.0.9:8080/

image-20230328210459829

九、基于docker的案例实现 静态代码

1.步骤

  1. 书写代码,上传到gitlab

  2. 书写测试dockerfile(只需要代码+docker环境即可)

  3. jenkins创建任务

    🅰 拉取代码

    🅱 执行构建shell命令

    ​ jk:docker build

    ​ jk:docker push

    ​ web:docker run + 私有仓库镜像

2.环境

角色 主机 ip
gitlab/gitee gitlab 10.0.0.71/172.16.1.71
jenkins jenkins 10.0.0.72/172.16.1.72
web服务器 web05 10.0.0.11/172.16.1.11
web服务器 web06 10.0.0.12/172.16.1.12
负载均衡 lb01+lb02 10.0.0.5/172.16.1.5

3.详细操作

3.1代码准备

image-20230329191400113

上传代码步骤

$ git init
$ git remote -v
$ git remote add origin git@gitlab.cn:root/bird.git
$ git add .
$ git commit -m v1.0
$ git tag -a v1.0 -m v1.0
$ git push -u origin --all
$ git push -u origin --tags

3.2书写dockerfile

#这里在jenkins机器上测试
#需要提前安装docker,配置docker加速
[root@jenkins /app/code/bird]# cat /etc/docker/daemon.json
{
    "registry-mirrors": [ "https://27cf01f0b01b4601805bac18c9257c3e.mirror.swr.myhuaweicloud.com" ],
    "insecure-registries": ["http://reg.cn:5000"]
}

[root@jenkins /app/code/bird]# systemctl restart docker



[root@jenkins ~]# mkdir /app/code/
[root@jenkins ~]# rz -E
rz waiting to receive.
[root@jenkins ~]# ll
total 206216
-rw-------. 1 root root      1340 Jan  9 09:09 anaconda-ks.cfg
-rw-r--r--  1 root root   9506321 Mar 28 14:54 apache-maven-3.6.3-bin.tar.gz
-rw-r--r--  1 root root     91244 Feb  8 17:03 bird.zip
-rw-r--r--  1 root root  93304199 Mar 24 08:27 jenkins-2.361.4-1.1.noarch.rpm
-rw-r--r--  1 root root 108250480 Mar 27 09:38 jenkins-2.361-plugins.tar.gz
[root@jenkins ~]# unzip bird.zip -d /app/code/
Archive:  bird.zip
   creating: /app/code/bird/
  inflating: /app/code/bird/2000.png  
  inflating: /app/code/bird/21.js    
  inflating: /app/code/bird/icon.png  
   creating: /app/code/bird/img/
  inflating: /app/code/bird/img/bg1.jpg  
  inflating: /app/code/bird/img/bg2.jpg  
  inflating: /app/code/bird/img/number1.png  
  inflating: /app/code/bird/img/number2.png  
  inflating: /app/code/bird/img/s1.png  
  inflating: /app/code/bird/img/s2.png  
  inflating: /app/code/bird/index.html  
  inflating: /app/code/bird/sound1.mp3 
[root@jenkins ~]# cd /app/code/bird/
[root@jenkins /app/code/bird]# cat Dockerfile 
FROM nginx:1.22-alpine

LABEL author=wh

COPY . /usr/share/nginx/html/

EXPOSE 80

[root@jenkins /app/code/bird]# docker build -t web:nginx_bird .
[root@jenkins /app/code/bird]# docker run -d -p 8848:80 web:nginx_bird

#浏览器访问测试
http://10.0.0.72:8848/

3.3 把Dockerfile上传到gitlab

$ cat Dockerfile
FROM nginx:1.22-alpine

LABEL author=wh

COPY . /usr/share/nginx/html/

EXPOSE  80

3.4 准备私有仓库

#docker02新建私有仓库
[root@docker02 ~]# docker run -d  --name "registry"   -p 5000:5000 -v registry:/var/lib/registry  \
> --restart=always registry:latest

3.5 jenkins服务器手动访问仓库

[root@jenkins /app/code/bird]# cat /etc/docker/daemon.json
{
    "registry-mirrors": [ "https://27cf01f0b01b4601805bac18c9257c3e.mirror.swr.myhuaweicloud.com" ],
    "insecure-registries": ["http://reg.cn:5000"]  #仓库的地址
}

[root@jenkins /app/code/bird]# systemctl restart docker

[root@jenkins /app/code/bird]# cat /etc/hosts
172.16.1.82 reg.cn

[root@jenkins /app/code/bird]# docker build -t reg.cn:5000/test/web:nginx_bird .
[root@jenkins /app/code/bird]# docker images
REPOSITORY             TAG          IMAGE ID       CREATED         SIZE
reg.cn:5000/test/web   nginx_bird   6cfa60c1894c   7 minutes ago   277MB
[root@jenkins /app/code/bird]# docker push reg.cn:5000/test/web:nginx_bird
The push refers to repository [reg.cn:5000/test/web]
080b304db896: Pushed 
a30be372e737: Pushed 
1007099a9990: Pushed 
2acaedb99c73: Pushed 
aef3a35bcd7c: Pushed 
594065ec1304: Pushed 
b676d2fb11a1: Pushed 
7cd52847ad77: Pushed 
nginx_bird: digest: sha256:5fa8d097c4cfbf752200207f00c7dd5cddb58fbec1c9f4f8f4275513d3d8cd05 size: 1994

故障:

docker 提交仓库提示'Client.Timeout exceeded while awaiting headers'

[root@jenkins /app/code/bird]# docker push reg.cn:5000/test/web:nginx_bird
The push refers to repository [reg.cn:5000/test/web]
Get "http://reg.cn:5000/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

#重启下仓库的docker即可

3.6 创建jk任务

image-20230329195837928

image-20230329195925985

image-20230329195937595

image-20230329200004021

image-20230329200337462

web_servers="172.16.1.82 "

if [ "${tag}" = "origin/master" ];then
		tag=latest
fi

docker build -t reg.cn:5000/test/web:ngx_bird_${tag} .

docker push reg.cn:5000/test/web:ngx_bird_${tag}

for ip in ${web_servers}
do
	ssh root@${ip} "
    docker run -d --name "ngx_bird_${tag}" \
	-p 80:80 --restart=always \
	reg.cn:5000/test/web:ngx_bird_${tag}"
done

故障:

jenkins构建时提示'Host key verification failed.'

 docker run -d --name ngx_bird_v1.0 	-p 80:80 --restart=always 	reg.cn:5000/test/web:ngx_bird_v1.0'
Host key verification failed.
Build step 'Execute shell' marked build as failure
Finished: FAILURE

原因:
没有ssh公钥

3.7 测试

image-20230329200647452

[root@docker02 ~]# docker images
REPOSITORY                      TAG             IMAGE ID       CREATED         SIZE
reg.cn:5000/test/web              ngx_bird_v1.0   5dc160930ba5   5 minutes ago   41.3MB
[root@docker02 ~]# docker ps
CONTAINER ID   IMAGE                              COMMAND                  CREATED          STATUS                    PORTS                                       NAMES
e846fb5b32ee   reg.cn:5000/test/web:ngx_bird_v1.0   "/docker-entrypoint.…"   56 seconds ago   Up 55 seconds             0.0.0.0:80->80/tcp, :::80->80/tcp           ngx_bird_v1.0

#浏览器测试访问
http://10.0.0.82/

十、基于ansible实现

1.整体流程

开发书写代码提交代码+Dockerfile

jk: 拉取代码

jk: 构建镜像并推送到私有仓库

jk: 管理web,在web上拉取镜像并运行容器 (shell,改为ans实现)

web或lb: 进行测试.

2.把shell改为Ansible剧本

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


#带注释的
- hosts: web
  vars: 
    - img_name: "ngx_bird_{{ans_git_tag}}"
  gather_facts: false
  tasks:
    - name: 1. 获取80端口是否冲突
      #过滤宿主机占用80端口的容器
      shell: docker ps -a  |grep  ':80->'
      #存放到port变量中json形式数据  port.rc返回值
      register: port
      #用于指定这个模块什么条件下才算是报错了.
      #'"not found" in port.stdout' 命令的结果中如果出现 not found字样比如command not found则报错.
      #ignore_errors: true
      failed_when: '"not found" in port.stdout'

    - name: 1. 获取80端口是否冲突,如果有冲突则删除容器
      shell: docker ps -a  |grep  ':80->'|awk '{print $NF}' |xargs docker rm -f  
      #当docker ps -a  |grep  ':80->'命令的返回值是0的时候才会运行删除容器的操作.
      #port.rc == 0
      when:  port.rc == 0

    - name: 2. 获取是否有重名的docker容器,如果有冲突则删除容器
      shell: docker ps -a |grep -w "{{img_name}}"
      register: container_name
      failed_when: '"not found" in container_name.stdout'
    - name: 2. 获取是否有重名的docker容器,如果有冲突则删除容器
      shell: docker ps -a |grep -w "{{img_name}}"|awk '{print $NF}' |xargs docker rm -f  
      when:  container_name.rc == 0

    - name: 3. 启动容器
      shell:  docker run -d --name "{{img_name}}" -p 80:80 --restart=always  reg.cn:5000/wh/web:{{img_name}}
	  
	  
#不带注释的	  
[root@jenkins ~]# cat /server/scripts/docker_jenkins_ansible.yml 
- hosts: web
  vars: 
    - img_name: "ngx_bird_{{ans_git_tag}}"
  gather_facts: false
  tasks:
    - name: 1. 获取80端口是否冲突   
      shell: docker ps -a  |grep  ':80->'
      register: port
      failed_when: '"not found" in port.stdout'

    - name: 1. 获取80端口是否冲突,如果有冲突则删除容器
      shell: docker ps -a  |grep  ':80->'|awk '{print $NF}' |xargs docker rm -f  
      when:  port.rc == 0

    - name: 2. 获取是否有重名的docker容器,如果有冲突则删除容器
      shell: docker ps -a |grep -w "{{img_name}}"
      register: container_name
      failed_when: '"not found" in container_name.stdout'
    - name: 2. 获取是否有重名的docker容器,如果有冲突则删除容器
      shell: docker ps -a |grep -w "{{img_name}}"|awk '{print $NF}' |xargs docker rm -f  
      when:  container_name.rc == 0

    - name: 3. 启动容器
      shell:  docker run -d --name "{{img_name}}" -p 80:80 --restart=always  reg.cn:5000/wh/web:{{img_name}}

[root@jenkins ~]# cat /server/scripts/hosts
[web]
172.16.1.82

3.jk调用ansible

依赖插件:

image-20230330200006372

配置ansible任务

image-20230330200157783

image-20230330200226247

image-20230330200233525

image-20230330200317019

web_servers="172.16.1.82 "

if [ "${tag}" = "origin/master" ];then
		tag=latest
fi

docker build -t reg.cn:5000/wh/web:ngx_bird_${tag} .

docker push reg.cn:5000/wh/web:ngx_bird_${tag}

配置ansible

image-20230330200328257

image-20230330200650398

image-20230330200916699

image-20230330201441409

image-20230330200934026

[root@jenkins ~]# ssh-copy-id root@172.16.1.82

4.构建测试

image-20230330201251492

image-20230330203422156

十一、jenkins分布式

1.概述

背景: jenkins服务器上运行maven编译,ansible(执行剧本),docker build(构建镜像)

jenkins慢了.

解决:

把一些功能拆分出去.

运行指定任务的时候指定这个新的(jenkins)节点即可.

2.拆分docker功能

添加节点

准备节点上安装jdk/jre环境.

yum install -y java-11 web页面添加节点.

image-20230330204246099

image-20230330204314813

image-20230330204450132

image-20230330204556487

image-20230330204653744

image-20230330204955404

image-20230330204725936

3.查看结果

image-20230330205026478

4.配置到项目中

image-20230330205521042

十二、rbac认证

用于认证与权限控制.

目前jenkins的认证,用户与密码,所有用户权限一致,都是最高权限,权限混乱.

rbac基于role(角色)的认证体系. 角色(role)可以理解成权限集合.

  • dev-auto角色内部测试环境.
  • dev角色,可以管理所有的开发job(任务).
  • ops可以管理生产环境job.

未来把用户或用户组与对应的role关联即可拥有相关的权限.

1.插件

Role-based Authorization Strategy

Matrix Authorization Strategy Plugin

image-20230330210235306

2.启用基于RBAC的认证

在系统管理Manage and Assign Roles分配权限

添加全局角色与具体job角色.

全局只读.

局部使用正则匹配目录和目录下jobs.

2.1新增用户

image-20230330210718865

image-20230330210739703

2.2开启认证

image-20230330210809082

image-20230330210821742

2.3新增角色

image-20230330210847010

image-20230330210854818

image-20230330210921837

image-20230330210958269

image-20230330211032193

4.用户绑定角色

image-20230330211106748

5.登录测试

image-20230330211135308

十三、pipeline

1.概述

pipeline-流水线

通过jenkins的工作框架,通过"代码的方式",将多个任务联合起来.

流水线

  • 模块化
  • 方便检查
  • 排错
  • 整体运行清晰

2.pipeline格式

三大核心:

agent: 类似于ansible hosts 指定在哪些机器运行pipeline

stages:与stage 类似于 ansible tasks

steps: 具体的指令 类似于ansible中调用各种模块

3.Java上线的项目

3.1整体流程

Jenkins拉取Gitlab代码,获取tag标签

Jenkins调用Sonarqube/sonar scan 代码质量分析

略: Jenkins 调用 发送脚本,发送代码质量检查结果

Jenkins 调用Maven进行构建 Jenkins 调用部署脚本

🅰 摘下web服务器

🅱 分发代码,解压代码,软连接......重启服务

🆎 负载均衡接入web服务器

略:Jenkins通过脚本,发送上线结果

3.2 根据流程书写pipeline架构

pipeline {
    agent any
    environment {
        host="yuanlinux.com"
    }
    stages {
        stage('1.拉取代码') {
            steps {
                git credentialsId: '99e596cb-0d65-462a-abe4-8c7b05047d95', url: 'git@gitlab.cn:root/hello-world.git'
            }
        }
        
        stage('2.编译代码') {
            steps {
                sh ''' /app/tools/maven/bin/mvn clean package '''
            }
        }
        
        stage('3.Go_to_sleep') {
            steps {
                sh '''
                   for ip   in   172.16.1.82
                     do
                          ssh    $ip    "hostname"
                     done
                   '''
            }
        }
    }
}

3.3分步实现

新建项目

image-20230330212612549

拉取代码

image-20230330212646187

image-20230330212928169

配置

image-20230330213007453

3.4测试

image-20230330213249854

posted @ 2023-03-29 22:00  wh459086748  阅读(483)  评论(3)    收藏  举报