部署Jenkins
一、jenkins 安装
yum 安装 jenkins *jenkins 依赖 java 环境 #注意2.346之后的版本不再支持jdk8
卸载旧jenkins
#查询以前是否安装jenkins
rpm -qa |grep jenkins
#卸载 jenkins
yum -y remove jenkins
rpm -e jenkins
#彻底删除jenkins残留文件
find / -iname jenkins | xargs -n 1000 rm -rf
# 导入jenkins源
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
# 导入jenkins官方证书
rpm --import https://pkg.jenkins.io/redhat/jenkins.io-2023.key
#安装jdk11
yum install fontconfig java-17-openjdk -y
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm
#有点慢,可以在Windows上提前下载导入。
sudo yum -y install ./jdk-17_linux-x64_bin.rpm
java -version
#安装jenkins
yum install jenkins -y
#设置开机自启动
systemctl enable jenkins
#rpm安装
wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.346.1-1.1.noarch.rpm
#安装
rpm -ivh jenkins-2.346.1-1.1.noarch.rpm
二、配置文件
2.1 查询 yum 下载 Jenkins 安装的文件
[root@k8s-master-node1 ~]# rpm -ql jenkins
/usr/bin/jenkins # Jenkins 服务二进制文件
/usr/lib/systemd/system/jenkins.service #systemd 服务单元文件,定义Jenkins启动参数
/usr/share/java/jenkins.war # war 包
/var/cache/jenkins # war包解压目录 jenkins网页代码目录
/var/lib/jenkins # jenkins 工作目录
2.2 修改配置文件
配置文件说明:
[root@k8s-master-node1 ~]# grep -Ev "^(#|$)" /usr/lib/systemd/system/jenkins.service
[Unit]
Description=Jenkins Continuous Integration Server # Jenkins 持续集成服务器的描述
Requires=network.target # 依赖于网络服务,表示网络必须先启动
After=network.target # 在网络服务启动后再启动 Jenkins
[Service]
Type=notify # 服务类型为 notify,表示服务启动后会通知
NotifyAccess=main # 仅监听主进程的通知
ExecStart=/usr/bin/jenkins # 启动 Jenkins 的命令
Restart=on-failure # 在服务失败时自动重启
SuccessExitStatus=143 # 指定退出状态码 143 为正常退出
User=root # 以 root 用户身份运行 Jenkins
Group=root # 以 root 用户组身份运行 Jenkins
Environment="JENKINS_HOME=/var/lib/jenkins" # 设置 Jenkins 主目录的环境变量
WorkingDirectory=/var/lib/jenkins # 指定工作目录为 /var/lib/jenkins
Environment="JENKINS_WEBROOT=%C/jenkins/war" # 设置 Jenkins Web 根目录的环境变量
Environment="JAVA_OPTS=-Djava.awt.headless=true" # 设置 Java 选项为无头模式
Environment="JENKINS_PORT=3333" # 设置 Jenkins 监听的端口为 3333
[Install]
WantedBy=multi-user.target # 在多用户目标(运行级别)下启动 Jenkins
2.3 启动 jenkins
- • 启动之前修改以 root 用户、群组身份运行 Jenkins, 确保后面 Jenkins 有权限使用 Docker 服务。
接下来启动:
`[root@k8s-master-node1 ~]# systemctl start jenkins`
2.4 验证安装
[root@k8s-master-node1 /data]# ps -ef|grep jenkins
root 3523 7329 0 14:04 pts/0 00:00:00 grep --color=auto jenkins
jenkins 12697 1 7 14:01 ? 00:00:15 /usr/local/java/jdk1.8.0_121/bin/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=8080 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20
三、jenkins配置(web页面)
3.1 管理员密码获取
[root@k8s-master-node1 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
3.2 安装插件 (选择在线安装)
如果采用最新版的 一般不一会出现这个情况
出现离线安装解决方法:
1)修改 /var/lib/jenkins/updates/default.json
jenkins 在下载插件之前会先检查网络连接,其会读取这个文件中的网址。默认是访问谷歌,肯定监测失败,所以将图下的google改为www.baidu.com即可,更改完重启服务。
2)修改/var/lib/jenkins/hudson.model.UpdateCenter.xml
该文件为jenkins下载插件的源地址,默认为:https://updates.jenkins.io/update-center.json,就是因为https的问题,此处我们将其改为http即可,之后重启jenkins服务即可。
其他国内备用地址(也可以选择使用):
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
http://mirror.esuni.jp/jenkins/updates/update-center.json
在修复完之后,我们发现离线问题已经解决
选择安装推荐的插件:
3.3 创建第一个管理员用户
3.4 url 配置
之前版本没有这个选项,这里默认即可:
3.5 安装完成
出现如下页面时,表示安装完成
3.6 配置 jdk、git、maven
系统管理->全局工具配置
jdk:可以自动安装,但是选择本地安装的适合项目jdk版本,写入我们jdk的路径即可
git:
maven:
3.7 jenkins 下载插件失败处理办法
jenkins 下载插件失败,提示:
java.io.IOException: Downloaded file /app/jenkins_home/plugins/jacoco.jpi.tmp does not match expected SHA-1, expected 'CtK02wHdFOxTutqhUQzmue6uvpg=', actual 'YGO05utKyaaFzpGCgCE95GS0WsU='at hudson.model.UpdateCenter.verifyChecksums(UpdateCenter.java:1783)at hudson.model.UpdateCenter.access$1100(UpdateCenter.java:147)at hudson.model.UpdateCenter$InstallationJob.replace(UpdateCenter.java:1934)at hudson.model.UpdateCenter$UpdateCenterConfiguration.install(UpdateCenter.java:1178)at hudson.model.UpdateCenter$DownloadJob._run(UpdateCenter.java:1653)at hudson.model.UpdateCenter$InstallationJob._run(UpdateCenter.java:1848)at hudson.model.UpdateCenter$DownloadJob.run(UpdateCenter.java:1624)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at hudson.remoting.AtmostOneThreadExecutor$Worker.run(AtmostOneThreadExecutor.java:110)at java.lang.Thread.run(Thread.java:745)
中国源的问题。需要换个源就可,换源方法:
jenkins->系统管理->管理插件->高级 选择升级站点
把:http://updates.jenkins-ci.org/update-center.json
换成:http://mirror.esuni.jp/jenkins/updates/update-center.json
镜像地址查询:
http://mirrors.jenkins-ci.org/status.html
Jenkins 核心功能使用
一、Jenkins 用户权限管理
1.1 用户管理背景
针对开发、运维、测试针对不同角色进行不同权限划分,
基于插件: Role-based Authorization Strategy ,Authorize Project 来实现。
1.2 安装用户管理插件
安装该插件:
系统管理->管理插件-可选插件->搜索该插件选中直接安装即可。
1.3 开启该插件功能
系统管理->全局安全设置-授权策略->选中该插件功能即可->保存
1.4 验证用户管理
关闭用户管理功能来进行实践测试
1、策略改回原来的(全局安全配置)
2、开启允许用户注册(全局安全配置)
3、注册一个新用户
4、登录之后,其默认就是管理员用户,可以进行任何操作
5、开启 Role-Based Strategy
6、重新登录新创建 test1 用户,显示已经没有任何权限了
1.5 权限划分
安装 Role-Based Strategy 插件后,系统管理 中多了如图下所示的一个功能,用户权限的划分就是靠他来做的。
1、Manage Roles(管理角色)
- • Manage Roles:管理角色,相当于针对角色赋予不同权限,然后在将该角色分配给用户。角色就相当于一个组。其里面又有Global roles(全局)、Project roles(项目)、Slave roles(),来进行不同划分。
默认如图下所示:
1)Global roles
默认是有一个admin用户的,是所有权限都有的,所有权限都是勾选了的。
接下来我们来添加一个角色:user
给其一个读的权限。
2)Item roles
-
• roles to add:表示项目角色
-
• Pattern:是用来做正则匹配的(匹配的内容是Job(项目名)),比如说根据正则匹配到的项目项目角色就都有权限;
接下来新建一个island 项目角色,改项目角色一般给其构建、取消、读取、读取空间权限,一般配置这4个即可
-
• Agent roles (代理角色):节点相关的权限
-
• roles to add:表示项目角色
-
• Pattern:是用来做正则匹配的(匹配的内容是节点(Agent节点)),比如说根据正则匹配到的项目项目角色就都有权限;
2、Assigin roles(分配角色)
1)给予test用户分配 user 角色
这样其就有 manage roles 中刚才创建的user角色的权限了。
此时再去看 test1用户,已有查看的权限了
2)针对指定用户分配项目角色(一般最常用的就是针对不同用户进行项目角色分配)
比如将test用户分配有 island 项目角色,这样其就可以有刚才我们创建的island 项目角色正则匹配到的项目的权限了。
二、Jenkins 参数化构建
2.1 参数化构建背景
如果只是简单的构建,jenkins自己默认的插件可以做,但是如果我们想要在构建过程中有更多功能,比如说:选择性构建、传参、项目指定变量等等其他功能,基础的参数化构建可以实现一些简单功能,但是要想使用更多功能这时候我们就需要借助参数化构建来实现交互的功能。此处我们来借助以下插件来进行实现:
-
• Extended Choice Parameter(更丰富的参数化构建插件)
-
• Git Parameter
2.2 安装插件
首先还是安装该插件,去管理插件里面进行安装 Extended Choice Parameter
1、项目配置
2、构建选择分支进行测试,添加branch参数 git配置中选$branch参数
3、参数化配置已经生效
2.3 Git 插件
再用 git 时使用该插件是非常方便的。
1、安装插件 Git Parameter
2、进行配置
在配置之前有一个坑,当我们在配置git中写了远端地址后,会有报错:
这个是和前面docker报错是一样的
这是因为 jenkins 我们 yum 装的运行用户是 jenkins 用户,此处是 jenkins 用户去 git 仓库进行拉取,而 jenkins 用户的话默认是 /bin/false 的,不但不能登录,也没有 git 命令权限,所以肯定是失败的。
解决此问题两种办法:
-
• 更改jenkins用户为root用户;
-
• 更改jenkins用户为正常的普通用户/bin/bash,将其的公钥加入到git服务器的git用户中。
此处暂时先用第一种解决办法,更改 jenkins 的运行用户为 root 用户,通过如下方式进行更改:
-
• 将/usr/lib/systemd/system/docker.service;文件中user和group改为root
-
• 然后再重启即可。
三、Jenkins pipeline
3.1 概览
3.2 安装
在对 jenkins 进行初始化安装时,默认已经安装了 jenkins 的相关插件,如下图所示:
3.3 实操
1、新建任务
2、编写 pipeline 脚本
可以借助流水线语法去做。
roads流水线脚本:
pipeline {
agent any
// 参数化
parameters {
// string defaultValue: '2.0.0', description: '选择版本', name: 'version'
gitParameter branchFilter: 'origin/(.*)', defaultValue: 'master', name: 'BRANCH', type: 'PT_BRANCH'
string(name: 'version', defaultValue: '2.0.0', description: '选择版本')
}
tools {
jdk 'jdk1.8'
maven 'maven-3.9.6'
}
stages {
stage('pull code') {
steps {
cleanWs() //清空workspace
echo'pull start'
git branch: "${params.BRANCH}", credentialsId: 'xxxxxxxxxxxxxxxxxxxx', url: 'xxxxxxxxxxxxxxxxxxxxxxx'
echo'pull end'
}
}
stage('mvn install xxxxxxxxxx') {
steps {
echo'build xxxxxxxx'
dir('xxxxxxxx') {
sh "mvn -v"
sh "mvn clean install -Dmaven.test.skip=true"
}
}
}
stage('mvn install xxxxxxxxxx') {
steps {
echo'build xxxxxxxx'
dir('xxxxxxxxxxx') {
sh "mvn clean install -Dmaven.test.skip=true"
}
}
}
stage('mvn install xxxxx') {
steps {
echo'build xxxxxxxxx'
dir('xxxxxxxx') {
sh "mvn clean install -Dmaven.test.skip=true"
}
}
}
stage('mvn install island-opple') {
steps {
echo'build island-opple'
sh "mvn clean install -Dmaven.test.skip=true"
}
}
// stage('login docker') {
// steps {
// echo'start login docker'
// sh "docker login --username=xxxxxxxxxxxx --password=xxxxxxxxx registry.cn-hangzhou.aliyuncs.com"
// }
}
stage('make image and push') {
steps {
echo'start build image'
script {
def selectedProjects = "${project_name}".split(',')
if(selectedProjects.size()>0){
for(int i=0;i<selectedProjects.size();i++){
aaa = selectedProjects[i].replace("\"", "")
dir(aaa){
sh "pwd"
sh '''
sed -i "1c FROM xxxxxxxxxxxxxxxxxx" Dockerfile
'''
sh "mvn -Ddocker.image.tag=${version} dockerfile:build"
sh '''
sleep 3
image=$(docker images | sed -n '2p' | awk '{print$1":"$2}')
echo $image
'''
// docker push $image
}
}
}
}
}
}
}
}
3、构建测试
具体配置详解请参考 Pipeline
四、Jenkins 构建邮件状态通知
4.1 前提
前提:服务器开启邮箱服务
(如果启动失败修改/etc/postfix/main.cf
,确保 inet_interfaces
参数正确设置。默认是inet_interfaces = localhost,
如果你的服务器只想监听 IPv4 地址,可以将该参数设置为 inet_interfaces = 127.0.0.1
如果想监听所有地址(包括 IPv4 和 IPv6),可以将其设置为 inet_interfaces = all
。
)
4.2 基础配置
需要安装一个插件:
插件: Email Extension Plugin
进行配置:
系统管理->系统设置->相关配置如下图:
可以在此处进行测试发送!检验配置是否正确
