1. 安装最新长期稳定版 2.426.1
Redhat Jenkins Packages
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
yum install -y fontconfig java-11
yum -y install jenkins-2.426.1-1.1.noarch
systemctl enable jenkins
systemctl start jenkins
2. 本地hosts文件解析域名
10.0.0.72 jenkins.tom.com
3. 浏览器访问jenkins.tom.com:8080
[root@jenkins tools]# cat /var/lib/jenkins/secrets/initialAdminPassword
c7c62614a5d74aefae2966ceff362e4a
4. 更改密码
5. 安装插件
安装方式有2种:
1.在线搜索需要的插件进行安装
2.离线安装,把已有的.jpi文件复制到 /var/lib/jenkins/plugins/ 目录下,然后重启Jenkins即可。
用这种方式既可以批量安装插件,安装时又可以忽视插件之间的关联性。若依赖的插件不存在或者存在版本问题,则重启之后会在Manage Jenkins中进行提示,根据提示逐一解决问题即可。如果需要对Jenkins的插件配置进行迁移,直接将plugins文件目录直接替换即可,或者将.jpi复制过去之后直接重启Jenkins即可。
[root@jenkins yum.repos.d]# ll /var/lib/jenkins/plugins/
drwxr-xr-x 4 jenkins jenkins 56 Jul 12 14:35 bouncycastle-api
-rw-r--r-- 1 jenkins jenkins 8853632 Jul 12 14:35 bouncycastle-api.jpi
drwxr-xr-x 4 jenkins jenkins 56 Jul 12 14:35 instance-identity
-rw-r--r-- 1 jenkins jenkins 18216 Jul 12 14:35 instance-identity.jpi
drwxr-xr-x 4 jenkins jenkins 56 Jul 12 14:35 javax-activation-api
-rw-r--r-- 1 jenkins jenkins 77217 Jul 12 14:35 javax-activation-api.jpi
drwxr-xr-x 4 jenkins jenkins 56 Jul 12 14:35 javax-mail-api
-rw-r--r-- 1 jenkins jenkins 632494 Jul 12 14:35 javax-mail-api.jpi
drwxr-xr-x 5 jenkins jenkins 68 Jul 12 14:29 locale
-rw-r--r-- 1 jenkins jenkins 13518 Jul 12 14:29 locale.jpi
drwxr-xr-x 4 jenkins jenkins 56 Jul 12 14:35 localization-support
-rw-r--r-- 1 jenkins jenkins 24084 Jul 12 14:35 localization-support.jpi
drwxr-xr-x 5 jenkins jenkins 70 Jul 12 14:35 localization-zh-cn
-rw-r--r-- 1 jenkins jenkins 569475 Jul 12 14:35 localization-zh-cn.jpi
6. jenkins汉化插件安装
1、主要安装如下插件:Locale、Localization: Chinese (Simplified)
Manage Jenkins --> Manage Plugins --> Available,搜索上面2个插件安装即可
2.重启jenkins,systemctl restart jenkins
7. 常用插件安装
git,git parameter,git hub,gitlab,ansible,docker,maven,Workspace Cleanup
8. 案例:创建一个项目
为了方便jenkins进行操作与管理各种节点,避免出现权限问题。这里把jenkins运行用户改为root
]# egrep "User|Group" /usr/lib/systemd/system/jenkins.service
User=root
Group=root]# systemctl daemon-reload
[root@jenkins yum.repos.d]# systemctl restart jenkins
项目目标:
通过运行jenkins 任务
提示我们进行:
选择
dev #开发环境
prod #生产环境
把选择结果放在变量中choose。
jenkins执行脚本
case "$choose" in
DEV) echo "部署到测试环境" ;;
PROD) echo "部署到生产环境" ;;
esac
echo "当前用户:`whoami`"
echo "当前路径: `pwd`"
9. 案例:拉取gitlab仓库代码,根据分支进行拉取代码
10. job内置变量
10.1. jenkins job有一些自带的环境变量,在配置中可以直接引用,这里列出基础参数。
BUILD_NUMBER:当前构建号,如1
BUILD_ID:构建的id编号,一般可为构建号,也可是时间戳(需添加时间戳插件,开启时间记录)
JOB_NAME:当前job名称 如: job-04-game-auto-webhook
BUILD_TAG:本次构建记录,一般标记为jenkins-{JOB_NAME}−{BUILD_NUMBER}
EXECUTOR_NUMBER:执行者编号,在“build executor status”中看到的数字
NODE_NAME:运行的节点名称
NODE_LABELS:运行的节点标签名称
WORKSPACE:job的工作区地址 如:/var/lib/jenkins/workspace/job-04-game-auto-webhook
HUDSON_URL:jenkins的url,如:http://jenkins.tom.com/
JOB_URL:job的url,如:http://jenkins.tom.com/job/job-04-game-auto-webhook/
BUILD_URL:构建记录的url,如:http://jenkins.tom.com/job/job-04-game-auto-webhook/7/ ,形式为 http://ip:端口/job/{JOB_NAME}/${BUILD_NUMBER}
10.2. 也可以安装Build Environment插件,可以通过查看历史构建记录得知本次构建的所有参数)
10.3. 如需查看系统环境变量,可在系统管理-系统属性中查询。
11. 案例:拉取gitlab仓库代码,根据tag标签拉取代码
这里jenkins做了免密登录web服务器,以实现代码推送到web服务器
ssh-keygen
ssh-copy-id root@web
ssh root@10.0.0.8 "mkdir -p /app/code-back"
dirname="/app/code-back/game-${git_tag}"
scp -o StrictHostKeyChecking=no -r ${WORKSPACE} root@10.0.0.8:$dirname
ssh -o StrictHostKeyChecking=no root@10.0.0.8 "rm -rf /app/code/game"
ssh -o StrictHostKeyChecking=no root@10.0.0.8 "ln -s $dirname /app/code/game"
如果不选参数,会报错
12. 案例:代码上传到测试分支,自动触发jenkins构建部署
注意:不可用于生产环境,如果代码故障会导致生产环境故障
步骤:
- jenkins添加gitlab插件
- jenkins创建钩子令牌认证
- gitlab配置jenkins钩子和令牌
- 向gitlab提交代码
12.1. 需要gitlab允许来自钩子和服务的对本地网络的请求,否则会报错误
12.2. jenkins URL设置,否则一会webhook的url是带8080的
12.3. 先记录下刚才jenkins生成的两个数据,gitlab会用
webhook url: http://jenkins.tom.com/project/job-04-game-auto-webhook
Secret token: 1b061a9f1fa423f086b72882863d5132
12.4. gitlab新建钩子,加上jenkins的webhook地址
看到上面错误,不一定是真的无法完成构建,这里采用手动推送来试试,发现可以触发jenkins构建的。
13. 案例:java项目编译部署
13.1. jenkins服务器安装maven
cd /app/tools
wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
ln -s apache-maven-3.8.8 maven
echo 'export PATH=/app/tools/maven/bin/:$PATH' >> /etc/profile
source /etc/profile
]# mvn --version
Apache Maven 3.8.8 (4c87b05d9aedce574290d1acc98575ed5eb6cd39)
Maven home: /app/tools/maven
Java version: 11.0.8, vendor: N/A, runtime: /usr/lib/jvm/java-11-openjdk-11.0.8.10-1.el7.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"
13.2. 配置maven仓库地址
vim maven/conf/settings.xml</mirrors><mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>http://maven.aliyun.com/repository/public</url></mirror></mirrors>
13.3. jenkins全局工具配置里面添加maven路径
项目代码:
从gitee克隆一份代码(链接)到本地,然后在自己的gitlab仓库中新建一个项目,把代码上传到仓库
然后jenkins开始创建一个maven job
10.0.0.8上面是web服务器,上面安装了tomcat和jdk,构建完成后,访问10.0.0.8:8080可以可以看到项目已部署成功
14. 案例:java项目编译推送至docker仓库,然后在web服务器运行docker容器
14.1. 步骤:
- 代码上传至gitlab
- 书写测试dockerfile(只需要代码+docker环境即可)
- jenkins创建任务
-
- 拉取代码
- 执行构建,shell命令(docker build,docker push)
- web机器docker run 镜像
- 检测结果
14.2. 环境
gitlab | 10.0.0.71 |
jenkins | 10.0.0.72 |
web1 | 10.0.0.7 |
web2 | 10.0.0.8 |
docker harbor | 10.0.0.81 |
14.3. jenkins 10.0.0.72 机器安装docker,并配置docker仓库地址
#1.安装相关依赖.
yum install -y yum-utils device-mapper-persistent-data lvm2
#2.下载官方的docker yum源文件
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#3.替换yum源地址
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#4.安装docker-ce
yum makecache fast
yum -y install docker-ce docker-compose
systemctl enable --now docker mkdir -p /etc/docker
tee /etc/docker/daemon.json <<'EOF'
{"registry-mirrors": ["https://bjjtv7cs.mirror.aliyuncs.com"],"insecure-registries": ["harbor.tom.cn"]
}
EOF
systemctl daemon-reload
systemctl restart docker
14.4. docker harbor 安装docker-ce ,docker-compose,harbor
#----------------------------------------------------------------------------------
#1.安装相关依赖.
yum install -y yum-utils device-mapper-persistent-data lvm2
#2.下载官方的docker yum源文件
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#3.替换yum源地址
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#4.安装docker-ce
yum makecache fast
yum -y install docker-ce docker-compose
systemctl enable --now docker mkdir -p /etc/docker
tee /etc/docker/daemon.json <<'EOF'
{"registry-mirrors": ["https://bjjtv7cs.mirror.aliyuncs.com"],"insecure-registries": ["harbor.tom.cn"]
}
EOF
systemctl daemon-reload
systemctl restart docker#----------------------------------------------------------------------------------
mkdir -p /app/tools/
cd /app/tools/
wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz
tar -xvf harbor-offline-installer-v2.11.0.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml
#----------------------------------------------------------------------------------
vim harbor.yml
#修改域名
hostname: harbor.tom.cn#注释掉证书配置
#https:
# # https port for harbor, default is 443
# port: 443
# # The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path#修改登录密码
harbor_admin_password: Admin
#----------------------------------------------------------------------------------
./install.sh
#注意要检查80是否被占用
提示successfully
? ----Harbor has been installed and started
successfully.----
#----------------------------------------------------------------------------------
14.5. 把代码上传到自己的gitlab仓库
源码:git clone zhrzzzzzzzzz/bird
14.6. web1和web2安装docker,并配置仓库地址(参照jenkins安装docker的过程)
14.7. jenkins新建项目
docker build -t harbor.tom.cn/prod/nginx_bird:${git_tag} .
docker login -uadmin -padmin harbor.tom.cn
docker push harbor.tom.cn/prod/nginx_bird:${git_tag}
#部署
ansible -i /server/ansible/hosts web -m shell -a"\
docker rm -f bird; \
docker rmi harbor.tom.cn/prod/nginx_bird:${git_tag}; \
docker login -uadmin -padmin harbor.tom.cn; \
docker run -d --name bird -p 80:80 harbor.tom.cn/prod/nginx_bird:${git_tag}"
这里有个问题,如果同样的tag,被推送到harbor仓库以后,再次推送的是推不上相同的tag的,只能删除
这里提供如下方案,在push前,把相同tag的镜像从仓库里删除,再进行推送
HARBOR_URL="harbor.tom.cn"
PROJECT="prod"
REPOSITORY="nginx_bird"
USER="admin"
PASSWORD="admin"
curl -s -X DELETE "http://${HARBOR_URL}/api/v2.0/projects/${PROJECT}/repositories/${REPOSITORY}/artifacts/${git_tag}/tags/${git_tag}" -u "$USER:$PASSWORD"
docker build -t ${HARBOR_URL}/${PROJECT}/${REPOSITORY}:${git_tag} .
docker login -uadmin -padmin ${HARBOR_URL}
docker push ${HARBOR_URL}/${PROJECT}/${REPOSITORY}:${git_tag}
#部署
ansible -i /server/ansible/hosts web -m shell -a"\
docker rm -f bird; \
docker rmi ${HARBOR_URL}/${PROJECT}/${REPOSITORY}:${git_tag}; \
docker login -u$USER -p$PASSWORD ${HARBOR_URL}; \
docker run -d --name bird -p 80:80 ${HARBOR_URL}/${PROJECT}/${REPOSITORY}:${git_tag}"
15. jenkins引入安全扫描工具sonarqube
sonarqube服务器:10.0.0.73,下面安装的软件都是在这台机器安装
15.1. jdk1.8安装
yum -y install java
15.2. 安装依赖
yum install git java unzip wget -y
15.3. 安装mysql 5.7
yum install -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
yum install -y mysql-community-server
systemctl start mysqld
]# grep -i password /var/log/mysqld.log
2024-07-16T06:21:23.103934Z 1 [Note] A temporary password is generated for root@localhost: *PpB&()jE0<a
mysql -uroot -p"*PpB&()jE0<a"
mysql> alter user root@localhost identified by '新密码';#创建数据库及用户
mysql> create database sonarqube charset utf8;
mysql> grant all on sonarqube.* to 'sonarqube'@'localhost' identified by 'Sonar123...';
15.4. sonarqube安装
cd /app/tools
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.7.zip
unzip sonarqube-7.7.zip
ln -s sonarqube-7.7 sonar
useradd sonar
chown -R sonar.sonar /app/tools/sonar/
#修改配置文件
]# egrep -v '^$|^#' sonar/conf/sonar.properties
sonar.jdbc.username=sonarqube
sonar.jdbc.password=Sonar123...
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
#启动sonarqube
]# su - sonar -c '/app/tools/sonar/bin/linux-x86-64/sonar.sh start'
Starting SonarQube...
Started SonarQube.
15.5. 访问sonarqube界面 http://sonar.tom.cn:9000
点击login,输入用户名:admin 用户密码:admin
windows本地做host解析
10.0.0.73 sonar.tom.cn
15.6. sonarqube汉化
rm -rf sonar/extensions/plugins/
tar -xvf sonarqube_7.7.plugins_new.tar.gz -C ./sonar/extensions/
]# su - sonar -c '/app/tools/sonar/bin/linux-x86-64/sonar.sh restart'
Stopping SonarQube...
Stopped SonarQube.
Starting SonarQube...
Started SonarQube.
15.7. sonarqube新建一个项目,创建token,复制用于扫描java的maven命令
mvn sonar:sonar \-Dsonar.projectKey=test \-Dsonar.projectName=test \-Dsonar.host.url=http://sonar.tom.cn:9000 \-Dsonar.login=06fd5a5f31971847aa7c3caab9a87ee378a83c41
15.8. jenkins项目中调用sonarqube扫描
16. jenkins分布式
背景:
jenkins服务器上运行maven编译,ansible(执行剧本),docker build(构建镜像) ,jenkins慢了.
解决:
把一些功能拆分出去. 运行指定任务的时候指定这个新的(jenkins)节点即可.
16.1. 案例:拆分docker功能
目标:未来我们的任务中只要有docker build相关操作就交给对应docker节点.
16.1.1. 添加节点 :
- 准备节点上安装jdk/jre环境. yum install -y java-11
- web页面添加节点 Dashbord-->系统管理-->节点管理(Clouds)
16.1.2. 创建任务并绑定到指定节点中
注意:拉取代码会被拉到新建的节点机器上,shell部分的操作命令全都会在新节点上运行,就相当于jenkins让新节点干活了,所以新节点上要部署ansible,否则编译会报错
17. jenkins权限控制rbac认证
17.1. 安装插件
Role-based Authorization Strategy
Matrix Authorization Strategy
17.2. 启用rbac的认证
17.3. 配置权限
在系统管理页面点击Manage and Assign Roles进入角色管理页面:
17.4. 管理角色(manager roles)
选择该项可以创建全局角色、项目角色,并可以为角色分配权限
全局角色(Global roles)与项目角色(item roles)的区别就是,项目角色只能管理项目,没有管理jenkins的权限配置,全局角色适用于Jenkins中的任何项目,并覆盖您在项目角色中指定的任何内容。也就是说,当您在全局角色中为角色指定job read权限时,无论您在项目角色中指定什么,该角色都可以读取所有作业。在全局角色中提供job create将允许创建任何名称的作业。
添加项目角色时,需要指定匹配项目的模式,官方文档介绍该选项支持正则表达式,
"Roger-." 表示所有以Roger-开头的项目,
"(?i)roger-.*" 表示以roger-开头的项目并且不区分大小写,
"ABC|ABC.*",ABC开头的项目可以配置为“
"abc|bcd|efg" 直接匹配多个项目
"aa[^abc].*" 匹配以aa开头并且不包括abc的字符串:
全局角色:
OPS: 运维人员权限
项目角色:
上面根据项目,每个项目建立了2组角色,一个是开发用,一个测试用
DEV-DEV: DEV环境 开发人员权限
DEV-SIT: DEV环境 测试人员权限
PROD-DEV: PROD环境 开发人员权限
PROD-SIT: PROD环境 测试人员权限
17.5. 新建用户:
OPS-01
DEV-01
SIT-01
17.6. 给用户分配角色(assign roles)
18. jenkins pipeline
安装插件:Pipeline: Stage View Plugin,Pipeline Stage View
pipeline流水线:通过jenkins的工作框架,通过代码的方式,将多个任务联合起来
流水线优点:
- 模块化
- 方便检查
- 方便排错
- 整体运行流程清晰
18.1. pipeline代码书写格式
pipeline {agent anyenvironment {host="web1"}stages {stage('1.获取代码') {steps {echo "get code $host"}}stage('2.质量检测') {steps {echo "check code $host"}}stage('3.maven编译') {steps {echo "result code $host"}}}
}
所有代码都放在pipeline层内
agent定义在哪台机器上运行:any,none
environment{} 环境变量=变量值
stages{} 集合一个大项目的结合,用来包含stage子项目
stage{} 单个任务,用来包含steps{}部分
steps{} 用来实现具体动作(命令/脚本)
18.2. 新建一个流水线job
这里可以通过流水线语法生成流水线的部分代码,比如拉取代码等
Git Parameter | Jenkins plugin
Git plugin
pipeline {agent anyparameters {gitParameter branchFilter: 'origin.*/(.*)', defaultValue: 'main', name: 'git_tag', type: 'PT_TAG', useRepository: 'http://gitlab.tom.com/dev/helloworld.git'}stages {stage('1.获取代码') {steps {checkout([$class: 'GitSCM', branches: [[name: "${params.git_tag}"]], extensions: [], userRemoteConfigs: [[credentialsId: 'fc5d2626-f02d-4b07-b709-8c04f8709c57', url: 'http://gitlab.tom.com/dev/helloworld.git']]]) }}stage('2.质量检测') {steps {sh '''/app/tools/maven/bin/mvn sonar:sonar \-Dsonar.projectKey=${JOB_BASE_NAME} \-Dsonar.projectName=${JOB_BASE_NAME} \-Dsonar.host.url=http://sonar.tom.cn:9000 \-Dsonar.login=06fd5a5f31971847aa7c3caab9a87ee378a83c41'''}}stage('3.maven编译') {steps {sh '''/app/tools/maven/bin/mvn clean package''' }}stage('4.部署') {steps {sh '''scp ${WORKSPACE}/target/*.war root@10.0.0.8:/app/tools/tomcat/webapps/ROOT.war''' }}}
}
由于这里是根据tag进行拉取代码的,第一次构建的时候,页面上不出现选项,成功后,再次构建的时候,就会提示要选择tag,进行拉取代码了
19. Maven私服仓库配置-Nexus
19.1. nexus安装
#https://www.sonatype.com/download-oss-sonatype
#10.0.0.74机器,上传nexus压缩包
cd /app/tools/
tar -xvf nexus-3.13.0-01-unix.tar.gz
ln -s /app/tools/nexus-3.13.0-01/bin/nexus /bin/nexus
]# tar -xvf nexus-3.13.0-01-unix.tar.gz ^C
[root@nexus tools]# nexus --version
No suitable Java Virtual Machine could be found on your system.
The version of the JVM must be at least 1.8 and at most 1.8.
Please define INSTALL4J_JAVA_HOME to point to a suitable JVM.
#提示需要安装java1.8
yum -y install java-1.8.0
[root@nexus tools]# nexus --version
WARNING: ************************************************************
WARNING: Detected execution as "root" user. This is NOT recommended!
WARNING: ************************************************************
Usage: /usr/bin/nexus {start|stop|run|run-redirect|status|restart|force-reload}
[root@nexus tools]# nexus start
WARNING: ************************************************************
WARNING: Detected execution as "root" user. This is NOT recommended!
WARNING: ************************************************************
Starting nexus
[root@nexus tools]# nexus status
WARNING: ************************************************************
WARNING: Detected execution as "root" user. This is NOT recommended!
WARNING: ************************************************************
nexus is running.
本地hosts做解析
10.0.0.74 nexus.tom.cn
访问:http://nexus.tom.cn:8081 用户名:admin 密码:admin123
admin登陆后,点击左侧【Security–Users】,在列表中选择用户,右键可更改密码和重围密码, 底部表格中可修改用户其余信息
System Requirement: max file descriptors [4096] likely too low, increase to at least [65536].
翻译nexus要求: 文件描述符过低,请增加到65536(每个进程可以打开的文件数量)
#配置后重启生效。
vim /etc/security/limits.conf
#新增* soft nofile 65536* hard nofile 65536
#命令临时重启后失效 ulimit -n 65536
19.2. nexus配置远程的仓库为阿里云的nexus地址
http://maven.aliyun.com/nexus/content/groups/public/
19.3. maven修改配置连接nexus
jenkins机器做hosts解析
echo '172.16.1.74 nexus.tom.cn' >> /etc/hosts
cp /app/tools/maven/conf/settings.xml{,.back}
cat /app/tools/maven/conf/settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"><servers><server><id>my-nexus-releases</id><username>admin</username> <password>admin123</password> </server><server><id>my-nexus-snapshot</id><username>admin</username><password>admin123</password></server></servers><mirrors><mirror><id>nexus</id><mirrorOf>*</mirrorOf><url>http://nexus.tom.cn:8081/repository/maven-public/</url></mirror></mirrors><profiles><profile><id>nexus</id><repositories><repository><id>central</id><url>http://nexus.tom.cn:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories><pluginRepositories><pluginRepository><id>central</id><url>http://nexus.tom.cn:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></pluginRepository></pluginRepositories></profile></profiles>
<activeProfiles><activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
测试