一、安装jenkins
- 直接war包搭建下载地址:https://get.jenkins.io/war-stable/ 下载稳定长期版本
二、jenkins 启动依赖java, 安装java sdk ,好像支持java 11和17版本,21版本不支持会报错
- 下载sdk地址,https://www.oracle.com/java/technologies/downloads/#java17
- 解压并且添加环境变量
tar -xzf jdk-17_linux-x64_bin.tar.gz -C /usr/local/
在/etc/profile 添加
export JAVA_HOME=/usr/local/jdk-17.0.8
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
java -version
三、启动jenkins
1.启动命令
java -jar jenkins.war --httpPort=9090
启动完成后,会生成首次登录的秘钥,一般会在
cat /root/.jenkins/secrets/initialAdminPassword
我使用的github ,在github 配置 ssh 公钥 ,位置setting ssh,在jenkins 配置全局私钥
服务器生成密钥
ssh-keygen -t rsa
注意在页面拉取代码的时候Are you sure you want to continue connecting (yes/no/[fingerprint])? yes,需要点击确认
2.添加到system 守护进程去运行 ,指定工作目录
sudo vim /etc/systemd/system/jenkins.service
[Unit]
Description=Jenkins Daemon
After=network.target
[Service]
Type=simple
User=ec2-user
Group=ec2-user
Environment="JENKINS_HOME=/home/ec2-user/data/jenkins_home"
ExecStart=/usr/local/jdk-17.0.9/bin/java -jar /home/ec2-user/data/jenkins.war --httpPort=9090
Restart=always
[Install]
WantedBy=multi-user.target
需要改下所属目录和权限
sudo chown -R ec2-user:ec2-user /home/ec2-user/data/jenkins_home
用命令表示,Are you sure you want to continue connecting (yes/no)? yes ,拉取仓库的时候需要确认下
JENKINS_HOME=/home/ec2-user/data/jenkins_home /home/ec2-user/data/jdk-17.0.9/bin/java -jar /home/ec2-user/data/jenkins.war --httpPort=9090
设置启动和开启启动
sudo systemctl daemon-reload
启动 Jenkins: sudo systemctl restart jenkins
停止 Jenkins: sudo systemctl stop jenkins
开机启动 Jenkins: sudo systemctl enable jenkins
查看 Jenkins 服务状态: sudo systemctl status jenkins
日志 sudo journalctl -u jenkins -f
3.配置pipeline 仓库
在jenkins 里面设置库
上面标红的相当于 Jenkins 里面的这个变量
@Library('pipeline_libraries') _
def tools = new org.devops.tools()
四、继续安装docker
yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
选择镜像
阿里云镜像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
源镜像
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
调试容器出错原因
docker run -it --rm -p 8062:8062 \
-v $(pwd)/config.yaml:/app/conf/config.yaml \
-v $(pwd)/logs:/app/logs \
gitxuzan/weather_api:v0.0.1 /bin/sh
查看服务端:
yum list docker-ce --showduplicates | sort -r
选择版本安装
查看客户端,下载对应版本
yum list docker-ce-cli --showduplicates | sort -r
yum install -y docker-ce-3:20.10.9-3.el8 docker-ce-cli-1:20.10.9-3.el8
最后开启启动查看
systemctl start docker
systemctl enable docker docker version
五、设置跳板机登录
.ssh/config文件配置
执行 ssh target 可以跳板机登录
# 定义跳板机 (a) 的配置
Host bastion
# 跳板机的IP地址或主机名
HostName 16.xxx.xxx.xx
# 用于登录跳板机的用户名
User xuzan
# Jenkins 服务器上的SSH私钥路径,用于身份验证
IdentityFile /var/lib/jenkins/.ssh/bastonhost_16.xxx.xxx.pem
# 定义目标服务器 (b) 的配置
Host target
# 目标服务器的IP地址或主机名
HostName 52.xxx.xxx.xxx
# 用于登录目标服务器的用户名
User ec2-user
# Jenkins 服务器上的SSH私钥路径,用于身份验证
IdentityFile /home/xuzan/.ssh/news_app.pem
# 使用ProxyCommand来指定通过跳板机连接到目标服务器
# 这里使用ssh命令通过跳板机连接到目标服务器
ProxyCommand ssh -q -W %h:%p bastion
六、jenkins 流水线,监听到push,然后根据commit 信息打包
pipeline {
agent any
options {
disableConcurrentBuilds() // 确保流水线不会并行执行
timeout(time: 5, unit: 'MINUTES') // 设置整个流水线的超时为 5 分钟
}
environment {
CRAWLER_API = "weather_api"
DIR_RUN = "cd /home/ec2-user/data/docker/services/weather && ./secrets.sh"
CREDENTIALSID = "f2b9ffa0-89d4-41bd-b3b4-9d5fd3cfac06"
VERSION_FILE = 'deployed_version.txt'
}
stages {
stage('Retrieve Latest Successful Version') {
steps {
script {
if (fileExists(env.VERSION_FILE)) {
def versions = readFile(file: env.VERSION_FILE).trim().split("\n")
env.LATEST_VERSION = versions[-1] // Last line is the latest version
env.PREVIOUS_VERSION = versions.size() > 1 ? versions[-2] : "v0.0.1" // Second last line is the previous version
} else {
env.LATEST_VERSION = "v0.0.1"
env.PREVIOUS_VERSION = "v0.0.1"
}
}
}
}
stage('Checkout Code from GitHub') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: '*/main']],
extensions: [],
userRemoteConfigs: [[url: "git@github.com:xxxxx/${CRAWLER_API}.git", credentialsId: "${CREDENTIALSID}"]]
])
}
}
stage('Decide Operation Based on Commit Message') {
steps {
script {
def lastCommitMessage = sh(script: "git log -1 --pretty=%B", returnStdout: true).trim()
env.CommitMessage = lastCommitMessage
if (lastCommitMessage.startsWith("#pro")) {
env.OPERATION = "deploy"
env.VERSION = "v0.0.${env.BUILD_NUMBER}"
} else if (lastCommitMessage.startsWith("#pre")) {
env.OPERATION = "rollback"
env.VERSION = env.PREVIOUS_VERSION
} else {
currentBuild.result = 'ABORTED'
error("Invalid commit message. Either start with #pro for deploy or #pre for rollback!")
}
}
}
}
stage('Build Docker Image and Push') {
when {
expression { env.OPERATION == "deploy" }
}
steps {
script {
sh 'docker build --platform linux/amd64 -t xxxx/${CRAWLER_API}:${VERSION} -f Dockerfile_amd64_arm64 .'
sh 'docker push xxxx/${CRAWLER_API}:${VERSION}'
}
}
}
stage('登录服务器Deploy/Rollback on Production Server') {
steps {
script {
sh 'ssh -t target "${DIR_RUN} ${VERSION}"'
}
}
}
stage('验证接口Verify Deployment') {
steps {
script {
sleep 5
sh """
status_code=\$(curl -o /dev/null -s -w "%{http_code}" https://xxxxx/weather/v1/app/test)
if [ "\$status_code" != "200" ]; then
echo "API check failed! Received status code: \$status_code"
exit 1
fi
"""
}
}
}
}
post {
success {
echo 'Build was successful!'
script {
if (env.OPERATION == "deploy") {
// 如果文件存在且最后一个字符不是换行符,则追加一个换行符
if (fileExists(env.VERSION_FILE) && sh(script: "tail -c 1 ${env.VERSION_FILE} | wc -l", returnStdout: true).trim() != "1") {
sh "echo '' >> ${env.VERSION_FILE}"
}
// 追加版本号
sh "echo '${VERSION}' >> ${env.VERSION_FILE}"
}
currentBuild.description = "构建成功!"
def projectName = sh(script: "basename `git rev-parse --show-toplevel`", returnStdout: true).trim()
def messageToSend = "${projectName}: ${VERSION} ${env.CommitMessage}"
sh "ssh target '/home/ec2-user/data/docker/services/tg.sh \"构建成功 ${messageToSend}\"'"
emailext subject: "执行成功 ${messageToSend}",
body: """
<div id="content">
<h2>Jenkins 运行结果</h2>
<h3>${messageToSend}</h3>
</div>
""",
mimeType: 'text/html',
from: "${env.USER_MY_EMAIL}",
to: "${env.USER_MY_EMAIL}"
}
}
failure {
echo 'Build failed!'
script {
currentBuild.description = "构建失败!"
def projectName = sh(script: "basename `git rev-parse --show-toplevel`", returnStdout: true).trim()
def messageToSend = "${projectName}: ${VERSION} ${env.CommitMessage}"
sh "ssh target '/home/ec2-user/data/docker/services/tg.sh \"构建失败 ${messageToSend}\"'"
// jenkins 邮件配置
emailext subject: "执行失败 ${messageToSend}",
body: """
<div id="content">
<h2>Jenkins 运行结果</h2>
<h3>${messageToSend}</h3>
</div>
""",
mimeType: 'text/html',
from: "${env.USER_MY_EMAIL}",
to: "${env.USER_MY_EMAIL}"
}
}
aborted {
echo '构建取消拉aborted!'
script {
currentBuild.description = "构建取消拉!"
}
}
}
}
获取构建方式,例如是push 的还是手动构建的,还是定时构建的
environment {
CAUSE = "${currentBuild.getBuildCauses()[0].shortDescription}"
}
jenkins 日志
journalctl -u jenkins -f
七、jenkins webhooks 配置
7.1 设置了pipeline 全局仓库
jenkinsfile文件引入这个库直接调用
#!groovy
@Library('pipeline_libraries') _
def tools = new org.devops.tools()
// 测试
restartServicePostPipeline()
7.2 webhook插件配置 Generic Webhook Trigger
下载地址: https://plugins.jenkins.io/generic-webhook-trigger/
上面接收了post json 数据
7.3 在pipeline中获取该值,这样就直接获取了全部json了
println("所有body数据 --> ${webhookPayload}")
7.4 邮件配置
8.权限配置
role-based-authorization strategy插件安装和使用
一.安装插件
1.点击系统管理-插件管理,搜索role,选择需要下载的版本,点击下载
或者插件手动下载,注意看当前版本号
服务器找到 JENKINS_HOME , /home/ec2-user/data/jenkins_home/plugins 文件,把hpi复制拷贝过去,再重启jenkins
二.新建用户
1.点击系统管理,管理用户
2.点击新建用户,输入用户信息
三.创建任务
1.在控制台点击,新建任务
2.填写任务信息
四.全局安全配置
1.点击系统管理,全局安全配置
2.设置权限方式
安全域:jenkins专有用户数据库
授权策略:Role-Based-Strategy
五.管理和分配角色
1.点击系统设置-安全-manage and assign roles
2.管理角色
点击manage roles
Global roles:全局角色,一般设置登录权限即可
这pattern 就是匹配你的流水线名称,正则匹配的
应用保存后,查看验证权限效果
其他
用户git设置,这个配合插件使用
github clone不下来
https://ping.chinaz.com/github.com
选择可用的ip ,在/etc/hosts 修改
20.205.243.166 github.com
20.205.243.166 raw.githubusercontent.com
卡主的情况
sudo systemctl stop jenkins
# 这个编号就是你的流水线编号
rm -rf /root/.jenkins/jobs/widgets_api/builds/123
sudo systemctl start jenkins
nohup问题
新增 JENKINS_NODE_COOKIE=dontKillMe
cd /home/ec2-user/data/weather/ && JENKINS_NODE_COOKIE=dontKillMe ./admin.sh restart
关于jenkins 没有执行docker权限的问题
这个地方一定要加入docker 组 里面,
sudo usermod -aG docker ec2-user
查看组
groups ec2-user
最后重启jenkins
sudo systemctl restart jenkins
git parameter 参数插件
https://plugins.jenkins.io/git-parameter/