Jenkins 安装构建

news/2024/5/15 2:59:38

一、CentOS 安装


1. 使用该存储库

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key  

2. 安装 Java

yum install fontconfig java-11-openjdk
  • 配置环境变量
vim /etc/profile
`
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-4.el8_5.x86_64
export PATH=$JAVA_HOME/bin:$PATH
`
source /etc/profile

3. 安装 Jenkins

  1. 直接安装
yum install jenkins

  1. 手动安装
# 下载地址 https://jenkins.io/zh/download/
# 下载文件 jenkins-2.190.3-1.1.noarch.rpm
# 进行安装
rpm -ivh jenkins-2.190.3-1.1.noarch.rpm

4. 卸载 Jenkins

yum remove jenkinsrm -rf /etc/sysconfig/jenkins.rpmsave
rm -rf /var/cache/jenkins/
rm -rf /etc/init.d/jenkins.rpmsave

5. 启动 Jenkins

systemctl status jenkins.service 或 journalctl -xe
systemctl start jenkins.service
systemctl stop jenkins.service
systemctl restart jenkins.service
# 重新加载
systemctl daemon-reload
systemctl enable jenkins

  • 修改 Jenkins 配置
vim /etc/syscofig/jenkins
`
JENKINS_USER="root"
JENKINS_PORT="8888"
`
vim /usr/lib/systemd/system/jenkins.service
`
Environment="JENKINS_PORT=8888"
`
  • http://127.0.0.1:8888
  • /var/lib/jenkins/secrets/initialAdminPassword
  • http://127.0.0.1:8888/restart 重启

  • 启动报错
[root@qs ~]# systemctl start jenkins.service
Job for jenkins.service failed because the control process exited with error code.
See "systemctl status jenkins.service" and "journalctl -xe" for details.[root@qs ~]# systemctl status jenkins.service
● jenkins.service - Jenkins Continuous Integration ServerLoaded: loaded (/usr/lib/systemd/system/jenkins.service; disabled; vendor preset: disabled)Active: failed (Result: exit-code) since Thu 2023-07-20 14:28:03 CST; 3s agoProcess: 418710 ExecStart=/usr/bin/jenkins (code=exited, status=1/FAILURE)Main PID: 418710 (code=exited, status=1/FAILURE)720 14:28:03 renyun systemd[1]: jenkins.service: Service RestartSec=100ms expired, scheduling restart.
720 14:28:03 renyun systemd[1]: jenkins.service: Scheduled restart job, restart counter is at 5.
720 14:28:03 renyun systemd[1]: Stopped Jenkins Continuous Integration Server.
720 14:28:03 renyun systemd[1]: jenkins.service: Start request repeated too quickly.
720 14:28:03 renyun systemd[1]: jenkins.service: Failed with result 'exit-code'.
720 14:28:03 renyun systemd[1]: Failed to start Jenkins Continuous Integration Server.
[root@qs ~]# journalctl -xe
-- Support: https://access.redhat.com/support
-- 
-- jenkins.service 单元已结束停止操作。
720 14:36:35 renyun systemd[1]: jenkins.service: Start request repeated too quickly.
720 14:36:35 renyun systemd[1]: jenkins.service: Failed with result 'exit-code'.
-- Subject: Unit failed
-- Defined-By: systemd
-- Support: https://access.redhat.com/support
-- 
-- The unit jenkins.service has entered the 'failed' state with result 'exit-code'.
720 14:36:35 renyun systemd[1]: Failed to start Jenkins Continuous Integration Server.
-- Subject: jenkins.service 单元已失败
-- Defined-By: systemd
-- Support: https://access.redhat.com/support
-- 
-- jenkins.service 单元已失败。
-- 
-- 结果为“failed”。
lines 3456-3473/3473 (END)

6. Jenkins 启动报错


1. Jdk 版本

vim /etc/init.d/jenkins
echo $JAVA_HOMEcandidates="
/etc/alternatives/java
/usr/lib/jvm/java-1.8.0/bin/java
/usr/lib/jvm/jre-1.8.0/bin/java
/usr/lib/jvm/java-11-openjdk-amd64
/usr/lib/jvm/java-11.0/bin/java
/usr/lib/jvm/jre-11.0/bin/java
/usr/bin/java
/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-4.el8_5.x86_64/bin/java
"

2. 用户名

vim /etc/sysconfig/jenkins
`
# 如果是 jenkins 或者其它,要改成 root
JENKINS_USER="root"
`
vim /usr/lib/systemd/system/jenkins.service
`
User=root
Group=root
`
systemctl daemon-reload
systemctl start jenkins.service
systemctl status jenkins.service

3. log 权限

cd /var/logchmod 777 -R jenkins/

4. 启动方法问题

cp /etc/rc.d/init.d/functions /etc/init.d/cd /etc/init.d/./jenkins status
./jenkins stop
./jenkins start

5. 无法使用 systemctl 启动 jenkins

  • 原因是因为 systemctl 启动时调用的 jenkins.service 文件在 /usr/lib/systemd/system 目录下,无法调用 /etc/init.d/ 下的 jenkins。
  • 所以如果遇到服务方式无法启动 jenkins,则需要修改 jenkins.service 来进行适配。
vim /usr/lib/systemd/system/jenkins.service
`
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-4.el8_5.x86_64"
`
systemctl daemon-reload
systemctl start jenkins.service
systemctl status jenkins.service

6. 端口占用

  • 修改前 kill 所有 jenkins 进程
netstat -ntap | grep 8086# 老版本
cat /etc/sysconfig/jenkins
JENKINS_PORT="8086"
# 新版本
cat /usr/lib/systemd/system/jenkins.service
Environment="JENKINS_PORT=8086"systemctl daemon-reload
systemctl start jenkins.service
systemctl status jenkins.service

二、Jenkins 插件


1. 替换国内插件地址

cd /var/lib/jenkins/updates
grep -oi "www.google.com" default.jsonsed -i 's/http:\/\/updates.jenkinsci.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
  • Dashboard > Manage Jenkins > Plugins > Advanced settings
  • 把 Update Site 改为国内插件下载地址:
  1. 原 https://updates.jenkins.io/update-center.json
  2. 新 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

2. Chinese 中文


3. Role-based Authorization Strategy 管理用户权限


1. 选择授权策略

  • Dashboard > Manage Jenkins > Security
    在这里插入图片描述

2. 创建角色

  • Dashboard > Manage Jenkins > Manage and Assign Roles > Manage Roles
    在这里插入图片描述
  • Global roles:全局角色
  • Item roles:项目角色
  1. dev.*:正则表达式匹配 dev 开头的项目。
  2. test.*:正则表达式匹配 test 开头的项目。

3. 创建用户

  • Dashboard > Manage Jenkins > Jenkins’ own user database > 新建用户
    在这里插入图片描述

4. 分配角色

  • Dashboard > Manage Jenkins > Manage and Assign Roles > Assign Roles
    在这里插入图片描述

4. Credentials Binding 使用凭证管理功能

  1. Username with password:用户名和密码。
  2. SSH Username with private key:使用 SSH 用户和密钥。
  3. Secret file:需要保密的文本文件,使用时 Jenkins 会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的 Secret file 就会被删除。
  4. Secret text:需要保存的一个加密的文本串,如钉钉机器人或 Github 的 api token。
  5. Certificate:通过上传证书文件的方式。

1. 创建凭证

  • Dashboard > Manage Jenkins > Credentials > System > Global credentials (unrestricted)
    在这里插入图片描述

5. Git 版本管理

# CentOS 安装 git
yum install git -y
# 安装后查看版本
git --version 

Started by user wy
# 由用户wy启动
Running as SYSTEM
# 作为SYSTEM运行
Building in workspace /var/lib/jenkins/workspace/dev
# 在workspace/var/lib/jenkins/workspace/dev中构建
The recommended git tool is: NONE
# 建议使用的git工具是:NONE
using credential 1d8dad31-e432-45b7-9aea-5482f5ab7096
# 使用凭证1d8dad31-e432-45b7-9aea-5482f5ab7096
Cloning the remote Git repository
# 克隆远程Git存储库
Cloning repository http://192.168.31.110:85/jenkins/jenkins-admin.git
# 克隆存储库http://192.168.31.110:85/jenkins/jenkins-admin.git> git init /var/lib/jenkins/workspace/dev # timeout=10
Fetching upstream changes from http://192.168.31.110:85/jenkins/jenkins-admin.git
# 正在从获取上游更改http://192.168.31.110:85/jenkins/jenkins-admin.git> git --version # timeout=10> git --version # 'git version 2.27.0'
using GIT_ASKPASS to set credentials gitlab-Username
# 使用GIT_ASKPASS设置凭据gitlab用户名> git fetch --tags --force --progress -- http://192.168.31.110:85/jenkins/jenkins-admin.git +refs/heads/*:refs/remotes/origin/* # timeout=10> git config remote.origin.url http://192.168.31.110:85/jenkins/jenkins-admin.git # timeout=10> git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
Avoid second fetch
# 避免第二次提取> git rev-parse refs/remotes/origin/master^{commit} # timeout=10
Checking out Revision 7ad80d4a04677aa88db3cc47f1f41d7538085658 (refs/remotes/origin/master)> git config core.sparsecheckout # timeout=10> git checkout -f 7ad80d4a04677aa88db3cc47f1f41d7538085658 # timeout=10
Commit message: "初始化"
# 交消息
First time build. Skipping changelog.
# 首次构建。正在跳过更改日志。
Finished: SUCCESS
# 完成:成功

1. 配置 SSH

ssh-keygen -t rsa# 在 /root/.ssh/ 目录生成了 私钥 和 公钥
id_rsa		# 私钥文件
id_rsa.pub	# 公钥文件
  • 把 公钥 放在 Gitlab 中:
    以 root 账户登录 > 点击头像 > Settings > SSH Keys
  • 在 Jenkins 中配置私钥:
    添加一个新的凭证,类型为"SSH Username with private key"。

6. Deploy to container 部署

  • 添加 Tomcat 用户凭证
  • Dashboard > Manage Jenkins > Credentials > System > Global credentials (unrestricted)
    在这里插入图片描述

7. Maven Integration 构建 Maven 项目


8. Pipeline 流水线构建


9. Gitlab Hook 和 GitLab 通过 Gitlab 触发


10. SonarQube Scanner 代码审查


11. Publish Over SSH 实现远程发送 Shell 命令

  • 添加远程服务器 Dashboard > Manage Jenkins > System > Publish over SSH
  • master_server
    在这里插入图片描述

  • web_server
    在这里插入图片描述

12. NodeJS 前端打包


13. Email Extension Template 邮箱


1. 系统管理员邮件地址

  • Dashboard > Manage Jenkins > System
  • Jenkins Location > 系统管理员邮件地址
    在这里插入图片描述

2. Extended E-mail Notification

  • Dashboard > Manage Jenkins > System
  • Extended E-mail Notification
    在这里插入图片描述
  1. SMTP Port:默认 25,SSL 加密 465
  2. Default Recipients:默认收件人(回复件)

3. Jenkins 默认邮箱通知

  • Dashboard > Manage Jenkins > System
  • 邮件通知:Jenkins 默认邮箱通知
    在这里插入图片描述

4. 邮箱模版

  • email.html在这里插入图片描述
  1. 更多参数 Dashboard > Manage Jenkins > System
    在这里插入图片描述

5. 发送配置

  • Dashboard > demo_pipeline
  • Declarative Directive Generator > post: Post Stage or Build Conditions
    在这里插入图片描述
post {always {// One or more steps need to be included within each condition's block.}success {// One or more steps need to be included within each condition's block.}failure {// One or more steps need to be included within each condition's block.}
}

  • Dashboard > demo_pipeline > 流水线语法
  • emailext: Extended Email
    在这里插入图片描述
emailext body: '${FILE,path="email.html"}', subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!', to: '443749091@qq.com'

pipeline {agent anystages {stage('拉取代码') { // for display purposessteps {echo '拉取代码'checkout scmGit(branches: [// [name: '*/master'][name: '*/${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: '7b1fce0d-30ea-4351-badc-5fa8751c2c06', url: 'git@192.168.31.110:jenkins/jenkins-admin.git']])}}stage('编译构建') {steps {echo '编译构建'sh 'mvn clean package'sh 'echo ${branch}'}}stage('项目部署') {steps {echo '项目部署wywy'deploy adapters: [tomcat8(credentialsId: '49532328-b2d0-4b35-b11b-069916f89d4d', path: '', url: 'http://192.168.31.17:8888/')], contextPath: null, war: 'target/*.war'}}}post {always {emailext body: '${FILE,path="email.html"}', subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!', to: '443749091@qq.com'}}
}

14. SonarQube Scanner 代码审查


1. SonarQube 安装

  • SonarQube 是一个用于管理代码质量的开放平台,可以快速的定位代码中潜在的或者明显的错误。
  • 目前支持 Java、C#、C/C++、Python、PL/SQL、Cobol、JavaScrip、Groovy 等二十几种编程语言的代码质量管理与检测。
  • SonarQube 官网
  • SonarQube 下载

  • 环境要求:
  1. JDK 1.8
  2. MySQL 5.7(注意版本
  3. SonarQube 6.7.4

  1. 创建 sonar 数据库
  2. 解压 sonar,并设置权限
yum install unzip
# 解压
unzip sonarqube-7.9.6.zip
# 创建目录
mkdir /opt/sonar
# 移动文件
mv sonarqube-7.9.6/* /opt/sonar
# 创建 sonar 用户,必须 sonar 用于启动,否则报错
useradd sonar
# 更改 sonar 目录及文件权限
chown -R sonar. /opt/sonar

2. 修改 sonar 配置文件

vi /opt/sonar/conf/sonar.properties
`
sonar.jdbc.username=test
sonar.jdbc.password=test
sonar.jdbc.url=jdbc:mysql://192.168.31.200:3308/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
`

3. 启动 sonar

cd /opt/sonar
# 启动
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

4. 访问 sonar

  • 访问 sonar
    在这里插入图片描述

  • 49c7e8df43231a98d1f47bf57e503371917a5916
    在这里插入图片描述

5. SonaQube 配置

  • SonaQube 关闭审查结果上传到 SCM 功能
    在这里插入图片描述

6. Jenkins 配置

  • Dashboard > Manage Jenkins > Credentials > System > Global credentials (unrestricted)
    在这里插入图片描述

  • 配置 Dashboard > Manage Jenkins > System
  • SonarQube servers
    在这里插入图片描述
  1. Name:sonarqube-6.7.4
  2. Server URL:http://192.168.31.110:9000
  3. Server authentication token:49c7e8df43231a98d1f47bf57e503371917a5916

  • 工具 Dashboard > Manage Jenkins > Tools
  • SonarQube Scanner 安装
    在这里插入图片描述
  1. Name:sonarqube-6.7.4

7. 非流水线项目

  • 增加构建步骤 Execute SonarQube Scanner
    在这里插入图片描述
  1. Task to run:scan
  2. JDK:选择 JDK 工具
  3. Path to project properties:项目属性的路径
  4. Analysis properties:分析属性

  • Execute SonarQube Scanner
    在这里插入图片描述
# must be unique in a given SonarQube instance
sonar.projectKey=jenkins-admin
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=jenkins-admin
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=1.8
sonar.java.target=1.8# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8sonar.java.binaries=./target/classes

  • SonarQube
    在这里插入图片描述

8. 流水线项目

  • sonar-project.properties
    在这里插入图片描述

  • Jenkinsfile
    在这里插入图片描述

15. Extended Choice Parameter 多选框


16. Kubernetes 和 Kubernetes Continuous Deploy


三、Jenkins 工具


1. JDK

  • Dashboard > Manage Jenkins > Tools > JDK 安装
    在这里插入图片描述

2. Maven


1. 安装 Maven

# 解压
tar -xzf apache-maven-3.6.2-bin.tar.gz
# 创建目录
mkdir -p /opt/maven
# 移动文件
mv apache-maven-3.6.2/* /opt/mavenvi /etc/profile
`
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk export MAVEN_HOME=/opt/maven export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
`
# 配置生效
source /etc/profile
# 查找 Maven 版本
mvn -v
<localRepository>/root/repo</localRepository><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf>
</mirror>

2. 配置 Maven

  • Dashboard > Manage Jenkins > Tools > Maven > Maven 安装
    在这里插入图片描述

3. Tomcat


1. 安装 Tomcat

# 安装JDK
yum install java-1.8.0-openjdk* -y
# 解压
tar -xzf apache-tomcat-8.5.47.tar.gz
# 创建目录
mkdir -p /opt/tomcat
# 移动文件
mv /root/apache-tomcat-8.5.47/* /opt/tomcat
# 启动 tomcat
/opt/tomcat/bin/startup.sh

2. 配置 Tomcat 用户角色权限

  • http://127.0.0.1:8080/在这里插入图片描述

  • 用户及权限 /opt/tomcat/conf/tomcat-users.xml
  1. 用户名:tomcat
  2. 密码:tomcat
<tomcat-users><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,manager-script,tomcat,admin-gui,admin-script"/>
</tomcat-users>

  • 注释这行配置 /opt/tomcat/webapps/manager/META-INF/context.xml
<!--<Valve className="org.apache.catalina.valves.RemoteAddrValve"allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->

  • 重启
# 停止
/opt/tomcat/bin/shutdown.sh# 启动
/opt/tomcat/bin/startup.sh

  • 访问 http://127.0.0.1:8888/manager/html
    在这里插入图片描述

4. NodeJS

  • Dashboard > Manage Jenkins > Tools > NodeJS 安装
    在这里插入图片描述

yum install epel-releasenpm install -g yarn

四、Jenkins 全局属性


1. JAVA_HOME

2. M2_HOME

3. PATH+EXTRA

  • Dashboard > Manage Jenkins > System > Environment variables
  1. JAVA_HOME
  2. M2_HOME
  3. PATH+EXTRA
    在这里插入图片描述

五、Jenkins 项目构建

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

1. 自由风格项目构建


1. 新建项目

  • Dashboard > All
    在这里插入图片描述

2. 动态参数

  • Dashboard > demo_pipeline > Configuration > General
  • This project is parameterized
    在这里插入图片描述
  1. Boolean Parameter:Boolean 参数
  2. Choice Parameter:选择参数
  3. Credentials Parameter:凭据参数
  4. File Parameter:文件参数
  5. Multi-line String Parameter:
  6. Password Parameter:密码参数
  7. Run Parameter:
  8. String Parameter:字符串参数

  • Dashboard > demo_pipeline
    在这里插入图片描述
    v1:指定分支名

  • ${branch}:获取分支参数
    在这里插入图片描述

3. 配置源码管理(Git 插件)

  • Dashboard > dev > Configuration > 源码管理在这里插入图片描述

4. 添加构建步骤

  • Dashboard > dev > Configuration > Build Steps
    在这里插入图片描述
  • Execute shell
    在这里插入图片描述
echo "开始编译和打包" 
mvn clean package 
echo "编译和打包结束"

5. 添加构建后操作

  • Dashboard > dev > Configuration > 构建后操作在这里插入图片描述

1. 构建 War 项目(Deploy to container 插件)
  • Deploy war/ear to a container(Deploy to container 插件)在这里插入图片描述
  1. WAR/EAR files:target/*.war 正则匹配 target 目录
  2. Tomcat 8.x Remote:配置 Tomcat 工具
  1. Credentials:凭证
  2. Tomcat URL:部署

2. 构建 Jar 项目(Publish Over SSH 插件)
  • Send build artifacts over SSH(Publish Over SSH 插件)
    在这里插入图片描述
  1. SSH Server:远程服务器
  2. Source files:target/*.jar 正则匹配 target 目录
  3. Remove prefix:移除 target/ 前缀
  4. Exec command:执行的命令

echo "开始部署"
source /etc/profile
cd /root/TOOL
echo 最新构建时间 $(date) >> build.log
echo $(date +%Y%m%d) >> build_time.log
sh start.sh
echo "结束部署" 
#!/bin/bash
set -e
# 远程服务器地址
SERVER_ADDRESS="192.168.1.100"
# 远程服务器登录用户名
USERNAME="your_ssh_username"
# 远程服务器登录密码
PASSWORD="your_ssh_password"
# 远程服务器 JAR 包部署路径
REMOTE_PATH="/opt/myapp/"
# 本地 JAR 包路径
LOCAL_PATH="target/myapp.jar"# 将 JAR 包复制到远程服务器
echo "Copying JAR file to remote server..."
sshpass -p ${PASSWORD} scp -o StrictHostKeyChecking=no ${LOCAL_PATH} ${USERNAME}@${SERVER_ADDRESS}:${REMOTE_PATH}# 启动远程服务器上的应用
echo "Starting application on remote server..."
sshpass -p ${PASSWORD} ssh -o StrictHostKeyChecking=no ${USERNAME}@${SERVER_ADDRESS} "cd ${REMOTE_PATH} && java -jar myapp.jar"

2. Maven 项目构建(Maven Integration 插件)


1. 新增项目

  • Dashboard > All(Maven Integration 插件)在这里插入图片描述

2. 构建

  • Dashboard > demo_maven > Configuration > Build在这里插入图片描述
  1. Root POM:指定 pom.xml 文件的路径
  2. Goals and options:输入 Maven 命令(注意不用写 mvn)

3. Pipeline 流水线项目构建(Pipeline 插件)

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

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

  • 如何创建 Jenkins Pipeline 呢?
  1. Pipeline 脚本是由 Groovy 语言实现的,但是我们没必要单独去学习 Groovy。
  2. Pipeline 支持两种语法:
  1. Declarative(声明式语法)。
  2. Scripted Pipeline(脚本式语法)。
  1. Pipeline 也有两种创建方法:
  1. 可以直接在 Jenkins 的 Web UI 界面中输入脚本。
  2. 也可以通过创建一个 Jenkinsfile 脚本文件放入项目源码库中。
    一般我们都推荐在 Jenkins 中直接从源代码控制(SCM),中直接载入 Jenkinsfile Pipeline 这种方法。

1. 新建项目

  • Dashboard > All(Pipeline 插件)
    在这里插入图片描述

2. 流水线

  • Dashboard > demo_pipeline > Configuration > 流水线
  • Pipeline script > Hello World
pipeline {agent any/*stages:代表整个流水线的所有执行阶段。通常 stages 只有1个,里面包含多个 stage。*/stages {/*stage:代表流水线中的某个阶段,可能出现 n 个。一般分为 拉取代码,编译构建,部署 等阶段。*/stage('Hello') {/*steps:代表一个阶段内需要执行的逻辑。steps 里面是 shell 脚本,git 拉取代码,ssh 远程发布 等任意内容。*/steps {echo 'Hello World'}}}
}

1. Pipeline script 界面编写脚本

1. Declarative 声明式 Pipeline
  • Pipeline script > Hello World
pipeline {agent any stages {stage('拉取代码') {steps {echo '拉取代码'}}stage('编译构建') {steps {echo '编译构建'}}stage('项目部署') {steps {echo '项目部署'}}}}

  • Dashboard > demo_pipeline > #3 > 流水线步骤
  • 显示没步的耗时。
    在这里插入图片描述

2. Scripted Pipeline 脚本式 Pipeline
  • Pipeline script > Scripted Pipeline
node {def mvnHome stage('拉取代码') { // for display purposes echo '拉取代码'}stage('编译构建') {echo '编译构建'}stage('项目部署') {echo '项目部署'}
}

3. 拉取代码
  • Dashboard > demo_pipeline > 流水线语法
  • checkout: Check out from version control
    在这里插入图片描述
  1. War
checkout scmGit(branches: [[name: '*/master']
], extensions: [], userRemoteConfigs: [[credentialsId: '7b1fce0d-30ea-4351-badc-5fa8751c2c06', url: 'git@192.168.31.110:jenkins/jenkins-admin.git']
])

  1. Jar
checkout scmGit(branches: [[name: '*/master']
], extensions: [], userRemoteConfigs: [[credentialsId: '7b1fce0d-30ea-4351-badc-5fa8751c2c06', url: 'git@192.168.31.110:jenkins/jenkins-jar.git']
])

  1. Web
checkout scmGit(branches: [[name: '*/master']
], extensions: [], userRemoteConfigs: [[credentialsId: '7b1fce0d-30ea-4351-badc-5fa8751c2c06', url: 'git@192.168.31.110:jenkins/jenkins-web.git']
])

4. 编译构建
  • Dashboard > demo_pipeline > 流水线语法
  • sh: Shell Script
    在这里插入图片描述

  1. War、Jar
sh 'mvn clean package'

  1. Web
sh '''yarn install
yarn build'''

5. 项目部署 War
  • Dashboard > demo_pipeline > 流水线语法
  • deploy: Deploy war/ear to a container
    在这里插入图片描述
  1. Add Container:可以配置多个容器(集群部署)。
deploy adapters: [tomcat8(credentialsId: '49532328-b2d0-4b35-b11b-069916f89d4d', path: '', url: 'http://192.168.31.17:8888/')], contextPath: null, war: 'target/*.war'

6. 项目部署 Jar
  • Dashboard > demo_pipeline > 流水线语法
  • sshPublisher: Send build artifacts over SSH
    在这里插入图片描述
sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''echo "开始部署"source /etc/profilecd /root/TOOLecho 最新构建时间 $(date) >> build.logecho $(date +%Y%m%d) >> build_time.logsh start.shecho "结束部署" ''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'target/', sourceFiles: 'target/*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]
)

7. 项目部署 Web
  • Dashboard > demo_pipeline > 流水线语法
  • sshPublisher: Send build artifacts over SSH
    在这里插入图片描述
sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/usr/share/nginx/html', remoteDirectorySDF: false, removePrefix: 'dist', sourceFiles: 'dist/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)
])

8. 完整的声明式
pipeline {agent any stages {stage('拉取代码') {steps {checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '7b1fce0d-30ea-4351-badc-5fa8751c2c06', url: 'git@192.168.31.110:jenkins/jenkins-admin.git']]])}}stage('编译构建') {steps {sh label: '', script: 'mvn clean package'}}stage('项目部署') {steps {deploy adapters: [tomcat8(credentialsId: 'afc43e5e-4a4e-4de6-984f- b1d5a254e434', path: '', url: 'http://192.168.31.17:8888')], contextPath: null, war: 'target/*.war'}}}
}

9. 完整的脚本式
  1. War
node {def mvnHome stage('拉取代码') { // for display purposes echo '拉取代码'checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '7b1fce0d-30ea-4351-badc-5fa8751c2c06', url: 'git@192.168.31.110:jenkins/jenkins-admin.git']])}stage('编译构建') {echo '编译构建'sh 'mvn clean package'}stage('项目部署') {echo '项目部署'deploy adapters: [tomcat8(credentialsId: '49532328-b2d0-4b35-b11b-069916f89d4d', path: '', url: 'http://192.168.31.17:8888/')], contextPath: null, war: 'target/*.war'}
}

  1. Jar
node {def mvnHome stage('拉取代码') { // for display purposes echo '拉取代码'checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '7b1fce0d-30ea-4351-badc-5fa8751c2c06', url: 'git@192.168.31.110:jenkins/jenkins-jar.git']])}stage('编译构建') {echo '编译构建'sh 'mvn clean package'}stage('项目部署') {echo '项目部署'sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''echo "开始部署"source /etc/profilecd /root/TOOLecho 最新构建时间 $(date) >> build.logecho $(date +%Y%m%d) >> build_time.logsh start.shecho "结束部署" ''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'target/', sourceFiles: 'target/*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}
}

  1. Web
node {def mvnHome stage('拉取代码') { // for display purposes echo '拉取代码'checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '7b1fce0d-30ea-4351-badc-5fa8751c2c06', url: 'git@192.168.31.110:jenkins/jenkins-web.git']])}stage('编译构建') {echo '编译构建'sh '''yarn installyarn build'''}stage('项目部署') {echo '项目部署'sshPublisher(publishers: [sshPublisherDesc(configName: 'web_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/usr/share/nginx/html', remoteDirectorySDF: false, removePrefix: 'dist', sourceFiles: 'dist/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}
}

2. Pipeline script from SCM 版本控制脚本
  • 上面直接在 Jenkins 的 UI 界面编写 Pipeline 代码,这样不方便脚本维护,建议把 Pipeline 脚本放在项目中(一起进行版本控制)。

1. 在项目根目录建立 Jenkinsfile 文件,把内容复制到该文件中
  • 把 Jenkinsfile 上传到 Gitlab在这里插入图片描述

2. 在项目中引用该文件
  • Dashboard > demo_pipeline > Configuration > 流水线
  • Pipeline script from SCM在这里插入图片描述

  • Dashboard > demo_pipeline > #5 > 流水线步骤
    在这里插入图片描述


http://www.mrgr.cn/p/40820288

相关文章

java实现文件下载

1.文件上传 文件上传&#xff0c;也称为upload&#xff0c;是指将本地图片、视频、音频等文件上传到服务器上&#xff0c;可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛&#xff0c;我们经常发微博、发微信朋友圈都用到了文件上传功能。 import com.itheima.…

前端Web实战:从零打造一个类Visio的流程图拓扑图绘图工具

前言 大家好&#xff0c;本系列从Web前端实战的角度&#xff0c;给大家分享介绍如何从零打造一个自己专属的绘图工具&#xff0c;实现流程图、拓扑图、脑图等类Visio的绘图工具。 你将收获 免费好用、专属自己的绘图工具前端项目实战学习如何从0搭建一个前端项目等基础框架项…

spring6——容器

文章目录 容器&#xff1a;IocIoc容器控制反转&#xff08;Ioc&#xff09;依赖注入IoC容器在Spring的实现 基于XML管理Bean搭建环境获取bean依赖注入setter注入构造器注入特殊值处理字面量赋值null值xml实体CDATA节 特殊类型属性注入为对象类型属性赋值方式一&#xff1a;引入…

音频开发-小程序和H5

微信录音 1、引入sdk 2、录音操作 浏览器录音 参考文献&#xff1a;前端H5实现调用麦克风&#xff0c;录音功能_h5 录音_Darker丨峰神的博客-CSDN博客 function record() { window.navigator.mediaDevices.getUserMedia({ audio: { sampleRate: 44100, // 采样率 channelCount…

【软件安装】MATLAB_R2021b for mac 安装

Mac matlab_r2021b 安装 下载链接&#xff1a;百度网盘 下载链接中所有文件备用。 我所使用的电脑配置&#xff1a; Macbook Pro M1 Pro 16512 系统 macOS 13.5 安装步骤 前置准备 无此选项者&#xff0c;自行百度 “mac 任何来源”。 1 下载好「MATLAB R2021b」安装文…

Leetcode-每日一题【剑指 Offer 56 - I. 数组中数字出现的次数】

题目 一个整型数组 nums 里除两个数字之外&#xff0c;其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)&#xff0c;空间复杂度是O(1)。 示例 1&#xff1a; 输入&#xff1a;nums [4,1,4,6]输出&#xff1a;[1,6] 或 [6,1] 示例 2&#x…

计算机网络——传输层

文章目录 **1 传输层提供的服务****1.1 传输层的功能****1.2 传输层的寻址与端口** **2 UDP协议****2.1 UDP数据报****2.2 UDP校验** **3 TCP协议****3.1 TCP协议的特点****3.2 TCP报文段****3.3 TCP连接管理****3.4 TCP可靠传输****3.5 TCP流量控制****3.6 TCP拥塞控制** 1 传…

Verilog语法学习——LV4_移位运算与乘法

LV4_移位运算与乘法 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 题目描述&#xff1a; 已知d为一个8位数&#xff0c;请在每个时钟周期分别输出该数乘1/…

Spring Security 构建基于 JWT 的登录认证

一言以蔽之&#xff0c;JWT 可以携带非敏感信息&#xff0c;并具有不可篡改性。可以通过验证是否被篡改&#xff0c;以及读取信息内容&#xff0c;完成网络认证的三个问题&#xff1a;“你是谁”、“你有哪些权限”、“是不是冒充的”。 为了安全&#xff0c;使用它需要采用 …

HTTP、HTTPS协议详解

文章目录 HTTP是什么报文结构请求头部响应头部 工作原理用户点击一个URL链接后&#xff0c;浏览器和web服务器会执行什么http的版本持久连接和非持久连接无状态与有状态Cookie和Sessionhttp方法&#xff1a;get和post的区别 状态码 HTTPS是什么ssl如何搞到证书nginx中的部署 加…

2023 蓝桥杯真题B组 C/C++

https://www.dotcpp.com/oj/train/1089/ 题目 3150: 蓝桥杯2023年第十四届省赛真题-冶炼金属 题目描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V&#xff0c;V 是一个正整数&#xff0c;这意味着消耗 V 个普通金 属 O…

react-native 输入框 被软键盘遮挡 (KeyboardAvoidingView)

本组件用于解决一个常见的尴尬问题&#xff1a;手机上弹出的键盘常常会挡住当前的视图。本组件可以自动根据键盘的高度&#xff0c;调整自身的 height 或底部的 padding&#xff0c;以避免被遮挡。 <KeyboardAvoidingViewbehavior{Platform.OS ios ? padding : height}key…

【点云处理教程】02从 Python 中的深度图像估计点云

一、说明 这是“点云处理”教程的第二篇文章。“点云处理”教程对初学者友好&#xff0c;我们将在其中简单地介绍从数据准备到数据分割和分类的点云处理管道。在本教程中&#xff0c;我们将学习如何在不使用 Open3D 库的情况下从深度图像计算点云。我们还将展示如何优化代码以获…

【VUE】解决图片视频加载缓慢/首屏加载白屏的问题

1 问题描述 在 Vue3 项目中&#xff0c;有时候会出现图片视频加载缓慢、首屏加载白屏的问题 2 原因分析 通常是由以下原因导致的&#xff1a; 图片或视频格式不当&#xff1a;如果图片或视频格式选择不当&#xff0c;比如选择了无损压缩格式&#xff0c;可能会导致文件大小过大…

微信小程序交易体验分常见问题指引

小程序交易体验分是为保障小程序用户的交易体验&#xff0c;促进开发者向用户提供更好的服务&#xff0c;帮助开发者更好的评估自身服务水平的机制。平台将对开发者在其小程序的违规行为进行判定&#xff0c;根据违规行为的严重程度对该小程序扣减不同分值的交易体验分&#xf…

风靡朋友圈的妙鸭相机,到底用了哪些底层技术?

不知道大家近期的朋友圈有没有被和海马体、天真蓝如出一辙的AI写真刷屏&#xff01; 这些面若桃花、精致到头发丝、光影充满氛围感的写真都是一款叫“妙鸭相机”的小程序生成的&#xff01;只要9.9&#xff0c;就能体验999写真&#xff01; 虽然只要9.9&#xff0c;但生成的照片…

opencv-24 图像几何变换03-仿射-cv2.warpAffine()

什么是仿射&#xff1f; 仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够 保持图像的平直性和平行性。平直性是指图像经过仿射变换后&#xff0c;直线仍然是直线&#xff1b;平行性是指 图像在完成仿射变换后&#xff0c;平行线仍然是平行线。…

海康摄像头开发笔记(一):连接防爆摄像头、配置摄像头网段、设置rtsp码流、播放rtsp流、获取rtsp流、调优rtsp流播放延迟以及录像存储

文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/131679108 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

服务器 Docker Alist挂载到本地磁盘(Mac版)夸克网盘

1.服务器下载alist 默认有docker环境 docker pull xhofe/alist2.生成容器 -v /home/alist:/opt/alist/data 这段意思是alist中的数据映射到docker 主机的文件夹&#xff0c;/home/alist就是我主机的文件夹&#xff0c;这个文件夹必须先创建 docker run -d --restartalways…

【Python】数据分析+数据挖掘——探索Pandas中的数据筛选

1. 前言 当涉及数据处理和分析时&#xff0c;Pandas是Python编程语言中最强大、灵活且广泛使用的工具之一。Pandas提供了丰富的功能和方法&#xff0c;使得数据的选择、筛选和处理变得简单而高效。在本博客中&#xff0c;我们将重点介绍Pandas中数据筛选的关键知识点&#xff…