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>
3.解锁Jenkins
解锁 Jenkins,当您第一次访问新的Jenkins实例时,系统会要求您使用自动生成的密码对其进行解锁。
登录的用户名是admin

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


三、安装插件
| 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
安装完之后,会进行汉化

2.手动添加插件


安装完之后一般要重启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目录,表示测试环境和生产环境。
创建文件夹




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


自由风格: 一般用于部署静态,各种都可以。
maven项目:java代码。
流水线(pipeline):把第1个或第2个任务通过指令(代码)方式实现。
3.3配置项目基础信息

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

3.5 配置参数化构建

3.6配置构建与shell

case "$choose" in
dev) echo "部署到测试环境" ;;
prod) echo "部署到生产环境" ;;
esac
echo "当前用户:`whoami`"
echo "当前目录:`pwd`"

4. 运行任务




温馨提示:项目运行的时候
工作目录在/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环境
准备代码目录(代码目录绝对路径中不要包含中文字符)

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


3.创建gitlab/gitee项目

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

5. 配置jenkins
5.1 进行hosts解析
[root@jenkins ~]# cat /etc/hosts
172.16.1.71 gitlab.cn
172.16.1.72 jk.cn
5.2 添加任务


配置git仓库地址

配置访问凭证。

配置私钥的凭证

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

补充:
添加完私钥还提示错误
#进入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:


5.3 执行任务


[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. 配置脚本


[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创造

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

[root@jenkins ~]# systemctl restart jenkins
3.创建Jenkins任务








[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

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/"

七、搭建 开发测试专用的任务
开发人员书写代码,上传到代码仓库.
只要仓库收到开发上传的代码,触发测试任务.
jenkins去拉取代码仓库最新的代码并部署到测试环境中.
一般用于测试环境自动化部署代码.
1.安装插件


2.创建任务






3.gitlab配置钩子
3.1 解除钩子局域网访问限制


3.2 gitlab配置钩子




3.3 测试钩子
注意:一定要进行hosts解析



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

4.修改代码测试钩子
修改代码push之后,gitlab调用jenkins,jenkins自动拉取代码


八、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
部署:
- war包发送到web节点.
- war包部署webapps/目录下.
- 重启tomcat.
2.1 代码上传到gitlab
新建仓库

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

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拉取代码与手动编译代码



[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创建项目

3.2连接git

3.3配置maven





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

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测试

九、基于docker的案例实现 静态代码
1.步骤
-
书写代码,上传到gitlab
-
书写测试dockerfile(只需要代码+docker环境即可)
-
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代码准备

上传代码步骤
$ 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任务





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 测试

[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
依赖插件:

配置ansible任务




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





[root@jenkins ~]# ssh-copy-id root@172.16.1.82
4.构建测试


十一、jenkins分布式
1.概述
背景: jenkins服务器上运行maven编译,ansible(执行剧本),docker build(构建镜像)
jenkins慢了.
解决:
把一些功能拆分出去.
运行指定任务的时候指定这个新的(jenkins)节点即可.
2.拆分docker功能
添加节点
准备节点上安装jdk/jre环境.
yum install -y java-11 web页面添加节点.







3.查看结果

4.配置到项目中

十二、rbac认证
用于认证与权限控制.
目前jenkins的认证,用户与密码,所有用户权限一致,都是最高权限,权限混乱.
rbac基于role(角色)的认证体系. 角色(role)可以理解成权限集合.
- dev-auto角色内部测试环境.
- dev角色,可以管理所有的开发job(任务).
- ops可以管理生产环境job.
未来把用户或用户组与对应的role关联即可拥有相关的权限.
1.插件
Role-based Authorization Strategy
Matrix Authorization Strategy Plugin

2.启用基于RBAC的认证
在系统管理Manage and Assign Roles分配权限
添加全局角色与具体job角色.
全局只读.
局部使用正则匹配目录和目录下jobs.
2.1新增用户


2.2开启认证


2.3新增角色





4.用户绑定角色

5.登录测试

十三、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分步实现
新建项目

拉取代码


配置

3.4测试



浙公网安备 33010602011771号