定义参数
根据送参执行构建
#!/bin/bash
echo "=======================自定义变量区域======================================"
IP_List="172.16.0.* 172.16.0.*" #ip列表 用空格分隔
EXCUTE_PATH="***" #服务器上传位置路径
PROJECT_PATH="**-php" #要跟jenkins 任务名称一样
PROJECT_NAME="**-php.tar.gz" #打包名称
echo "============================================================================"
echo "==============================构建区域======================================"
case $status in
Deploy)
echo "======status:$status========="
echo $PATH
echo "===========================编译打包开始,刷新下环境变量文件=================="
source /etc/profile
# 打开jenkins工作目录项目文件夹
echo "========================检测version文件有无变更=============================="
cd /root/.jenkins/workspace/$PROJECT_PATH/server
md5sum ./version > ./$PROJECT_PATH.md5
diff -r ../../$PROJECT_PATH.md5 ./$PROJECT_PATH.md5
if [ $? -eq 0 ];then
echo "文件没有变化 程序结束"
exit 0;
else
echo "文件发生变化 更新MD5文件"
md5sum ./version > ../../$PROJECT_PATH.md5
fi
## 将打包好的文件夹,压缩,方便后续scp传输
echo "=============================将文件夹打成压缩包==============================="
cd /root/.jenkins/workspace/$PROJECT_PATH
tar zcvf $PROJECT_NAME -C server . --exclude=storage --exclude=.env --exclude=public/favicon.ico --exclude=vendor --exclude=.git --exclude=document
echo "=============================================================================="
echo "========开始上传文件$PROJECT_NAME到服务器============="
echo "=============================================================================="
echo "=====================for循环scp项目压缩包====================================="
if [ "$IP_List" != "" ]; then
echo "=========================上传压缩包和二级脚本================================"
for IP_Job in $IP_List; do
scp ../$PROJECT_PATH.sh root@$IP_Job:$EXCUTE_PATH/$PROJECT_PATH.sh
scp $PROJECT_NAME root@$IP_Job:$EXCUTE_PATH/$PROJECT_NAME
echo $IP_Job
done
echo "=========================运行二级脚本========================================"
for IP_Job in $IP_List; do
ssh root@$IP_Job "cd $EXCUTE_PATH; chmod +x ./$PROJECT_PATH.sh; bash $PROJECT_PATH.sh"
done
fi
echo "===================================执行完成==================================="
echo "========================移动压缩包到备份文件夹================================"
cd /root/.jenkins/workspace/$PROJECT_PATH
mkdir -p /root/.jenkins/workspace/backup_web/$PROJECT_PATH
#find /root/.jenkins/workspace/backup_web/$PROJECT_PATH -mtime +70 -delete
mv $PROJECT_NAME /root/.jenkins/workspace/backup_web/$PROJECT_PATH/$PROJECT_NAME.$BUILD_NUMBER
echo "deploy done!"
;;
Rollback)
echo "===================================回滚步骤===================================="
echo "======status:$status========"
echo "======build_id:$version======="
backup_path="${JENKINS_HOME}/workspace/backup_web/$PROJECT_PATH"
cd $backup_path
echo "===========================把想要回滚的包发送到测试服务器======================"
echo "=====================for循环scp项目压缩包====================================="
if [ "$IP_List" != "" ]; then
echo "=========================上传压缩包和二级脚本================================"
for IP_Job in $IP_List; do
scp ../../$PROJECT_PATH.sh root@$IP_Job:$EXCUTE_PATH/$PROJECT_PATH.sh
scp $PROJECT_NAME.$version root@$IP_Job:$EXCUTE_PATH/$PROJECT_NAME
done
echo "=========================运行二级脚本========================================"
for IP_Job in $IP_List; do
ssh root@$IP_Job "cd $EXCUTE_PATH; chmod +x ./$PROJECT_PATH.sh; bash $PROJECT_PATH.sh"
done
fi
echo "======================================执行完成=================================="
echo "roll_back done!"
;;
*)
esac
目标机器脚本
#!/bin/bash
EXCUTE_PATH=$(pwd)
PROJECT_PATH="server"
PROJECT_NAME="server"
PROJECT_BAG="**-php.tar.gz"
cd $EXCUTE_PATH
rm -rf app config database resources routes tests hcjt2010
tar -xzvf $PROJECT_BAG;
cd $EXCUTE_PATH
echo "创建本次构建的composer.lock的MD5文件"
md5sum ./composer.lock > ./$PROJECT_PATH.md5
echo "对比这次的MD5和上次构建的MD5文件"
diff -r ../$PROJECT_PATH.md5 ./$PROJECT_PATH.md5
if [ $? -eq 0 ];then
echo "文件没有变化 不执行composer install"
else
echo "文件发生变化 更新MD5文件并执行composer install"
echo "更新md5"
md5sum ./composer.lock > ../$PROJECT_PATH.md5
#yes | composer update --ignore-platform-req=ext-fileinfo
yes | composer install --ignore-platform-req=ext-fileinfo
fi
#echo "=====安装composer依赖====="
#cd $EXCUTE_PATH/$PROJECT_PATH
#yes | composer install --ignore-platform-reqs
#yes | composer update --ignore-platform-req=ext-fileinfo
#yes | composer update
echo "=====遍历目录下的文件 文件夹为755权限 文件为644权限======"
cd ..
find "$PROJECT_PATH" -type d -exec chmod 755 {} +;
find "$PROJECT_PATH" -type f -exec chmod 644 {} +;
#find ./$PROJECT_PATH -type d -exec chmod 755 {} \;
#find ./$PROJECT_PATH -type f -exec chmod 644 {} \;
echo "======找到laravel需要读写权限的目录 赋予权限============"
chmod 755 `find ./$PROJECT_NAME/.env -type f`
chmod 755 -R ./$PROJECT_NAME/bootstrap
chmod 755 -R ./$PROJECT_NAME/storage
chown -R www:www $PROJECT_PATH
echo "======更新laravel缓存配置及数据库变更======="
cd $EXCUTE_PATH
#php artisan storage:link
#php artisan migrate:fresh;
yes | php artisan migrate;
#php artisan db:seed;
php artisan optimize;
php artisan queue:restart;
ls -al
#echo "删除数据库导入文件"
#rm -rf $DATABASE
echo "删除远程打包文件"
rm -rf ./$PROJECT_BAG
echo "删除scp远程脚本"
rm -rf ./**-php.sh
pipeline {
agent any
environment {
PUSH_IP = 'GZQL' // 多个IP以逗号分隔
EXCUTE_PATH = "/www/wwwroot/XXX.****.com"
BACKUP_PATH = "/root/.jenkins/workspace/backup_web/${JOB_NAME}"
JENKINS_HOME = "/root/.jenkins/workspace"
JENKINS_WORKSPACE = "/root/.jenkins/workspace"
PROJECT_BAG = "${JOB_NAME}.tar.gz"
}
stages {
stage('清空工作区域'){
steps {
cleanWs()
}
}
stage('生成脚本') {
steps {
script {
writeFile file: "$JENKINS_WORKSPACE/sh/${JOB_NAME}.sh", text: '''
#!/bin/bash
EXCUTE_PATH="/www/wwwroot/XX.com/"
PROJECT_PATH="XX-php-test"
PROJECT_NAME="XX-php-test"
PROJECT_BAG="XX-php-test.tar.gz"
cd $EXCUTE_PATH/$PROJECT_PATH
rm -rf app config database resources routes tests hcjt2010
cd ..
tar -xzvf $PROJECT_BAG;
cd $EXCUTE_PATH/$PROJECT_PATH
echo "创建本次构建的composer.lock的MD5文件"
md5sum ./composer.json > ./$PROJECT_PATH.md5
echo "对比这次的MD5和上次构建的MD5文件"
diff -r ../$PROJECT_PATH.md5 ./$PROJECT_PATH.md5
if [ $? -eq 0 ];then
echo "文件没有变化 不执行composer update"
else
echo "文件发生变化 更新MD5文件并执行composer update"
echo "更新md5"
md5sum ./composer.json > ../$PROJECT_PATH.md5
#yes | composer update --ignore-platform-req=ext-fileinfo
#yes | composer update #--no-dev
if ! yes | composer update; then
echo "composer update失败"
exit 1
fi
fi
#echo "=====安装composer依赖====="
#cd $EXCUTE_PATH/$PROJECT_PATH
#yes | composer install --ignore-platform-reqs
#yes | composer update --ignore-platform-req=ext-fileinfo
#yes | composer update
echo "=====遍历目录下的文件 文件夹为755权限 文件为644权限======"
cd ..
find "$PROJECT_PATH" -type d -exec chmod 755 {} +;
find "$PROJECT_PATH" -type f -exec chmod 644 {} +;
echo "======找到laravel需要读写权限的目录 赋予权限============"
chmod 755 `find ./$PROJECT_NAME/.env -type f`
chmod 755 -R ./$PROJECT_NAME/bootstrap
chmod 755 -R ./$PROJECT_NAME/storage
chown -R www:www $PROJECT_PATH
echo "======更新laravel缓存配置及数据库变更======="
cd $EXCUTE_PATH/$PROJECT_PATH
php artisan storage:link
#php artisan migrate:fresh;
#yes | php artisan migrate;
#php artisan db:seed;
php artisan queue:restart;
php artisan optimize:clear;
supervisorctl restart erp:00;
ls -al
#echo "删除数据库导入文件"
#rm -rf $DATABASE
echo "删除远程打包文件"
rm -rf ../$PROJECT_NAME.tar.gz
echo "删除scp远程脚本"
rm -rf ../$PROJECT_NAME.sh
'''
}
}
}
stage('构建发布') {
when {
expression {
params.status == 'Deploy'
}
}
steps {
script {
stage('拉取代码') {
checkout([$class: 'GitSCM',
branches: [[name: params.branch]],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[url: params.giturl]]])
}
stage('打包') {
dir(JENKINS_WORKSPACE){
sh """
tar czvf $JENKINS_HOME/$PROJECT_BAG ${JOB_NAME} --exclude={storage,.env,public/favicon.ico,vendor,.git,public/fonts,document}
echo '打包完成'
"""
}
}
stage('发布') {
def ipList = PUSH_IP.split(',')
for (String ip : ipList) {
sh """
scp $JENKINS_HOME/$PROJECT_BAG root@$ip:$EXCUTE_PATH
echo '上传压缩包完成'
scp $JENKINS_WORKSPACE/sh/${JOB_NAME}.sh root@$ip:$EXCUTE_PATH
echo '上传后续脚本完成'
ssh root@$ip 'cd $EXCUTE_PATH && bash ${JOB_NAME}.sh'
echo '执行目标脚本完成'
mkdir -p $BACKUP_PATH
mv $JENKINS_HOME/$PROJECT_BAG $BACKUP_PATH/${JOB_NAME}.$BUILD_NUMBER
echo '成品归档完成'
"""
}
}
}
}
}
stage('回滚发布') {
when {
expression {
params.status == 'Rollback'
}
}
steps {
script {
def ipList = PUSH_IP.split(',')
for (String ip : ipList) {
sh """
scp $BACKUP_PATH/${JOB_NAME}.$version root@$ip:$EXCUTE_PATH/${JOB_NAME}.tar.gz
echo '发送备份包完成'
scp $JENKINS_WORKSPACE/sh/${JOB_NAME}.sh root@$ip:$EXCUTE_PATH/${JOB_NAME}.sh
echo '发送后续脚本完成'
ssh root@$ip 'cd $EXCUTE_PATH && bash ${JOB_NAME}.sh'
echo '回滚完成'
"""
}
}
}
}
}
}
2023最新无敌版
pipeline {
agent any
options {
timeout(time: 4, unit: 'MINUTES')
timestamps()
}
environment {
PUSH_IP = 'GZQL' // 多个IP以逗号分隔
EXCUTE_PATH = "/www/wwwroot/datatest.***.com/repos"
BACKUP_PATH = "/root/.jenkins/workspace/backup_web/${JOB_NAME}"
JENKINS_HOME = "/root/.jenkins/workspace"
JENKINS_WORKSPACE = "/root/.jenkins/workspace"
PROJECT_BAG = "${JOB_NAME}.tar.gz"
current_date = new Date().format('yyyyMMddHHmmss')
}
stages {
stage('清空工作区域'){
steps {
cleanWs()
}
}
stage('生成脚本') {
steps {
script {
def PROJECT_SH ="${JOB_NAME}.sh"
def JOB_MD5 = "${JOB_NAME}.md5"
def JOB_PATH="/www/wwwroot/datatest.***.com"
def scriptContent = """
#!/bin/bash
echo "本次目录为 $current_date"
mkdir ./${current_date} -p
tar -xzvf $PROJECT_BAG -C $EXCUTE_PATH/$current_date
cd $EXCUTE_PATH/$current_date
ln -sv ../../storage
ln ../../.env
echo "============composer==================="
cd $EXCUTE_PATH/$current_date
echo "创建本次构建的composer.lock的MD5文件"
md5sum ./composer.lock > ./$JOB_MD5
echo "对比这次的MD5和上次构建的MD5文件"
diff -r ../../$JOB_MD5 ./$JOB_MD5
if [ \$? -eq 0 ];then
echo "文件没有变化 不执行composer update 沿用上一版的vendor"
ln -sv ../../vendor
if ! yes | /www/server/php/81/bin/php /usr/bin/composer install; then
echo "composer install失败"
exit 1
fi
else
echo "文件发生变化 更新MD5文件并执行composer install"
echo "更新md5"
ln -sv ../../vendor
md5sum ./composer.lock > ../../$JOB_MD5
#yes | composer update --ignore-platform-req=ext-fileinfo
#yes | composer update #--no-dev
if ! yes | /www/server/php/81/bin/php /usr/bin/composer install; then
echo "composer install失败"
exit 1
fi
fi
cd ..
echo "=====遍历目录下的文件 文件夹为755权限 文件为644权限======"
find "$current_date" -type d -exec chmod 755 {} +;
find "$current_date" -type f -exec chmod 644 {} +;
chmod 755 `find ./$current_date/.env -type f`;
echo "======找到laravel需要读写权限的目录 赋予权限============"
chown -R www:www $current_date
cd $JOB_PATH
chown -R www:www storage vendor
rm -rf current
ln -sv ./repos/$current_date ./current
cd $EXCUTE_PATH/$current_date/public
rm -rf addons
ln -sv ../addons
ln -sv ../../../storage/app/public storage
ln -sv ../../../admin
#/www/server/php/74/bin/php artisan storage:link
cd $EXCUTE_PATH/$current_date
php artisan queue:restart;
supervisorctl restart datatest:00;
php artisan optimize;
find $EXCUTE_PATH -maxdepth 1 -mindepth 1 -type d -printf "%T@ %p\n" | sort -n | head -n -5 | cut -d ' ' -f 2- | xargs rm -rf
rm -rf ../$PROJECT_BAG
rm -rf ../$PROJECT_SH
"""
writeFile file: "$JENKINS_WORKSPACE/sh/${JOB_NAME}.sh", text: scriptContent
}
}
}
stage('构建发布') {
when {
expression {
params.status == 'Deploy'
}
}
steps {
script {
stage('拉取代码') {
checkout([$class: 'GitSCM',
branches: [[name: params.branch]],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'CloneOption', depth: 1]],
submoduleCfg: [],
userRemoteConfigs: [[url: params.giturl]]])
}
stage('打包') {
dir(WORKSPACE){
sh """
tar czvf ../$PROJECT_BAG . --exclude={addons,storage,.env,public/favicon.ico,vendor,.git,public/font,document}
echo '打包完成'
"""
}
}
stage('发布') {
def ipList = PUSH_IP.split(',')
for (String ip : ipList) {
sh """
scp $JENKINS_HOME/$PROJECT_BAG root@$ip:$EXCUTE_PATH
echo '上传压缩包完成'
scp $JENKINS_WORKSPACE/sh/${JOB_NAME}.sh root@$ip:$EXCUTE_PATH
echo '上传后续脚本完成'
ssh root@$ip 'cd $EXCUTE_PATH && bash ${JOB_NAME}.sh'
echo '执行目标脚本完成'
mkdir -p $BACKUP_PATH
mv $JENKINS_HOME/$PROJECT_BAG $BACKUP_PATH/${JOB_NAME}.$BUILD_NUMBER
echo '成品归档完成'
"""
}
}
}
}
}
stage('回滚发布') {
when {
expression {
params.status == 'Rollback'
}
}
steps {
script {
def ipList = PUSH_IP.split(',')
for (String ip : ipList) {
sh """
scp $BACKUP_PATH/${JOB_NAME}.$version root@$ip:$EXCUTE_PATH/${JOB_NAME}.tar.gz
echo '发送备份包完成'
scp $JENKINS_WORKSPACE/sh/${JOB_NAME}.sh root@$ip:$EXCUTE_PATH/${JOB_NAME}.sh
echo '发送后续脚本完成'
ssh root@$ip 'cd $EXCUTE_PATH && bash ${JOB_NAME}.sh'
echo '回滚完成'
"""
}
}
}
}
}
}