# jenkins

注意,这篇需要结合 kubernetes 和一些其他的运维相关知识,不适合单独使用,仅作为 backup

Jenkins 教程_免费高速下载 | 百度网盘 - 分享无限制 (baidu.com)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
gitlab
http://192.168.13.11/
root kbshire1

jenkins
http://192.168.13.12:8080/
admin kbshire1

tomcat
http://192.168.13.13:8080/

harbor
https://192.168.13.14/
admin Harbor12345
Eric123456

maven
192.168.13.12

sonarqube
192.168.13.12:9000
admin
admin
token: 8bf0de8a91bef59c1afd4c942935f8fbc1f9db1f

mysql
192.168.13.12:3306
root
123456

k8s-jenkins
http://192.168.13.15:32688/
kbshire1

(*)
http://47.100.66.171:30889/asynchPeople/
http://106.14.71.168:30888/admin/users/
http://192.168.13.132:8080/job/

# 前置概念

# 软件开发声明周期

软件开发生命周期又叫做 SDLC(Software Development Life Cycle),它是集合了计划、开发、测试和部署过程的集合。

需求分析

这是生命周期的第一阶段,根据项目需求,团队执行一个可行性计划的分析。项目需求可能是公司内部或者客户提出的。这阶段主要是对信息的收集,也有可能是对现有项目的改善和重新做一个新的项目。还要分析项目的预算多长,可以从哪方面受益及布局,这也是项目创建的目标。

设计

第二阶段就是设计阶段,系统架构和满意状态(就是要做成什么样子,有什么功能),和创建一个项目计划。计划可以使用图表,布局设计或者文者的方式呈现。

实现

第三阶段就是实现阶段,项目经理创建和分配工作给开者,开发者根据任务和在设计阶段定义的目标进行开发代码。依据项目的大小和复杂程度,可以需要数月或更长时间才能完成。

测试

测试人员进行代码测试 ,包括功能测试、代码测试、压力测试等。

进化

最后进阶段就是对产品不断的进化改进和维护阶段,根据用户的使用情况,可能需要对某功能进行修改,bug 修复,功能增加等。

image-20230417181513388

# 瀑布模型

image-20230417181556355

image-20230417181855245

# 敏捷开发

敏捷开发 (Agile Development) 的核心是迭代开发 (lterative Development) 与增量开发 (IncrementalDevelopment)。

虽然敏捷开发将软件开发分成多个迭代,但是也要求,每次迭代都是一个完整的软件开发周期,必须按照软件工程的方法论,进行正规的流程管理。

早期交付

降低风险

# 持续继承

持续集成( Continuous integration , 简称 CI )指的是,频繁地(一天多次)将代码集成到主干。

提交

流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交(commit)

测试(第一轮)

代码仓库对 commit 操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。

构建

通过第一轮测试,代码就可以合并进主干,就算可以交付了。交付后,就先进行构建(build),再进入第二轮测试。所谓构建,指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS 脚本、图片)等等。

测试(第二轮)

构建完成,就要进行第二轮测试。如果第一轮已经涵盖了所有测试内容,第二轮可以省略,当然,这时构建步骤也要移到第一轮测试前面。

部署

过了第二轮测试,当前代码就是一个可以直接部署的版本(artifact)。将这个版本的所有文件打包(tar fifilename.tar * )存档,发到生产服务器。

回滚

一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指向上一个版本的目录。

# Jenkins

Jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。官网: http://jenkins-ci.org/。

Jenkins 的特征:

开源的 Java 语言开发持续集成工具,支持持续集成,持续部署。易于安装部署配置:

可通过 yum 安装,或下载 war 包以及通过 docker 容器等快速实现安装部署,可方便 web 界面配置管理。

消息通知及测试报告:集成 RSS/E-mail 通过 RSS 发布构建结果或当构建完成时通过 e-mail 通知,生成 JUnit/TestNG 测试报告。

分布式构建:支持 Jenkins 能够让多台计算机一起构建 / 测试。

文件识别:Jenkins 能够跟踪哪次构建生成哪些 jar,哪次构建使用哪个版本的 jar 等。

丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如 git,svn,maven,docker 等。

# 持续集成流程 & 环境搭建

1)首先,开发人员每天进行代码提交,提交到 Git 仓库

2)然后,Jenkins 作为持续集成工具,使用 Git 工具到 Git 仓库拉取代码到集成服务器,再配合 JDK,Maven 等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程。

3)最后,Jenkins 把生成的 jar 或 war 包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用。

名称 IP 安装的软件
代码托管服务器 192.168.13.132 Gitlab
持续集成服务器 192.168.13.155 Jenkins,JDK,Maven,Git,SonarQube
应用测试服务器 192.168.13.166 JDK,tomcat

# gitlab

GitLab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务。

  1. 安装相关依赖

yum -y install policycoreutils openssh-server openssh-clients postfifix

  1. 启动 ssh 服务 & 设置为开机启动

systemctl enable sshd && sudo systemctl start sshd

  1. 设置 postfifix 开机自启,并启动,postfifix 支持 gitlab 发信功能

systemctl enable postfix && systemctl start postfix

  1. 开放 ssh 以及 http 服务,然后重新加载防火墙列表

fifirewall-cmd --add-service=ssh --permanent

fifirewall-cmd --add-service=http --permanent

fifirewall-cmd --reload

  1. 下载 gitlab 包,并且安装

在线下载安装包:

wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm

安装:

rpm -i gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm

centos8 : el/8/gitlab-ce-15.10.3-ce.0.el8.x86_64.rpm - gitlab/gitlab-ce · packages.gitlab.com

  1. 修改 gitlab 配置

vi /etc/gitlab/gitlab.rb

修改 gitlab 访问地址和端口,默认为 80,我们改为 82

external_url ‘http://192.168.66.100:82

nginx[‘listen_port’] = 82

  1. 重载配置及启动 gitlab

gitlab-ctl reconfigure

gitlab-ctl restart

  1. 把端口添加到防火墙

fifirewall-cmd --zone=public --add-port=82/tcp --permanent

fifirewall-cmd --reload

# jenkins

1)安装 JDK

Jenkins 需要依赖 JDK,所以先安装 JDK1.8

yum install java-1.8.0-openjdk* -y

新版 Jenkins 要求必须 java 为 11 或 17,使用 1.8 会导致 Jenkins 无法启动

yum intall java-11 - y*

安装目录为:/usr/lib/jvm

2)获取 jenkins 安装包

下载页面:https://jenkins.io/zh/download/

安装文件:jenkins-2.190.3-1.1.noarch.rpm

3)把安装包上传到 192.168.66.101 服务器,进行安装

rpm -ivh jenkins-2.190.3-1.1.noarch.rpm

4)修改 Jenkins 配置

vi /etc/syscofifig/jenkins

修改内容如下:

JENKINS_USER=“root”

JENKINS_PORT=“8888”

5)启动 Jenkins

systemctl start jenkins

6)打开浏览器访问

http://192.168.66.101:8888

先跳过插件,之后换源之后再自行安装

安装插件前先替换源

1
sed -i 's/http:\/\/updates.jenkins-ci.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

再选择 advanced,改成如下网址

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

重启

[Restart Jenkins Jenkins]

如果 Jenkins 启动失败:

[(68 条消息) Jenkins] Failed to start Jenkins Continuous Integration Server_码里法的博客 - CSDN 博客

1
2
3
4
5
6
7
8
9
10
11
cd /etc/init.d

# 启动
./jenkins start
# 停止
./jenkins stop
# 状态
./jenkins status


openssl req -sha512 -new -subj "/C=CN/ST=JS/L=WX/O=zwx/OU=jhmy/CN=192.168.13.14" -key harbor.key -out harbor.csr

# 用户权限管理:

安装插件 Role-base auth straegy

image-20230421185352254

image-20230421185421344

进入 Mange roles,根据需求创建 roles,分配给角色

image-20230421185512385

baseRole:该角色为全局角色。这个角色需要绑定 Overall 下面的 Read 权限,是为了给所有用户绑定最基本的 Jenkins 访问权限。注意:如果不给后续用户绑定这个角色,会报错误:用户名 is missing the Overall/Read permission

role1:该角色为项目角色。使用正则表达式绑定 "itcast.*",意思是只能操作 itcast 开头的项目。

role2:该角色也为项目角色。绑定 "itheima.*",意思是只能操作 itheima 开头的项目。

1
2
3
jenkins
用户名 - kbshire

# 凭证管理

凭据可以用来存储需要密文保护的数据库密码、Gitlab 密码信息、Docker 私有仓库密码等,以便 Jenkins 可以和这些第三方的应用进行交互。

安装插件 Credentials Binding

image-20230421185601535

一共有五种凭证

image-20230421185750965

Username with password:用户名和密码

SSH Username with private key: 使用 SSH 用户和密钥

Secret fifile:需要保密的文本文件,使用时 Jenkins 会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的 Secret fifile 就会被删除。

Secret text:需要保存的一个加密的文本串,如钉钉机器人或 Github 的 api token

Certifificate:通过上传证书文件的方式

添加凭证

image-20230421194819714

在 project 选择 git,选择凭证拉取

# 安装 maven

1
2
3
4
5
6
7
8
9
10
tar -xzf apache-maven-3.6.2-bin.tar.gz 解压
mkdir -p /opt/maven 创建目录
mv apache-maven-3.6.2/* /opt/maven 移动文件

或者yum install maven

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk/
export MAVEN_HOME=/usr/share/maven
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin

Global Tool Confifiguration

image-20230423193611132

image-20230423193631789

image-20230423193939924

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mkdir /root/repo 创建本地仓库目录
vi /opt/maven/conf/settings.xml

本地仓库改为:/root/repo/
添加阿里云私服地址:

<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>


# 部署 tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vi /opt/tomcat/conf/tomcat-users.xml
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,managerscript,tomcat,admin-gui,admin-script"/>


[root@tomcat apache-tomcat-10.1.7]# cd webapps/manager/META-INF/
[root@tomcat META-INF]# vim context.xml

<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->

登录:
http://192.168.13.13:8080/manager/html

image-20230427195133505

# Jenkins 构建 maven 项目

1
2
3
4
5
6
Jenkins中自动构建项目的类型有很多,常用的有以下三种:
自由风格软件项目(FreeStyle Project)
Maven项目(Maven Project)
流水线项目(Pipeline Project)
每种类型的构建其实都可以完成一样的构建过程与结果,只是在操作方式、灵活度等方面有所区别,在
实际开发中可以根据自己的需求和习惯来选择。(个人推荐使用流水线类型,因为灵活度非常高)

# free_style

[root@jenkins repo]# cd /var/lib/jenkins/workspace/

Jenkins 默认只有 free_style 的项目

image-20230427201046503

image-20230427201111874

image-20230427201101832

# maven 项目

安装 Deploy to container 插件

image-20230427203149978

image-20230427203158112

image-20230427203216179

# 流水线

1)概念

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

2)使用 Pipeline 有以下好处(来自翻译自官方文档):代码:Pipeline 以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其传送流程。 持久:无论是计划内的还是计划外的服务器重启,Pipeline 都是可恢复的。 可停止:Pipeline 可接收交互式输入,以确定是否继续执行 Pipeline。 多功能:Pipeline 支持现实世界中复杂的持续交付要求。它支持 fork/join、循环执行,并行执行任务的功能。 可扩展:Pipeline 插件支持其 DSL 的自定义扩展 ,以及与其他插件集成的多个选项。

3)如何创建 Jenkins Pipeline 呢?

Pipeline 脚本是由 Groovy 语言实现的,但是我们没必要单独去学习 GroovyPipeline 支持两种语法:Declarative (声明式) 和 Scripted Pipeline (脚本式) 语法

Pipeline 也有两种创建方法:可以直接在 Jenkins 的 Web UI 界面中输入脚本;也可以通过创建一个 Jenkinsfifile 脚本文件放入项目源码库中(一般我们都推荐在 Jenkins 中直接从源代码控制 (SCM) 中直接载入 Jenkinsfifile Pipeline 这种方法)。

# 流水线

# 声明式

1
2
3
4
5
6
7
8
9
10
11
12
pipeline {
agent any

stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
}

# 脚本式

1
2
3
4
5
6
7
8
9
10
11
12
13
node {
def mvnHome
stage('pull code') { // for display purposes
echo "1"
}
stage('Build project') {
echo "1"
}
stage('publish ') {
echo "1"
}
}

# 构建触发器

Jenkins 内置 4 种构建触发器:

触发远程构建

image-20230428194514430

192.168.13.12:8080/job/pip44/build?token=9999

其他工程构建后触发(Build after other projects are build)

定时构建(Build periodically)

定时字符串从左往右分别为:

分 时 日 月 周一些定时表达式的例子:

每 30 分钟构建一次:H 代表形参 H/30 * * * * 10:02 10:32

每 2 个小时构建一次: H H/2 * * *

每天的 8 点,12 点,22 点,一天构建 3 次: (多个时间点中间用逗号隔开) 0 8,12,22 * * *

每天中午 12 点定时构建一次 H 12 * * *

每天下午 18 点定时构建一次 H 18 * * *

在每个小时的前半个小时内的每 10 分钟 H (0-29)/10 * * * *

每两小时一次,每个工作日上午 9 点到下午 5 点 (也许是上午 10:38,下午 12:38,下午 2:38,下午

4:38) H H(9-16)/2 * * 1-5

轮询 SCM(Poll SCM)

轮询 SCM,是指定时扫描本地代码仓库的代码是否有变更,如果代码有变更就触发项目构建。

注意:这次构建触发器,Jenkins 会定时扫描本地整个项目的代码,增大系统的开销,不建议使用。

# webhook

就是利用 Gitlab 的 webhook 实现代码 push 到仓库,立即触发项目自动构建。

需要安装两个插件:

Gitlab Hook 和 GitLab

image-20230428200812134

# 参数化构建

image-20230428202004524

# sonarqube

systemctl set-environment MYSQLD_OPTS="–skip-grant-tables" 慎用

解压 sonar,并设置权限

yum install unzip

unzip sonarqube-6.7.4.zip 解压

mkdir /opt/sonar 创建目录

mv sonarqube-6.7.4/* /opt/sonar 移动文件

useradd sonar 创建 sonar 用户,必须 sonar 用于启动,否则报错

chown -R sonar. /opt/sonar 更改 sonar 目录及文件权限

修改 sonar 配置文件

vi /opt/sonarqube-6.7.4/conf/sonar.properties

内容如下:

sonar.jdbc.username=root sonar.jdbc.password=Root@123

sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?

useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfifigs=

maxPerformance&useSSL=false

注意:sonar 默认监听 9000 端口,如果 9000 端口被占用,需要更改。

启动 sonar

cd /opt/sonarqube-6.7.4

su sonar ./bin/linux-x86-64/sonar.sh start 启动

su sonar ./bin/linux-x86-64/sonar.sh status 查看状态

su sonar ./bin/linux-x86-64/sonar.sh stop 停止

tail -f logs/sonar.logs 查看日志

访问 sonar

http://192.168.66.101:9000

image-20230430160853684

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# must be unique in a given SonarQube instance
sonar.projectKey=free_style
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=free_style
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# This property is optional if sonar.modules is set.
sonar.sources=.
sonar.exclusions=**/test/**,**/target/**

sonar.java.source=11
sonar.java.target=11
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
pipeline {
agent any

stages {
stage('pull images') {
steps {
checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '5e7e7a6e-744e-498b-8790-924dfd4e42a8', url: 'http://192.168.13.11/root/test04.git']])
}
}
stage('pull images') {
steps {
script {
scannerHome = tool 'sonarqube-scanner'
}
withSonarQubeEnv('sonarqube6.7.4') {
sh "${scannerHome}/bin/sonar-scanner"
}
}
}
stage('build project') {
steps {
sh 'mvn clean package'
}
}
stage('deploy project') {
steps {
deploy adapters: [tomcat9(credentialsId: 'b3de0bd0-bcbe-4680-8b56-7e748ef40984', path: '', url: 'http://192.168.13.13:8080/')], contextPath: null, war: 'target/untitled4_war exploded.war'
}
}
}
}

# Jenkins 微服务持续继承

image-20230429204123621

# harbro

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Harbor需要安装在192.168.66.102上面
1)先安装Docker并启动Docker(已完成)
参考之前的安装过程
2)先安装docker-compose
3)给docker-compose添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
4)查看docker-compose是否安装成功
docker-compose -version
5)下载Harbor的压缩包(本课程版本为:v1.9.2)
https://github.com/goharbor/harbor/releases
6)上传压缩包到linux,并解压
tar -xzf harbor-offline-installer-v1.9.2.tgz
mkdir /opt/harbor
mv harbor/* /opt/harbor
cd /opt/harbor
7)修改Harbor的配置
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker￾compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
vi harbor.yml
修改hostname和port
hostname: 192.168.66.102
port: 85
8)安装Harbor
./prepare
./install.sh
9)启动Harbor
docker-compose up -d 启动
docker-compose stop 停止
docker-compose restart 重新启动

openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.13.14" \
-key ca.key \
-out ca.crt


openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.13.14" \
-key 192.168.13.14.key \
-out 192.168.13.14.csr


cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=192.168.13.14
EOF

openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in 192.168.13.14.csr \
-out 192.168.13.14.crt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//git凭证ID
def git_auth = "b632ed00-fc81-43c8-a746-5aa0673b2658"
//git的url地址
def git_url = "git@192.168.66.100:itheima_group/tensquare_back.git"
//镜像的版本号
def tag = "latest"
//Harbor的url地址
def harbor_url = "192.168.66.102:85"
//镜像库项目名称
def harbor_project = "tensquare"
//Harbor的登录凭证ID
def harbor_auth = "833d1a75-f3db-4aec-9cc4-75a77e423163"

node {
//获取当前选择的项目名称
def selectedProjectNames = "${project_name}".split(",")
//获取当前选择的服务器名称
def selectedServers = "${publish_server}".split(",")

stage('拉取代码') {
checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
}
stage('代码审查') {
for(int i=0;i<selectedProjectNames.length;i++){
//tensquare_eureka_server@10086
def projectInfo = selectedProjectNames[i];
//当前遍历的项目名称
def currentProjectName = "${projectInfo}".split("@")[0]
//当前遍历的项目端口
def currentProjectPort = "${projectInfo}".split("@")[1]

//定义当前Jenkins的SonarQubeScanner工具
def scannerHome = tool 'sonar-scanner'
//引用当前JenkinsSonarQube环境
withSonarQubeEnv('sonarqube') {
sh """
cd ${currentProjectName}
${scannerHome}/bin/sonar-scanner
"""
}
}


}
stage('编译,安装公共子工程') {
sh "mvn -f tensquare_common clean install"
}
stage('编译,打包微服务工程,上传镜像') {
for(int i=0;i<selectedProjectNames.length;i++){
//tensquare_eureka_server@10086
def projectInfo = selectedProjectNames[i];
//当前遍历的项目名称
def currentProjectName = "${projectInfo}".split("@")[0]
//当前遍历的项目端口
def currentProjectPort = "${projectInfo}".split("@")[1]

sh "mvn -f ${currentProjectName} clean package dockerfile:build"

//定义镜像名称
def imageName = "${currentProjectName}:${tag}"

//对镜像打上标签
sh "docker tag ${imageName} ${harbor_url}/${harbor_project}/${imageName}"

//把镜像推送到Harbor
withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {

//登录到Harbor
sh "docker login -u ${username} -p ${password} ${harbor_url}"

//镜像上传
sh "docker push ${harbor_url}/${harbor_project}/${imageName}"

sh "echo 镜像上传成功"
}

//遍历所有服务器,分别部署
for(int j=0;j<selectedServers.length;j++){
//获取当前遍历的服务器名称
def currentServerName = selectedServers[j]

//加上的参数格式:--spring.profiles.active=eureka-server1/eureka-server2
def activeProfile = "--spring.profiles.active="

//根据不同的服务名称来读取不同的Eureka配置信息
if(currentServerName=="master_server"){
activeProfile = activeProfile+"eureka-server1"
}else if(currentServerName=="slave_server"){
activeProfile = activeProfile+"eureka-server2"
}

//部署应用
sshPublisher(publishers: [sshPublisherDesc(configName: "${currentServerName}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deployCluster.sh $harbor_url $harbor_project $currentProjectName $tag $currentProjectPort $activeProfile", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])


}

}
}
}

Spring Cloud 项目 MVN 编译 – Non-resolvable import POM - JackpotHan - 博客园 (cnblogs.com)

[(74 条消息) Non-resolvable import POM: Failure to find org.springframework.cloud:spring-cloud-dependencies_Code 神之手的博客 - CSDN 博客](https://blog.csdn.net/Seven71111/article/details/103000151#:~:text=[ ERROR] Non-resolvable import POM%3A Failure to find,of alimaven has elapsed or updates are forced)

(74 条消息) 不能解决 org.springframework.cloud:spring-cloud-starter-netflix-turbine:unknown 不能解决 org.springframework._或许没看到的博客 - CSDN 博客

Jenkins+Docker+SpringCloud 微服务持续集成 (单机版) - 运维人在路上 - 博客园 (cnblogs.com)

tensquare: 黑马十次方微服务项目 (gitee.com)

https://twitter.com/AstonMartinF1/status/1653029001462534145?t=CFp5PeX_uYYRvUtkIXz9aA&s=05

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

# 单机版
#server:
# port: 10086
#spring:
# application:
# admin:
# jmx-name: eureka-server
#eureka:
# client:
# fetch-registry: false
# register-with-eureka: false
# service-url:
# defaultZone: http://192.168.13.13:${server.port}/eureka
# server:
# enable-self-preservation: false


spring:
application:
name: EUREKA-HA
---
server:
port: 10086
spring:
profiles: eureka-server1
eureka:
instance:
hostname: 192.168.13.13
client:
service-url:
defaultZone: http://192.168.13.13:10086/eureka/,http://192.168.13.15:10086/eureka/
register-with-eureka: false
fetch-registry: false
---
server:
port: 10086
spring:
profiles: eureka-server2
eureka:
instance:
hostname: 192.168.13.15
client:
service-url:
defaultZone: http://192.168.13.13:10086/eureka/,http://192.168.13.15:10086/eureka/
register-with-eureka: false
fetch-registry: false


server:
port: 10086
spring:
application:
admin:
jmx-name: eureka-server
eureka:
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://192.168.13.13:${server.port}/eureka
server:
enable-self-preservation: false

image-20230502212659240

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
cat >>/etc/hosts<<EOF 
192.168.13.12 k8s-master
192.168.13.13 k8s-node1
192.168.13.15 k8s-node2
EOF

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

kubeadm init --kubernetes-version=1.21.2 \
--apiserver-advertise-address=192.168.13.12 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16

kubeadm join 192.168.13.12:6443 --token l1x1ji.yonc002xc0vhf9vv \
--discovery-token-ca-cert-hash sha256:75a8c65d8521a2f275fae4e4c6ff40fbe2c518d54ed6348a408d20b8443d0eb2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def git_address = "http://192.168.13.11/root/tensquare_back.git"
def git_auth = "322ed148-5eda-40c0-9c47-eb89edf08c69"
//创建一个Pod的模板,label为jenkins-slave
podTemplate(label: 'jenkins-slave', cloud: 'kubernetes', containers: [
containerTemplate(
name: 'jnlp',
image: "192.168.13.14:85/library/jenkins-slave-maven:latest"
)
]
)
{
//引用jenkins-slave的pod模块来构建Jenkins-Slave的pod
node("jenkins-slave"){
// 第一步
stage('拉取代码'){
checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
}
}
}

基于 Kubernetes 平台微服务的部署 - 知己一语 - 博客园 (cnblogs.com)

基于 kubernetes 平台微服务的部署 - 阿里云开发者社区 (aliyun.com)

(82 条消息) 基于 k8s 平台 jenkins 部署及动态 slave 节点制作和配置_jenkins 部署动态 salve 安装 nerdctl_— 逆渡默行 — 的博客 - CSDN 博客

(82 条消息) Jenkins 集成 k8s 运行 Jenkins slave(Jenkins 弹性 slave)_jenkins podretention_programer_bei 的博客 - CSDN 博客

k8s 集群中部署 jenkins master slave - 李刚 - 天道酬勤 - 博客园 (cnblogs.com)

Kubernetes | Jenkins plugin

k8s-jenkins 在 kubernetes 中持续部署 - 七月流星雨 - 博客园 (cnblogs.com)

Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

John Doe WeChat Pay

WeChat Pay

John Doe Alipay

Alipay

John Doe PayPal

PayPal