# 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 修复,功能增加等。
# 瀑布模型
# 敏捷开发
敏捷开发 (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 服务。
安装相关依赖
yum -y install policycoreutils openssh-server openssh-clients postfifix
启动 ssh 服务 & 设置为开机启动
systemctl enable sshd && sudo systemctl start sshd
设置 postfifix 开机自启,并启动,postfifix 支持 gitlab 发信功能
systemctl enable postfix && systemctl start postfix
开放 ssh 以及 http 服务,然后重新加载防火墙列表
fifirewall-cmd --add-service=ssh --permanent
fifirewall-cmd --add-service=http --permanent
fifirewall-cmd --reload
下载 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
修改 gitlab 配置
vi /etc/gitlab/gitlab.rb
修改 gitlab 访问地址和端口,默认为 80,我们改为 82
external_url ‘http://192.168.66.100:82 ’
nginx[‘listen_port’] = 82
重载配置及启动 gitlab
gitlab-ctl reconfigure
gitlab-ctl restart
把端口添加到防火墙
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
进入 Mange roles,根据需求创建 roles,分配给角色
baseRole:该角色为全局角色。这个角色需要绑定 Overall 下面的 Read 权限,是为了给所有用户绑定最基本的 Jenkins 访问权限。注意:如果不给后续用户绑定这个角色,会报错误:用户名 is missing the Overall/Read permission
role1:该角色为项目角色。使用正则表达式绑定 "itcast.*",意思是只能操作 itcast 开头的项目。
role2:该角色也为项目角色。绑定 "itheima.*",意思是只能操作 itheima 开头的项目。
# 凭证管理
凭据可以用来存储需要密文保护的数据库密码、Gitlab 密码信息、Docker 私有仓库密码等,以便 Jenkins 可以和这些第三方的应用进行交互。
安装插件 Credentials Binding
一共有五种凭证
Username with password:用户名和密码
SSH Username with private key: 使用 SSH 用户和密钥
Secret fifile:需要保密的文本文件,使用时 Jenkins 会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的 Secret fifile 就会被删除。
Secret text:需要保存的一个加密的文本串,如钉钉机器人或 Github 的 api token
Certifificate:通过上传证书文件的方式
添加凭证
在 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
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] [root@tomcat META-INF] <!-- <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
# 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 的项目
# maven 项目
安装 Deploy to container 插件
# 流水线
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 种构建触发器:
触发远程构建
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
# 参数化构建
# 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
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 微服务持续继承
# 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/dockercompose-$(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
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)