jenkins+版本控制
东北小麦客 2023-09-10 DockerJenkins
# 一.Jenkins打包时带上TAG
pipeline {
agent any
environment {
project_path_prefix = "/root/web"
project_folder_name = "static_data"
// 获取当前时间
currentDate = new Date().format('yyyy-MM-dd')
// env.BUILD_NUMBER Jenkins打包的tag
tar_folder_name = """${project_folder_name}_${currentDate}TAG${env.BUILD_NUMBER}"""
cSourceFiles = """packages/web/${project_folder_name}.tar.gz"""
cRemovePrefix = "packages/web"
cRemoteDirectory = "npm_builds/web"
project_full_path = """${project_path_prefix}/${project_folder_name}"""
// 正式服 打包后需要执行的命令
cExecCommand = """
sudo mv ~/${cRemoteDirectory}/${project_folder_name}.tar.gz ~/${cRemoteDirectory}/${tar_folder_name}.tar.gz
sudo rm -rf ${project_full_path}
sudo tar -zxvf ~/${cRemoteDirectory}/${tar_folder_name}.tar.gz -C ${project_path_prefix}
"""
}
stages {
stage('GitBranch Pull Code') {
steps {
echo """${cExecCommand}"""
echo """要打包的git分支: dev"""
git branch: 'dev', credentialsId: '7ef3ae77-git仓库链接生成的通行证', url: 'http://git仓库的url链接'
}
}
stage('Npm Install packages') {
steps {
nodejs(configId: '03281675-npm配置文件ID', nodeJSInstallationName: 'node_18.14.0') {
echo 'node_18.14.0 安装依赖'
sh 'npm i'
}
}
}
stage('Npm Build') {
steps {
nodejs('node_18.14.0') {
echo """开始打包: --- dev ---分支"""
sh """
npm run build:dev
"""
}
}
}
stage('Tar 打包产物') {
steps {
echo "---打包产物---"
sh """
cd packages/web
rm -rf ${project_folder_name}.tar.gz ${project_folder_name}
mv dist/ ${project_folder_name}
tar -zcvf ${project_folder_name}.tar.gz ${project_folder_name}
"""
}
}
stage('部署至 正式服'){
steps{
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'online_tag',
transfers: [sshTransfer(
sourceFiles: """${cSourceFiles}""", removePrefix: cRemovePrefix, remoteDirectory: cRemoteDirectory,
execCommand: cExecCommand,
cleanRemote: false, excludes: '',
execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectorySDF: false
)],
usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)
]
)
echo "正式服 部署完成~"
}
}
}
}
# 自动清理历史打包产物shell
脚本
auto_clear_by_mt.sh
根据打包产物的修改时间排序后, 进行清理
#!/bin/bash
# 根据文件修改时间进行 历史产物清理
#timestamp=$(date +%s)
#echo "Current timestamp: $timestamp"
# 默认值
defaultMaxSaveCount=10
# 最大的历史产物文件保存数量
maxSaveCount=$defaultMaxSaveCount
# 解析选项
TEMP=$(getopt -o '' --long maxSaveCount: -- "$@")
eval set -- "$TEMP"
# 尝试获取命令行第一个参数是否为数字
while true; do
case "$1" in
--maxSaveCount)
maxSaveCount="$2"
shift 2 ;;
--)
shift
break ;;
*)
echo "未知选项 $1"
exit 1 ;;
esac
done
if [[ $maxSaveCount =~ ^[0-9]+$ ]]; then
# 避免传入的参数值触底, 最小设置为 defaultMaxSaveCount
if [[ $maxSaveCount -lt $defaultMaxSaveCount ]]; then
maxSaveCount=$defaultMaxSaveCount
fi
else
# 不是一个数字
maxSaveCount=$defaultMaxSaveCount
fi
# >>> 业务逻辑代码 <<<
# 定义一个空数组
declare -a fileList=()
get_file_list(){
for file in *; do
if [[ "$file" == *.tar.gz ]]; then
mtime=$(stat -c "%y" "$file")
# $(date -d "$mtime" +%s) 获取时间戳
local fileItem="$file:$(date -d "$mtime" +%s)"
fileList+=("$fileItem")
fi
done
}
# 获取.tar.gz历史的产物文件列表
get_file_list
# 产物列表
#for fileItem in "${fileList[@]}"; do
# echo "$fileItem"
#done
fileLen=${#fileList[@]}
echo ">>>现有的历史产物文件数量:$fileLen, 最大的历史产物文件保存数量为: $maxSaveCount"
# !!!高危操作!!! 执行真正的删除工作(把打包时间相对早的历史产物进行删除)
exec_clear(){
# 排序数组按修改时间降序(从近到远)
sortedFileList=($(for fileItem in "${fileList[@]}"; do echo "$fileItem"; done | sort -t ':' -k 2,2nr))
delCount=0
for idx in "${!sortedFileList[@]}"; do
local fileItem="${sortedFileList[$idx]}"
IFS=':' read -r fileName mt <<< "$fileItem"
#echo "$idx $fileName $mt"
if [[ $idx -ge $maxSaveCount ]]; then
sudo rm -rf "$fileName"
if [ ! -e "$fileName" ]; then
echo "产物文件 $fileName 已删除"
else
echo "产物文件 $fileName 删除失败"
fi
delCount=$(( delCount+1 ))
fi
done
echo "成功清理了 $delCount 个历史产物, 现还有 $maxSaveCount 个历史产物"
}
# 如果现有的产物文件数量大于 maxSaveCount 则开始进行清理工作
if [[ $fileLen -gt $maxSaveCount ]]; then
# !!!高危操作!!!
exec_clear
else
tip="小于"
if [[ $fileLen -eq $maxSaveCount ]]; then
tip="等于"
fi
echo "现有的历史产物文件数量为: $fileLen, $tip最大的历史产物文件保存数量,不用执行清理工作"
exit 0
fi
auto_clear_by_tag.sh
根据打包产物自定义的TAG序号进行排序后, 进行清理
#!/bin/bash
# 根据自定义的TAG序号进行 历史产物清理
# 默认值
defaultMaxSaveCount=10
# 最大的历史产物文件保存数量
maxSaveCount=$defaultMaxSaveCount
# 解析选项
TEMP=$(getopt -o '' --long maxSaveCount: -- "$@")
eval set -- "$TEMP"
# 尝试获取命令行第一个参数是否为数字
while true; do
case "$1" in
--maxSaveCount)
maxSaveCount="$2"
shift 2 ;;
--)
shift
break ;;
*)
echo "未知选项 $1"
exit 1 ;;
esac
done
if [[ $maxSaveCount =~ ^[0-9]+$ ]]; then
# 避免传入的参数值触底, 最小设置为 defaultMaxSaveCount
if [[ $maxSaveCount -lt $defaultMaxSaveCount ]]; then
maxSaveCount=$defaultMaxSaveCount
fi
else
# 不是一个数字
maxSaveCount=$defaultMaxSaveCount
fi
# >>> 业务逻辑代码 <<<
# 定义一个空数组
declare -a fileList=()
get_file_list(){
for file in *; do
if [[ "$file" == *.tar.gz ]]; then
# 尝试获取jenkins打包时的tag序号
tagNo=$(echo "$file" | awk -F'TAG|.tar' '{print $2}')
local fileItem="$file:$tagNo"
fileList+=("$fileItem")
fi
done
}
# 获取.tar.gz历史的产物文件列表
get_file_list
# 产物列表
#for fileItem in "${fileList[@]}"; do
# echo "$fileItem"
#done
fileLen=${#fileList[@]}
echo ">>>现有的历史产物文件数量:$fileLen, 最大的历史产物文件保存数量为: $maxSaveCount"
# !!!高危操作!!! 执行真正的删除工作(把TAG较小的历史产物进行删除)
exec_clear(){
# 排序数组按自定义TAG降序(从大到小)
sortedFileList=($(for fileItem in "${fileList[@]}"; do echo "$fileItem"; done | sort -t ':' -k 2,2nr))
delCount=0
for idx in "${!sortedFileList[@]}"; do
local fileItem="${sortedFileList[$idx]}"
IFS=':' read -r fileName tagNo <<< "$fileItem"
#echo "$idx $fileName $tagNo"
if [[ $idx -ge $maxSaveCount ]]; then
sudo rm -rf "$fileName"
if [ ! -e "$fileName" ]; then
echo "产物文件 $fileName 已删除"
else
echo "产物文件 $fileName 删除失败"
fi
delCount=$(( delCount+1 ))
fi
done
echo "成功清理了 $delCount 个历史产物, 现还有 $maxSaveCount 个历史产物"
}
# 如果现有的产物文件数量大于 maxSaveCount 则开始进行清理工作
if [[ $fileLen -gt $maxSaveCount ]]; then
# !!!高危操作!!!
exec_clear
else
tip="小于"
if [[ $fileLen -eq $maxSaveCount ]]; then
tip="等于"
fi
echo "现有的历史产物文件数量为: $fileLen, $tip最大的历史产物文件保存数量,不用执行清理工作"
exit 0
fi