一、Jenkins安装
-
软件准备
jenkins-2.204.6-1.1.noarch.rpm
官网自行下载
-
安装Jenkins
rpm -ivh jenkins-2.204.6-1.1.noarch.rpm
-
启动前配置Jenkins的java环境
vim /etc/init.d/jenkins
candidates=" /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-1.7.0/bin/java /usr/lib/jvm/jre-1.7.0/bin/java /usr/lib/jvm/java-11.0/bin/java /usr/lib/jvm/jre-11.0/bin/java /usr/lib/jvm/java-11-openjdk-amd64 /usr/bin/java /usr/java/jdk1.8.0_231/bin/java -
jenkins的目录结构
/usr/lib/jenkins/jenkins.war WAR包 /etc/sysconfig/jenkins    配置文件 /var/lib/jenkins/      默认的JENKINS_HOME目录 /var/log/jenkins/jenkins.log Jenkins日志文件 -
启动Jenkins
service jenkins start/stop/restart chkconfig jenkins on -
Jenkins页面打开很慢
cd /var/lib/jenkins/hudson.model.UpdateCenter.xmlhttp://mirror.xmission.com/jenkins/updates/update-center.json -
防火墙端口开通
vim /etc/sysconfig/iptables # 新增端口 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT systemctl restart iptables.service -
Jenkins访问
-
Jenkins插件安装很慢
cd /var/lib/jenkins/updates`
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 -
修改Jenkins 以root用户运行
# 打开配置文件 vim /etc/sysconfig/jenkins # 修改$JENKINS_USER,并去掉当前行注释 $JENKINS_USER="root" 修改Jenkins相关文件夹用户权限 chown -R root:root /var/lib/jenkins chown -R root:root /var/cache/jenkins chown -R root:root /var/log/jenkins 重启Jenkins服务并检查运行Jenkins的用户是否已经切换为root # 重启Jenkins(若是其他方式安装的jenkins则重启方式略不同) service jenkins restart # 查看Jenkins进程所属用户 ps -ef | grep jenkins # 若显示为root用户,则表示修改完成
二、Jenkins配置
-
手动安装必要插件
- Extended Choice Parameter
- Blue Ocean
- Publish Over SSH
-
环境变量配置
Manage Jenkins -> Global Tool Configuration
JDK配置
- 配置jdk环境变量

MAVEN配置
- 官网下载,配置maven环境变量

Git配置
- yum -y install git

-
在jenkins服务器执行以下命令生成git密钥
ssh-keygen -t rsa -C "793918655@qq.com"密钥生成位置
/root/.ssh id_rsa #私钥 id_rsa.pub #公钥 -
将公钥复制到gitea中

- 将私钥复制到 Jenkins中


- 完成git配置
三、PipeLine项目配置
- 创建pipeline项目

- 选择This project is parameterized,Extended Choice Paramer配置需要选择的项目

- 编写Pipeline Script

-
点击Build with Parameters
- 服务器选择和重新构建选择只有在构建一次之后才会出现

- 发布成功

四、发布脚本
1.Pipeline Script 【groovy脚本】
pipeline {
agent any
//参数化变量,目前只支持[booleanParam, choice, credentials, file, text, password, run, string]这几种参数类型,其他高级参数化类型还需等待社区支持。
parameters {
//发布的服务器
choice(name: 'DEPLOY_SERVER', choices: ['server1', 'server2', 'server3'], description: '请选择发布的服务器')
booleanParam(name: 'IS_BUILD', defaultValue:true, description: '项目是否需要重新构建?')
}
tools {
maven 'M3'
jdk 'jdk1.8.0_231'
}
stages {
stage('checkout') {
steps {
echo 'Gitea 拉取代码 Checkout'
//拉取代码
git credentialsId: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx', url: 'giturl'
}
}
stage('build') {
when {
expression {
return (params.IS_BUILD == true)
}
}
steps {
echo 'Maven 开始构建 Building ......'
// Run Maven on a Unix agent.
sh 'mvn -Dmaven.test.failure.ignore=true clean package'
}
post {
// If Maven was able to run the tests, even if some of the test
// failed, record the test results and archive the jar file.
success {
echo 'application Build Success!'
}
}
}
// 请选择需要部署的应用服务
stage('choose-app') {
steps {
script {
def chooses = "${chooseDeployApp}"
echo "需要部署的应用服务, 选择结果如下:${chooseDeployApp}"
APP1_DEPLOY_FLAG = chooses.contains("app1") ? true : false
println "ADMIN_DEPLOY_FLAG:" + ADMIN_DEPLOY_FLAG //服务1
APP2_DEPLOY_FLAG = chooses.contains("app2") ? true : false
println "DATA_DEPLOY_FLAG:" + DATA_DEPLOY_FLAG //服务2
}
}
}
//准备工作,将run.sh脚本上传至服务器
stage('Prepare') {
steps {
sshPublisher(publishers: [
sshPublisherDesc(
configName: "${params.DEPLOY_SERVER}",
transfers: [sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: 'chmod 777 /opt/app/run.sh',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '/opt/app',
remoteDirectorySDF: false,
removePrefix: 'doc/',
sourceFiles: 'doc/run.sh')],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false)])
}
post {
// If Maven was able to run the tests, even if some of the test
// failed, record the test results and archive the jar file.
success {
echo 'run.sh deploy Success!'
}
}
}
stage('app1') {
when {
expression {
return (APP1_DEPLOY_FLAG == true)
}
}
steps {
sshPublisher(
publishers: [sshPublisherDesc(
configName: "${params.DEPLOY_SERVER}",
transfers: [sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: 'sh /opt/app/run.sh backups_restart app1',
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '/opt/app/app1/jar',
remoteDirectorySDF: false,
removePrefix: 'app1/target/',
sourceFiles: 'app1/target/app1.jar')],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false)])
}
post {
// If Maven was able to run the tests, even if some of the test
// failed, record the test results and archive the jar file.
success {
echo '部署 app1 Success!'
}
}
}
}
}
2.项目启动脚本【run.sh】
#!/bin/bash
export JAVA_HOME=/usr/java/jdk1.8.0_231
export PATH=$PATH:$JAVA_HOME/bin
#java虚拟机启动参数
JAVA_OPTS="-Xms512m -Xmx512m -Xmn64m -XX:MaxPermSize=128m"
#需要启动的Java主程序(main方法类)
APP_NAME=$2
APP_MAINCLASS=$2".jar"
APP_PATH="/opt/app/"$2
#初始化psid变量(全局)
psid=0
checkpid() {
javaps=`jps -l | grep $APP_MAINCLASS`
# javaps=`$(ps x | grep $APP_MAINCLASS | grep -v grep | awk '{print $1}')`
if [ -n "$javaps" ]; then
psid=`echo $javaps | awk '{print $1}'`
else
psid=0
fi
}
start() {
checkpid
if [ $psid -ne 0 ]; then
echo "================================"
echo "info: $APP_MAINCLASS already started! (pid=$psid)"
echo "================================"
else
echo -n "Starting $APP_MAINCLASS ..."
`nohup java $JAVA_OPTS -jar $APP_PATH/$APP_MAINCLASS > /dev/null 2>&1 &`
checkpid
if [ $psid -ne 0 ]; then
echo "(pid=$psid) [OK]"
else
echo "[Failed]"
fi
fi
}
stop() {
checkpid
if [ $psid -ne 0 ]; then
echo -n "Stopping $APP_MAINCLASS ...(pid=$psid) "
`kill -9 $psid`
if [ $? -eq 0 ]; then
echo "[OK]"
else
echo "[Failed]"
fi
checkpid
if [ $psid -ne 0 ]; then
stop
fi
else
echo "======================================="
echo "[WARN]: $APP_MAINCLASS is not running"
echo "======================================="
fi
}
backups() {
if [ ! -d "$APP_PATH/backups" ];then
mkdir -p $APP_PATH/backups
echo "[WARN] backups dir is not exist, mkdir success ========================================="
else
echo "[info] backups dir is exist========================================="
fi
if [ ! -d "$APP_PATH/log" ];then
mkdir -p $APP_PATH/log
echo "[WARN] log dir is not exist, mkdir success ========================================="
else
echo "[info] log dir is exist========================================="
fi
if [ ! -d "$APP_PATH/jar" ];then
mkdir -p $APP_PATH/jar
echo "[WARN] jar dir is not exist, mkdir success ========================================="
else
echo "[info] jar dir is exist========================================="
fi
mv $APP_PATH/$APP_MAINCLASS $APP_PATH/backups/$APP_NAME$(date +%Y%m%d%H%M).jar
cp $APP_PATH/jar/$APP_MAINCLASS $APP_PATH
sleep 3
}
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
stop
start
;;
'backups_restart')
stop
backups
start
;;
*)
echo "Usage: $0 {start|stop|restart|backups_restart}"
exit 1
esac
exit 0