模板
2025年12月9日大约 5 分钟
备份打包上传更新
pipeline {
agent {
label 'saq' // ⚠️ 替换为你的本地 Agent 的 label
}
environment {
PROJECT_DIR = 'C:/Users/hushun/Desktop/omni-portal-frontend'
// DEPLOY_DIR = '/usr/local/work_info'
DEPLOY_DIR = '/home/shingi/cs/'
}
stages {
stage('本地打包') {
steps {
dir("${env.PROJECT_DIR}") {
powershell """
Compress-Archive -Path "${env.PROJECT_DIR}\\dist" -DestinationPath "${env.PROJECT_DIR}\\dist.zip" -Force
"""
}
}
}
stage('上传安装包') {
steps {
dir("${env.PROJECT_DIR}") {
powershell """
scp -P 22222 -r dist.zip shingi@125.122.39.147:${env.DEPLOY_DIR}
"""
}
}
}
stage('备份&更新') {
steps {
script {
// 获取当前时间,格式:yyyyMMdd_HHmmss
def timestamp = new Date().format("yyyyMMdd_HHmmss")
// 1️⃣ 重命名 dist 目录
try {
powershell """
ssh -p 22222 shingi@125.122.39.147 "mv ${env.DEPLOY_DIR}dist ${env.DEPLOY_DIR}dist_${timestamp}"
"""
} catch (err) {
echo "⚠️ 捕获到异常:${err}"
}
// 2️⃣ 删除 7 天前的旧目录
powershell """
ssh -p 22222 shingi@125.122.39.147 "find ${env.DEPLOY_DIR} -maxdepth 1 -type d -name dist_* -mtime +7 -exec rm -rf {} \\;"
"""
// 3️⃣ 解压新的 dist.zip
powershell returnStatus: true, script: """
ssh -p 22222 shingi@125.122.39.147 "unzip ${env.DEPLOY_DIR}dist.zip -d ${env.DEPLOY_DIR}"
"""
}
}
}
}
post {
success {
dingtalk (
robot: 'wjn-jenkins',
type: 'MARKDOWN',
title: '你有新的消息,请注意查收',
text: [
'# ${env.JOB_NAME}',
'发布成功',
'',
'---',
'请前往[验证地址](http://qshktjt.shingi.cn:8089/)',
],
at: [
'18636192514'
]
)
}
}
}内置变量
pipeline {
agent any
stages {
stage('打印构建信息') {
steps {
script {
echo "当前 Job 名称: ${env.JOB_NAME}"
echo "当前构建号: ${env.BUILD_NUMBER}"
echo "构建标签: ${env.BUILD_TAG}"
echo "构建 ID: ${env.BUILD_ID}"
echo "构建链接: ${env.BUILD_URL}"
}
}
}
}
}钉钉推送加变量
变量要用双引号
pipeline {
agent any
stages {
stage('link'){
steps {
echo '测试 MARKDOWN 消息...'
}
post {
success {
dingtalk (
robot: 'wjn-jenkins',
type: 'MARKDOWN',
title: '你有新的消息,请注意查收',
text: [
"# ${env.JOB_NAME}",
],
at: [
'18636192514'
]
)
}
}
}
}
}钉钉推送
pipeline {
agent any
stages {
stage('link'){
steps {
echo '测试 MARKDOWN 消息...'
}
post {
success {
dingtalk (
robot: 'wjn-jenkins',
type: 'MARKDOWN',
title: '你有新的消息,请注意查收',
text: [
'# 这是消息内容的标题',
'消息正文:测试 markdown 类型的消息',
'',
'---',
'我有分割线,哈哈哈哈',
'> 引用内容',
'#### 展示列表',
'- 两个黄鹂鸣翠柳',
'- 一行白鹭上青天',
'- 窗含西岭千秋雪',
'- 门泊东吴万里船'
],
at: [
'18636192514'
]
)
}
}
}
}
}windows 打包
pipeline {
agent {
label 'saq' // ⚠️ 替换为你的本地 Agent 的 label
}
environment {
PROJECT_DIR = 'C:/Users/hushun/Desktop/omni-portal-frontend'
DEPLOY_DIR = '/usr/local/work_info'
}
stages {
stage('本地打包') {
steps {
dir("${env.PROJECT_DIR}") {
powershell """
Compress-Archive -Path "${env.PROJECT_DIR}\\dist" -DestinationPath "${env.PROJECT_DIR}\\dist.zip" -Force
"""
}
}
}
}
}windows 获取最新的文件夹
pipeline {
agent {
label 'saq'
}
environment {
PROJECT_DIR = 'C:/Users/hushun/Desktop/omni-portal-frontend' // ⚠️ 替换为你的本地项目路径
DEPLOY_DIR = '\\\\WJN-AGENT\\Resources\\project\\tj\\front' // ⚠️ 替换为你希望部署到的路径
SHARE_USER = 'wjn' // ⚠️ 改为共享目录的登录用户名
SHARE_PASS = '123' // ⚠️ 改为共享目录的密码
}
stages {
stage('开始部署'){
steps {
echo "开始部署"
powershell '''
$folders = Get-ChildItem -Path $env:DEPLOY_DIR -Directory -ErrorAction SilentlyContinue |
Where-Object { $_.Name -match '^dist_\\d{14}$' }
if (-not $folders) {
Write-Host "未找到符合命名规则的文件夹 (dist_yyyyMMddHHmmss)"
exit 1
}
# 提取时间部分并排序
$latest = $folders | Sort-Object {
[datetime]::ParseExact($_.Name.Substring(5), 'yyyyMMddHHmmss', $null)
} -Descending | Select-Object -First 1
Write-Host "=== 最新文件夹 ==="
Write-Host $latest.FullName
'''
}
}
}
}windows powershell
pipeline {
agent {
label 'saq'
}
environment {
PROJECT_DIR = 'C:/Users/hushun/Desktop/omni-portal-frontend' // ⚠️ 替换为你的本地项目路径
DEPLOY_DIR = '\\\\WJN-AGENT\\Resources\\project\\tj\\front' // ⚠️ 替换为你希望部署到的路径
SHARE_USER = 'wjn' // ⚠️ 改为共享目录的登录用户名
SHARE_PASS = '123' // ⚠️ 改为共享目录的密码
}
stages {
stage('Checkout') {
steps {
echo "✅ 复制成功!"
powershell '''
$src = Join-Path $env:PROJECT_DIR 'dist'
$time = (Get-Date).ToString('yyyyMMddHHmmss')
$dst = Join-Path $env:DEPLOY_DIR ("dist_" + $time)
cmd /c "net use $env:DEPLOY_DIR /user:$env:SHARE_USER $env:SHARE_PASS" | Out-Null
Write-Host loginsuccess
if (!(Test-Path -Path $dst)) {
New-Item -ItemType Directory -Force -Path $dst | Out-Null
}
Copy-Item -Path (Join-Path $src '*') -Destination $dst -Recurse -Force
'''
}
}
}
}windows 复制文件
pipeline {
agent {
label 'wjn'
}
stages {
stage('Copy Folder to Shared Folder') {
steps {
script {
bat '''
echo === 复制文件夹到共享目录 ===
REM 源文件夹(相对路径或绝对路径)
set SRC=D:\\cs
REM 目标共享路径
set DST=\\\\WJN-AGENT\\Resources\\wjn\\cs
REM 获取当前时间戳 yyyyMMddHHmm
for /f "tokens=2 delims==" %%I in ('"wmic os get localdatetime /value"') do set DT=%%I
set TIMESTAMP=%DT:~0,4%%DT:~4,2%%DT:~6,2%%DT:~8,2%%DT:~10,2%
echo 当前时间戳:%TIMESTAMP%
REM 拼接目标目录
set DST_FULL=%DST%\\%TIMESTAMP%
echo 创建目标目录 %DST_FULL%
mkdir "%DST_FULL%"
REM 若需要登录共享文件夹,可取消注释并配置凭证
REM net use %DST% /user:wjn 123
REM /E 复制包括子目录(含空目录),/Y 不询问覆盖
xcopy "%SRC%" "%DST_FULL%" /E /Y /I
if %errorlevel%==0 (
echo ✅ 复制成功!
) else (
echo ❌ 复制失败!
exit /b 1
)
REM 断开共享连接(如果使用了 net use)
REM net use %DST% /delete
'''
}
}
}
}
}windows 移动文件到共享目录
pipeline {
agent {
label 'wjn'
}
stages {
stage('Move cs.txt to Shared Folder') {
steps {
script {
// Windows 批处理命令
bat '''
echo Moving cs.txt to \\\\WJN-AGENT\\Resources\\wjn\\cs...
REM 如果共享目录需要凭证,可以先连接
REM net use \\WJN-AGENT\\Resources\\wjn\\cs /user:wjn 123
if not exist "\\\\WJN-AGENT\\Resources\\wjn\\cs" (
echo Folder not found, creating...
mkdir "\\\\WJN-AGENT\\Resources\\wjn\\cs"
)
move /Y "D:/artemis-http-client-1.1.8.jar" "\\\\WJN-AGENT\\Resources\\wjn\\cs"
if %errorlevel%==0 (
echo ✅ Move succeeded!
) else (
echo ❌ Move failed!
exit /b 1
)
'''
}
}
}
}
}pipeline {
agent {
label 'sz' // ⚠️ 替换为你的本地 Agent 的 label
}
parameters {
choice(
name: 'MODULE_NAME_SELECT',
choices: ['nginx', 'docker', 'service-b'],
description: '选择要构建的模块'
)
// 二级参数,默认值可以随便选,不是 docker 时可以忽略
choice(
name: 'DOCKER_SERVICE_SELECT',
choices: ['system','gateway','info','access','dorm','vehicle','visitor','firefighting','log-book','ledger'],
description: '选择 docker 服务 (仅在 MODULE_NAME_SELECT=docker 时生效)'
)
}
environment {
PROJECT_DIR = 'D:/wjn/yx/school-conf' // ⚠️ 替换为你的本地项目路径
}
stages {
stage('Checkout') {
steps {
// 如果使用本地代码,可省略这步;否则拉取仓库:
// git url: 'https://your-repo-url.git'
echo "Using local workspace at ${env.PROJECT_DIR}"
echo "选择构建模块: ${params.MODULE_NAME_SELECT}"
}
}
stage('Install Dependencies') {
steps {
dir("${env.PROJECT_DIR}") {
bat 'git checkout sz'
// 拉取最新代码
bat 'git pull origin sz'
}
}
}
stage('Build and Deploy') {
steps {
script {
def moduleName = params.MODULE_NAME_SELECT.toLowerCase() // 转小写
// 判断是否为 nginx
if (moduleName == 'nginx') {
echo "开始上传 nginx 文件..."
dir("${env.PROJECT_DIR}") {
bat "scp -r nginx/* root@soft.shingi:/home/ubuntu/conf.d/"
echo "nginx 文件上传完成。"
// 3. 重启容器
echo "🛑 重启容器..."
bat "ssh root@soft.shingi \"cd /home/ubuntu && docker-compose restart school-front"
echo "容器重启完成。"
}
}
if (moduleName == 'docker') {
echo "开始上传 docker compose 文件..."
dir("${env.PROJECT_DIR}") {
bat "scp -r docker/compose.yml root@soft.shingi:/home/ubuntu/"
echo "docker compose 文件上传完成。"
def dockerService = params.DOCKER_SERVICE_SELECT
echo "处理 docker 模块,选择的服务是: ${dockerService}"
echo "🛑 停止旧容器..."
bat "ssh root@soft.shingi \"cd /home/ubuntu && docker-compose down school-${dockerService}"
// 4. 运行新容器
echo "🚀 启动新容器..."
bat "ssh root@soft.shingi \"cd /home/ubuntu && docker-compose up school-${dockerService} -d"
echo "容器启动完成。"
}
}
else {
echo "非 nginx 模块,不进行上传"
}
}
}
}
}
post {
success {
echo "✅ Build and deployment successful."
}
failure {
echo "❌ Build or deployment failed."
}
}
}