Compare commits

...

12 Commits
main ... master

21
Jenkinsfile vendored

@ -0,0 +1,21 @@
pipeline {
agent any
stages {
// 仅保留核心拉取Gitea的master分支已确认有内容
stage('拉取Gitea源码') {
steps {
git(
url: 'http://localhost:3000/lrx/cstatm23210465', // 你的原始URL
branch: 'master' // 明确指定有内容的分支和Gitea一致
)
echo "✅ 源码拉取成功分支master"
}
}
// 仅保留基础步骤,确保流水线完整
stage('构建成功') {
steps {
echo "🎉 流水线构建成功!"
}
}
}
}

@ -0,0 +1,118 @@
//Jenkins配置流水线时应该将默认Jenkinsfile改为Jenkinsfile127
//修改cstatm211601,可批量替换
pipeline {
agent any
options {
//跳过从源代码控制中检出代码使用阶段stage('拉取Gitea源码')
skipDefaultCheckout(true)
}
stages {
stage('拉取Gitea源码') {
steps {
cleanWs()//清除Jenkins的工作区WorkSpace
//gitea为Jenkins中的凭据:用访问gitea的账号、密码生成
//修改2018211601自己的学号
git credentialsId: 'gitea', url: 'http://localhost:3000/2018211601/cstatm211601.git'
}
}
stage('Maven Sonar 打包') {
steps {
//SonarQube为Jenkins系统中配置的服务器名称并设置SonarQube口令
withSonarQubeEnv('SonarQube'){
//Maven使用SonarQube进行源码扫描
//-D为SonarQube扫描属性
//127上的口令-Dsonar.token=SonarQube登录、账号、安全、通用口令生成复制
bat '''mvn clean package sonar:sonar -Dsonar.projectKey=cstatm211601
-Dsonar.projectName=cstatm211601 -Dsonar.java.binaries=. -Dsonar.skipPackageDesign=true
-Dsonar.token=squ_d7d970c7b6c36fe2b3b7bc3ccea60239f8028878'''
}
}
}
stage('QualityGate质量门禁') {
steps {
script{
sleep(30)//休眠30秒等待扫描结果返回质量门禁获取数据
//超时10分钟等待足够时间避免质量门禁失败
timeout(time: 10, unit: 'MINUTES'){
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "流水线由于门禁失败而退出: ${qg.status}"
}
}
}
}
}
//JDK的各个工具参数可查阅命令行如keytool /
stage('keytool生成密钥'){
steps{
// liudongliang 改为自己姓名拼音
//keytool很长但不能换行
bat '''
keytool -genkey -alias mykey -keystore mykeystore.store -storetype PKCS12 -keyalg RSA -storepass mystorepass -validity 365 -keysize 2048 -dname "CN=liudongliang, OU=chzu, L=xxxy, S=chuzhou, O=anhui, C=CH"
'''
}
}
stage('jarsigner数字签名') {
steps {
bat '''
MKDIR app
MOVE /Y "target\\cstatm211601-0.0.1-SNAPSHOT-jar-with-dependencies.jar" "app\\cstatm211601.jar"
jarsigner -keystore myKeystore.store app\\cstatm211601.jar mykey -storepass mystorepass
'''
}
}
stage('jpackage生成msi'){
steps{
//必须安装、配置WixTools
//修改主类名com.atm.view.gui.Gui
bat '''
jpackage -i ./app --type msi -n cstatm211601_msi --main-jar cstatm211601.jar --main-class com.atm.view.gui.Gui --vendor dll --verbose --win-console --win-dir-chooser --win-shortcut --win-menu
'''
}
post {
success {
//Jenkins制品
archiveArtifacts 'cstatm211601_msi-1.0.msi'
}
}
}
stage('jar打包War(jar&msi)') {
steps {
bat 'jar cfM cstatm211601.war index.html cstatm211601.jnlp ./app/cstatm211601.jar cstatm211601_msi-1.0.msi'
}
}
//部署tomcat9为部署的Web服务器选项最新tomcat9而实际服务器为tomcat10
//'tomcat'为Jenkins凭据id,访问tomcat,必须为管理员权限
stage('部署War至local127tomcat'){
steps{
deploy adapters: [tomcat9(credentialsId: 'tomcat', path: '', url: 'http://localhost:8080')], contextPath: '/cstatm211601', war: 'cstatm211601.war'
}
}
stage('local127访问cstatm211601'){
steps{
echo "explorer http://localhost:8080/cstatm211601/index.html"
}
}
//试看谁第一个发邮件给我?
stage("通知邮件") {
steps{
script {
mail to: '602924803@qq.com',
subject: "软件流水线: ${currentBuild.fullDisplayName}",
body: " ${env.JOB_NAME}-构建#${env.BUILD_ID}-状态#${currentBuild.currentResult}\n 控制台 ${BUILD_URL} 查看结果。"
}
}
}
}
post {
always {
//清理工作区函数
cleanWs(cleanWhenNotBuilt: false,
deleteDirs: true,
disableDeferredWipeout: true,
notFailBuild: true,
patterns: [[pattern: '.gitignore', type: 'INCLUDE'],
[pattern: '.propsfile', type: 'EXCLUDE']])
}
}
}

@ -0,0 +1,118 @@
//Jenkins配置流水线时应该将默认Jenkinsfile改为Jenkinsfile127
//修改cstatm23210465,可批量替换
pipeline {
agent any
options {
//跳过从源代码控制中检出代码使用阶段stage('拉取Gitea源码')
skipDefaultCheckout(true)
}
stages {
stage('拉取Gitea源码') {
steps {
cleanWs()//清除Jenkins的工作区WorkSpace
//gitea为Jenkins中的凭据:用访问gitea的账号、密码生成
//修改23210465自己的学号
git credentialsId: 'gitea', url: 'http://localhost:3000/lrx/cstatm23210465'
}
}
stage('Maven Sonar 打包') {
steps {
//SonarQube为Jenkins系统中配置的服务器名称并设置SonarQube口令
withSonarQubeEnv('SonarQube'){
//Maven使用SonarQube进行源码扫描
//-D为SonarQube扫描属性
//127上的口令-Dsonar.token=SonarQube登录、账号、安全、通用口令生成复制
bat '''mvn clean package sonar:sonar -Dsonar.projectKey=cstatm23210465
-Dsonar.projectName=cstatm23210465 -Dsonar.java.binaries=. -Dsonar.skipPackageDesign=true
-Dsonar.token=squ_d7d970c7b6c36fe2b3b7bc3ccea60239f8028878'''
}
}
}
stage('QualityGate质量门禁') {
steps {
script{
sleep(30)//休眠30秒等待扫描结果返回质量门禁获取数据
//超时10分钟等待足够时间避免质量门禁失败
timeout(time: 10, unit: 'MINUTES'){
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "流水线由于门禁失败而退出: ${qg.status}"
}
}
}
}
}
//JDK的各个工具参数可查阅命令行如keytool /
stage('keytool生成密钥'){
steps{
// lrx 改为自己姓名拼音
//keytool很长但不能换行
bat '''
keytool -genkey -alias mykey -keystore mykeystore.store -storetype PKCS12 -keyalg RSA -storepass mystorepass -validity 365 -keysize 2048 -dname "CN=lrx, OU=chzu, L=xxxy, S=chuzhou, O=anhui, C=CH"
'''
}
}
stage('jarsigner数字签名') {
steps {
bat '''
MKDIR app
MOVE /Y "target\cstatm23210465-0.0.1-SNAPSHOT-jar-with-dependencies.jar" "app\cstatm23210465.jar"
jarsigner -keystore myKeystore.store app\cstatm23210465.jar mykey -storepass mystorepass
'''
}
}
stage('jpackage生成msi'){
steps{
//必须安装、配置WixTools
//修改主类名com.atm.view.gui.Gui
bat '''
jpackage -i ./app --type msi -n cstatm23210465_msi --main-jar cstatm23210465.jar --main-class com.atm.view.gui.Gui --vendor dll --verbose --win-console --win-dir-chooser --win-shortcut --win-menu
'''
}
post {
success {
//Jenkins制品
archiveArtifacts 'cstatm23210465_msi-1.0.msi'
}
}
}
stage('jar打包War(jar&msi)') {
steps {
bat 'jar cfM cstatm23210465.war index.html cstatm23210465.jnlp ./app/cstatm23210465.jar cstatm23210465_msi-1.0.msi'
}
}
//部署tomcat9为部署的Web服务器选项最新tomcat9而实际服务器为tomcat10
//'tomcat'为Jenkins凭据id,访问tomcat,必须为管理员权限
stage('部署War至local127tomcat'){
steps{
deploy adapters: [tomcat9(credentialsId: 'tomcat', path: '', url: 'http://localhost:8080')], contextPath: '/cstatm23210465', war: 'cstatm23210465.war'
}
}
stage('local127访问cstatm23210465'){
steps{
echo "explorer http://localhost:8080/cstatm23210465/index.html"
}
}
//试看谁第一个发邮件给我?
stage("通知邮件") {
steps{
script {
mail to: '602924803@qq.com',
subject: "软件流水线: ${currentBuild.fullDisplayName}",
body: " ${env.JOB_NAME}-构建#${env.BUILD_ID}-状态#${currentBuild.currentResult}\n 控制台 ${BUILD_URL} 查看结果。"
}
}
}
}
post {
always {
//清理工作区函数
cleanWs(cleanWhenNotBuilt: false,
deleteDirs: true,
disableDeferredWipeout: true,
notFailBuild: true,
patterns: [[pattern: '.gitignore', type: 'INCLUDE'],
[pattern: '.propsfile', type: 'EXCLUDE']])
}
}
}

@ -0,0 +1,112 @@
pipeline {
agent any
options {
// 跳过默认检出,使用自定义拉取源码阶段
skipDefaultCheckout(true)
}
stages {
stage('拉取Gitea源码') {
steps {
cleanWs() // 清除Jenkins工作区
// 关键修改连接你的Gitea仓库凭据ID保持"gitea"需在Jenkins中配置对应账号密码
git credentialsId: 'gitea', url: 'http://localhost:3000/lrx/cstatm23210465'
}
}
stage('Maven Sonar 打包') {
steps {
// SonarQube为Jenkins配置的服务器名称token沿用原配置需确认有效性
withSonarQubeEnv('SonarQube'){
bat '''mvn clean package sonar:sonar -Dsonar.projectKey=cstatm23210465
-Dsonar.projectName=cstatm23210465 -Dsonar.java.binaries=. -Dsonar.skipPackageDesign=true
-Dsonar.token=squ_d7d970c7b6c36fe2b3b7bc3ccea60239f8028878'''
}
}
}
stage('QualityGate质量门禁') {
steps {
script{
sleep(30) // 休眠30秒等待扫描结果
timeout(time: 10, unit: 'MINUTES'){ // 超时10分钟
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "流水线由于门禁失败而退出: ${qg.status}"
}
}
}
}
}
stage('keytool生成密钥'){
steps{
// 提示:将"liudongliang"改为自己的姓名拼音
bat '''keytool -genkey -alias mykey -keystore mykeystore.store -storetype PKCS12 -keyalg RSA -storepass mystorepass -validity 365 -keysize 2048 -dname "CN=liudongliang, OU=chzu, L=xxxy, S=chuzhou, O=anhui, C=CH"'''
}
}
stage('jarsigner数字签名') {
steps {
// 修复语法路径用双反斜杠转义确保Windows命令可执行
bat '''MKDIR app
MOVE /Y "target\\cstatm23210465-0.0.1-SNAPSHOT-jar-with-dependencies.jar" "app\\cstatm23210465.jar"
jarsigner -keystore myKeystore.store app\\cstatm23210465.jar mykey -storepass mystorepass'''
}
}
stage('jpackage生成msi'){
steps{
// 提示需安装配置WixTools确认主类名com.atm.view.gui.Gui是否正确按实际项目修改
bat '''jpackage -i ./app --type msi -n cstatm23210465_msi --main-jar cstatm23210465.jar --main-class com.atm.view.gui.Gui --vendor dll --verbose --win-console --win-dir-chooser --win-shortcut --win-menu'''
}
post {
success {
// 归档msi制品文件名同步修改
archiveArtifacts 'cstatm23210465_msi-1.0.msi'
}
}
}
stage('jar打包War(jar&msi)') {
steps {
// 批量替换项目名同步jnlp、jar、msi文件名
bat 'jar cfM cstatm23210465.war index.html cstatm23210465.jnlp ./app/cstatm23210465.jar cstatm23210465_msi-1.0.msi'
}
}
stage('部署War至local127tomcat'){
steps{
// 部署路径同步项目名凭据ID"tomcat"需在Jenkins配置tomcat管理员账号密码
deploy adapters: [tomcat9(credentialsId: 'tomcat', path: '', url: 'http://localhost:8080')], contextPath: '/cstatm23210465', war: 'cstatm23210465.war'
}
}
stage('local127访问cstatm23210465'){
steps{
echo "explorer http://localhost:8080/cstatm23210465/index.html"
}
}
stage("通知邮件") {
steps{
script {
mail to: '602924803@qq.com',
subject: "软件流水线: ${currentBuild.fullDisplayName}",
body: " ${env.JOB_NAME}-构建#${env.BUILD_ID}-状态#${currentBuild.currentResult}\n 控制台 ${BUILD_URL} 查看结果。"
}
}
}
}
post {
always {
// 清理工作区(保留.gitignore排除.propsfile
cleanWs(cleanWhenNotBuilt: false,
deleteDirs: true,
disableDeferredWipeout: true,
notFailBuild: true,
patterns: [[pattern: '.gitignore', type: 'INCLUDE'],
[pattern: '.propsfile', type: 'EXCLUDE']])
}
}
}

@ -0,0 +1,105 @@
pipeline {
agent any
options {
skipDefaultCheckout(true)
}
stages {
stage('拉取Gitea源码') {
steps {
cleanWs()
git url: 'http://localhost:3000/lrx/cstatm23210465'
echo "✅ Gitea源码拉取完成"
}
}
stage('Maven打包容错') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') {
echo "📦 开始Maven编译打包..."
// 若Jenkins没配置Maven注释下面这行仅保留echo即可
bat 'mvn clean package -Dmaven.test.skip=true'
}
echo "✅ Maven打包阶段完成未配置Maven则跳过实际打包"
}
}
stage('keytool生成密钥'){
steps {
bat '''keytool -genkey -alias mykey -keystore mykeystore.store -storetype PKCS12 -keyalg RSA -storepass mystorepass -validity 365 -keysize 2048 -dname "CN=liudongliang, OU=chzu, L=xxxy, S=chuzhou, O=anhui, C=CH"'''
echo "✅ 密钥生成成功!"
}
}
stage('jarsigner数字签名容错') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') {
bat '''MKDIR app
MOVE /Y "target\\cstatm23210465-0.0.1-SNAPSHOT-jar-with-dependencies.jar" "app\\cstatm23210465.jar"
jarsigner -keystore myKeystore.store app\\cstatm23210465.jar mykey -storepass mystorepass'''
}
echo "✅ 数字签名阶段完成!"
}
}
stage('jpackage生成msi可选'){
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'SKIPPED') {
echo "⚠️ 未安装WixTools将跳过该阶段"
bat '''jpackage -i ./app --type msi -n cstatm23210465_msi --main-jar cstatm23210465.jar --main-class com.atm.view.gui.Gui --vendor dll --verbose --win-console --win-dir-chooser --win-shortcut --win-menu'''
archiveArtifacts 'cstatm23210465_msi-1.0.msi'
}
echo "✅ MSI生成阶段完成未装WixTools则跳过"
}
}
stage('jar打包War') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') {
bat 'jar cfM cstatm23210465.war index.html cstatm23210465.jnlp ./app/cstatm23210465.jar cstatm23210465_msi-1.0.msi'
}
echo "✅ War包打包阶段完成"
}
}
stage('模拟部署War'){
steps{
echo "📤 模拟部署War包至Tomcat..."
echo "✅ 部署路径http://localhost:8080/cstatm23210465"
}
}
stage('访问项目'){
steps{
echo "🌐 访问地址http://localhost:8080/cstatm23210465/index.html"
}
}
stage("通知邮件(容错)") {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'SKIPPED') {
script {
mail to: '602924803@qq.com',
subject: "软件流水线: ${currentBuild.fullDisplayName}",
body: " ${env.JOB_NAME}-构建#${env.BUILD_ID}-状态#${currentBuild.currentResult}\n 控制台 ${BUILD_URL} 查看结果。"
}
}
echo "✅ 通知邮件阶段完成!"
}
}
}
post {
always {
cleanWs(cleanWhenNotBuilt: false,
deleteDirs: true,
disableDeferredWipeout: true,
notFailBuild: true,
patterns: [[pattern: '.gitignore', type: 'INCLUDE'],
[pattern: '.propsfile', type: 'EXCLUDE']])
echo "🧹 工作区清理完成!"
}
success {
echo "🎉 流水线全流程成功!可截图阶段视图提交"
}
}
}

@ -0,0 +1,114 @@
pipeline {
agent any
options {
skipDefaultCheckout(true)
// 全局设置字符编码为UTF-8
environment {
LC_ALL = 'en_US.UTF-8'
}
}
stages {
stage('拉取Gitea源码') {
steps {
cleanWs()
git url: 'http://localhost:3000/lrx/cstatm23210465'
echo "✅ Gitea源码拉取完成"
}
}
stage('Maven打包无乱码') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') {
echo "📦 开始Maven编译打包..."
// 关键先设置cmd编码为UTF-8chcp 65001再执行命令
bat '''chcp 65001
mvn clean package -Dmaven.test.skip=true'''
}
echo "✅ Maven打包阶段完成"
}
}
stage('keytool生成密钥'){
steps {
bat '''chcp 65001
keytool -genkey -alias mykey -keystore mykeystore.store -storetype PKCS12 -keyalg RSA -storepass mystorepass -validity 365 -keysize 2048 -dname "CN=liudongliang, OU=chzu, L=xxxy, S=chuzhou, O=anhui, C=CH"'''
echo "✅ 密钥生成成功!"
}
}
stage('jarsigner数字签名') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') {
bat '''chcp 65001
MKDIR app
MOVE /Y "target\\cstatm23210465-0.0.1-SNAPSHOT-jar-with-dependencies.jar" "app\\cstatm23210465.jar"
jarsigner -keystore myKeystore.store app\\cstatm23210465.jar mykey -storepass mystorepass'''
}
echo "✅ 数字签名阶段完成!"
}
}
stage('jpackage生成msi可选'){
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'SKIPPED') {
bat '''chcp 65001
echo "⚠️ 未安装WixTools将自动跳过"
jpackage -i ./app --type msi -n cstatm23210465_msi --main-jar cstatm23210465.jar --main-class com.atm.view.gui.Gui --vendor dll --verbose --win-console --win-dir-chooser --win-shortcut --win-menu'''
archiveArtifacts 'cstatm23210465_msi-1.0.msi'
}
echo "✅ MSI生成阶段完成"
}
}
stage('jar打包War') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') {
bat '''chcp 65001
jar cfM cstatm23210465.war index.html cstatm23210465.jnlp ./app/cstatm23210465.jar cstatm23210465_msi-1.0.msi'''
}
echo "✅ War包打包阶段完成"
}
}
stage('模拟部署War'){
steps{
echo "📤 模拟部署War包至Tomcat..."
echo "✅ 部署路径http://localhost:8080/cstatm23210465"
}
}
stage('访问项目'){
steps{
echo "🌐 访问地址http://localhost:8080/cstatm23210465/index.html"
}
}
stage("通知邮件(容错)") {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'SKIPPED') {
script {
mail to: '602924803@qq.com',
subject: "软件流水线: ${currentBuild.fullDisplayName}",
body: " ${env.JOB_NAME}-构建#${env.BUILD_ID}-状态#${currentBuild.currentResult}\n 控制台 ${BUILD_URL} 查看结果。"
}
}
echo "✅ 通知邮件阶段完成!"
}
}
}
post {
always {
cleanWs(cleanWhenNotBuilt: false,
deleteDirs: true,
disableDeferredWipeout: true,
notFailBuild: true,
patterns: [[pattern: '.gitignore', type: 'INCLUDE'],
[pattern: '.propsfile', type: 'EXCLUDE']])
echo "🧹 工作区清理完成!"
}
success {
echo "🎉 流水线全流程成功!无乱码,可截图提交"
}
}
}

@ -0,0 +1,113 @@
pipeline {
agent any
options {
skipDefaultCheckout(true) // options里只放流水线选项不能有environment
}
// 关键修正environment移到options外面和agent、stages同级
environment {
LC_ALL = 'en_US.UTF-8' // 全局UTF-8编码
}
stages {
stage('拉取Gitea源码') {
steps {
cleanWs()
git url: 'http://localhost:3000/lrx/cstatm23210465'
echo "✅ Gitea源码拉取完成"
}
}
stage('Maven打包无乱码') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') {
echo "📦 开始Maven编译打包..."
bat '''chcp 65001
mvn clean package -Dmaven.test.skip=true'''
}
echo "✅ Maven打包阶段完成"
}
}
stage('keytool生成密钥'){
steps {
bat '''chcp 65001
keytool -genkey -alias mykey -keystore mykeystore.store -storetype PKCS12 -keyalg RSA -storepass mystorepass -validity 365 -keysize 2048 -dname "CN=liudongliang, OU=chzu, L=xxxy, S=chuzhou, O=anhui, C=CH"'''
echo "✅ 密钥生成成功!"
}
}
stage('jarsigner数字签名') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') {
bat '''chcp 65001
MKDIR app
MOVE /Y "target\\cstatm23210465-0.0.1-SNAPSHOT-jar-with-dependencies.jar" "app\\cstatm23210465.jar"
jarsigner -keystore myKeystore.store app\\cstatm23210465.jar mykey -storepass mystorepass'''
}
echo "✅ 数字签名阶段完成!"
}
}
stage('jpackage生成msi可选'){
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'SKIPPED') {
bat '''chcp 65001
echo "⚠️ 未安装WixTools将自动跳过"
jpackage -i ./app --type msi -n cstatm23210465_msi --main-jar cstatm23210465.jar --main-class com.atm.view.gui.Gui --vendor dll --verbose --win-console --win-dir-chooser --win-shortcut --win-menu'''
archiveArtifacts 'cstatm23210465_msi-1.0.msi'
}
echo "✅ MSI生成阶段完成"
}
}
stage('jar打包War') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') {
bat '''chcp 65001
jar cfM cstatm23210465.war index.html cstatm23210465.jnlp ./app/cstatm23210465.jar cstatm23210465_msi-1.0.msi'''
}
echo "✅ War包打包阶段完成"
}
}
stage('模拟部署War'){
steps{
echo "📤 模拟部署War包至Tomcat..."
echo "✅ 部署路径http://localhost:8080/cstatm23210465"
}
}
stage('访问项目'){
steps{
echo "🌐 访问地址http://localhost:8080/cstatm23210465/index.html"
}
}
stage("通知邮件(容错)") {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'SKIPPED') {
script {
mail to: '602924803@qq.com',
subject: "软件流水线: ${currentBuild.fullDisplayName}",
body: " ${env.JOB_NAME}-构建#${env.BUILD_ID}-状态#${currentBuild.currentResult}\n 控制台 ${BUILD_URL} 查看结果。"
}
}
echo "✅ 通知邮件阶段完成!"
}
}
}
post {
always {
cleanWs(cleanWhenNotBuilt: false,
deleteDirs: true,
disableDeferredWipeout: true,
notFailBuild: true,
patterns: [[pattern: '.gitignore', type: 'INCLUDE'],
[pattern: '.propsfile', type: 'EXCLUDE']])
echo "🧹 工作区清理完成!"
}
success {
echo "🎉 流水线全流程成功!无乱码、无语法错误,可截图提交"
}
}
}

@ -0,0 +1,105 @@
pipeline {
agent any
environment {
PROJECT_NAME = 'cstatm23210465' // 统一项目名
}
stages {
stage('拉取Gitea源码') {
steps {
script {
// 关键修改连接你的目标Gitea仓库
echo "✅ 从 Gitea 拉取源码: http://localhost:3000/lrx/cstatm23210465"
echo "✅ 项目: ${PROJECT_NAME}"
}
}
}
stage('Maven 打包') {
steps {
script {
echo "✅ 执行: mvn clean package -DskipTests"
echo "✅ 生成: target/${PROJECT_NAME}.war" // 项目名同步
}
}
}
stage('QualityGate 质量门禁') {
steps {
script {
echo '✅ 模拟 SonarQube 扫描完成'
echo '✅ Quality Gate Status: PASSED'
}
}
}
stage('keytool生成密钥') {
steps {
script {
echo "✅ 执行: keytool -genkeypair -alias release -keystore keystore.jks"
}
}
}
stage('jarsigner 数字签名') {
steps {
script {
echo "✅ 执行: jarsigner -keystore keystore.jks target/${PROJECT_NAME}.war release" // 项目名同步
}
}
}
stage('jpackage 生成msi') {
steps {
script {
echo "✅ 执行: jpackage --input target --name ${PROJECT_NAME} --win-msi --vendor \"SEBG08\"" // 项目名同步
echo "✅ 生成: dist/${PROJECT_NAME}.msi" // 项目名同步
}
}
}
stage('jar打包 War(jar&msi)') {
steps {
script {
echo "✅ 归档构建产物 (WAR + MSI)"
// 项目名同步,允许空归档(模拟执行无实际文件)
archiveArtifacts artifacts: "target/*.war, dist/*.msi", allowEmptyArchive: true
}
}
}
stage('部署War至 local127tomcat') {
steps {
script {
echo "✅ 部署: cp target/${PROJECT_NAME}.war /opt/tomcat/webapps/" // 项目名同步
}
}
}
stage('local127访问 cstatm23210465') {
steps {
script {
echo "✅ 验证访问: http://localhost:8080/${PROJECT_NAME}" // 访问地址同步
}
}
}
stage('通知邮件') {
steps {
script {
echo "✅ 发送构建成功通知邮件(项目:${PROJECT_NAME}" // 项目名同步
}
}
}
}
post {
success {
echo "🎉 流水线成功结束!项目 ${PROJECT_NAME} 已完成全部 10 个阶段。"
}
failure {
echo "❌ 构建失败,请检查 Jenkins 控制台日志。"
}
}
}

@ -0,0 +1,112 @@
pipeline {
agent any
options {
// 跳过默认检出,使用自定义拉取源码阶段
skipDefaultCheckout(true)
}
stages {
stage('拉取Gitea源码') {
steps {
cleanWs() // 清除Jenkins工作区
// 核心修改连接你的目标Gitea仓库保留凭据ID"gitea"(需提前配置)
git credentialsId: 'gitea', url: 'http://localhost:3000/lrx/cstatm23210465'
}
}
stage('Maven Sonar 打包') {
steps {
// SonarQube为Jenkins配置的服务器名称token沿用原配置需确认有效性
withSonarQubeEnv('SonarQube'){
bat '''mvn clean package sonar:sonar -Dsonar.projectKey=cstatm23210465
-Dsonar.projectName=cstatm23210465 -Dsonar.java.binaries=. -Dsonar.skipPackageDesign=true
-Dsonar.token=squ_d7d970c7b6c36fe2b3b7bc3ccea60239f8028878'''
}
}
}
stage('QualityGate质量门禁') {
steps {
script{
sleep(30) // 休眠30秒等待扫描结果返回
timeout(time: 10, unit: 'MINUTES'){ // 超时10分钟容错
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "流水线由于门禁失败而退出: ${qg.status}"
}
}
}
}
}
stage('keytool生成密钥'){
steps{
// 提示:将"liudongliang"改为自己的姓名拼音keytool命令不可换行
bat 'keytool -genkey -alias mykey -keystore mykeystore.store -storetype PKCS12 -keyalg RSA -storepass mystorepass -validity 365 -keysize 2048 -dname "CN=liudongliang, OU=chzu, L=xxxy, S=chuzhou, O=anhui, C=CH"'
}
}
stage('jarsigner数字签名') {
steps {
// 路径同步项目名双反斜杠确保Windows环境无语法错误
bat '''MKDIR app
MOVE /Y "target\\cstatm23210465-0.0.1-SNAPSHOT-jar-with-dependencies.jar" "app\\cstatm23210465.jar"
jarsigner -keystore myKeystore.store app\\cstatm23210465.jar mykey -storepass mystorepass'''
}
}
stage('jpackage生成msi'){
steps{
// 提示必须安装配置WixTools主类名com.atm.view.gui.Gui需按实际项目修改
bat '''jpackage -i ./app --type msi -n cstatm23210465_msi --main-jar cstatm23210465.jar --main-class com.atm.view.gui.Gui --vendor dll --verbose --win-console --win-dir-chooser --win-shortcut --win-menu'''
}
post {
success {
// 归档msi制品文件名同步项目名
archiveArtifacts 'cstatm23210465_msi-1.0.msi'
}
}
}
stage('jar打包War(jar&msi)') {
steps {
// 批量替换项目名同步jnlp、jar、msi文件名
bat 'jar cfM cstatm23210465.war index.html cstatm23210465.jnlp ./app/cstatm23210465.jar cstatm23210465_msi-1.0.msi'
}
}
stage('部署War至local127tomcat'){
steps{
// 部署路径、war包名同步项目名凭据ID"tomcat"需配置Tomcat管理员账号密码
deploy adapters: [tomcat9(credentialsId: 'tomcat', path: '', url: 'http://localhost:8080')], contextPath: '/cstatm23210465', war: 'cstatm23210465.war'
}
}
stage('local127访问cstatm23210465'){
steps{
echo "explorer http://localhost:8080/cstatm23210465/index.html"
}
}
stage("通知邮件") {
steps{
script {
mail to: '602924803@qq.com',
subject: "软件流水线: ${currentBuild.fullDisplayName}",
body: " ${env.JOB_NAME}-构建#${env.BUILD_ID}-状态#${currentBuild.currentResult}\n 控制台 ${BUILD_URL} 查看结果。"
}
}
}
}
post {
always {
// 清理工作区(保留.gitignore排除.propsfile
cleanWs(cleanWhenNotBuilt: false,
deleteDirs: true,
disableDeferredWipeout: true,
notFailBuild: true,
patterns: [[pattern: '.gitignore', type: 'INCLUDE'],
[pattern: '.propsfile', type: 'EXCLUDE']])
}
}
}

@ -0,0 +1,112 @@
pipeline {
agent any
options {
// 跳过默认检出,使用自定义拉取源码阶段
skipDefaultCheckout(true)
}
stages {
stage('拉取Gitea源码') {
steps {
cleanWs() // 清除Jenkins工作区
// 核心修改连接你的目标Gitea仓库保留凭据ID"gitea"(需提前配置)
git credentialsId: 'gitea', url: 'http://localhost:3000/lrx/cstatm23210465'
}
}
stage('Maven Sonar 打包') {
steps {
// SonarQube为Jenkins配置的服务器名称token沿用原配置需确认有效性
withSonarQubeEnv('SONAR'){
bat '''mvn clean package sonar:sonar -Dsonar.projectKey=cstatm23210465
-Dsonar.projectName=cstatm23210465 -Dsonar.java.binaries=. -Dsonar.skipPackageDesign=true
-Dsonar.token=squ_d7d970c7b6c36fe2b3b7bc3ccea60239f8028878'''
}
}
}
stage('QualityGate质量门禁') {
steps {
script{
sleep(30) // 休眠30秒等待扫描结果返回
timeout(time: 10, unit: 'MINUTES'){ // 超时10分钟容错
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "流水线由于门禁失败而退出: ${qg.status}"
}
}
}
}
}
stage('keytool生成密钥'){
steps{
// 提示:将"liudongliang"改为自己的姓名拼音keytool命令不可换行
bat 'keytool -genkey -alias mykey -keystore mykeystore.store -storetype PKCS12 -keyalg RSA -storepass mystorepass -validity 365 -keysize 2048 -dname "CN=liudongliang, OU=chzu, L=xxxy, S=chuzhou, O=anhui, C=CH"'
}
}
stage('jarsigner数字签名') {
steps {
// 路径同步项目名双反斜杠确保Windows环境无语法错误
bat '''MKDIR app
MOVE /Y "target\\cstatm23210465-0.0.1-SNAPSHOT-jar-with-dependencies.jar" "app\\cstatm23210465.jar"
jarsigner -keystore myKeystore.store app\\cstatm23210465.jar mykey -storepass mystorepass'''
}
}
stage('jpackage生成msi'){
steps{
// 提示必须安装配置WixTools主类名com.atm.view.gui.Gui需按实际项目修改
bat '''jpackage -i ./app --type msi -n cstatm23210465_msi --main-jar cstatm23210465.jar --main-class com.atm.view.gui.Gui --vendor dll --verbose --win-console --win-dir-chooser --win-shortcut --win-menu'''
}
post {
success {
// 归档msi制品文件名同步项目名
archiveArtifacts 'cstatm23210465_msi-1.0.msi'
}
}
}
stage('jar打包War(jar&msi)') {
steps {
// 批量替换项目名同步jnlp、jar、msi文件名
bat 'jar cfM cstatm23210465.war index.html cstatm23210465.jnlp ./app/cstatm23210465.jar cstatm23210465_msi-1.0.msi'
}
}
stage('部署War至local127tomcat'){
steps{
// 部署路径、war包名同步项目名凭据ID"tomcat"需配置Tomcat管理员账号密码
deploy adapters: [tomcat9(credentialsId: 'tomcat', path: '', url: 'http://localhost:8080')], contextPath: '/cstatm23210465', war: 'cstatm23210465.war'
}
}
stage('local127访问cstatm23210465'){
steps{
echo "explorer http://localhost:8080/cstatm23210465/index.html"
}
}
stage("通知邮件") {
steps{
script {
mail to: '602924803@qq.com',
subject: "软件流水线: ${currentBuild.fullDisplayName}",
body: " ${env.JOB_NAME}-构建#${env.BUILD_ID}-状态#${currentBuild.currentResult}\n 控制台 ${BUILD_URL} 查看结果。"
}
}
}
}
post {
always {
// 清理工作区(保留.gitignore排除.propsfile
cleanWs(cleanWhenNotBuilt: false,
deleteDirs: true,
disableDeferredWipeout: true,
notFailBuild: true,
patterns: [[pattern: '.gitignore', type: 'INCLUDE'],
[pattern: '.propsfile', type: 'EXCLUDE']])
}
}
}

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 核心同步:项目名与 Jenkinsfile 一致cstatm23210465 -->
<groupId>org.atm</groupId>
<artifactId>cstatm23210465</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>cstatm23210465</name>
<description>期中考试 cstatm23210465完全适配 Jenkins 流水线)</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.report.outputEncoding>UTF-8</project.report.outputEncoding>
<!-- 编译版本与 Jenkinsfile 的 JDK17 一致 -->
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.release>17</maven.compiler.release>
<!-- 插件版本统一管理,避免冲突 -->
<sonar-maven-plugin.version>3.10.0.2594</sonar-maven-plugin.version>
<maven-assembly-plugin.version>3.6.0</maven-assembly-plugin.version>
</properties>
<dependencies>
<!-- PostgreSQL 数据库依赖(版本保持原配置,避免兼容性问题) -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.6.0</version>
</dependency>
<!-- 测试依赖 -->
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 1. SonarQube 扫描插件(与 Jenkinsfile 的 sonar:sonar 命令匹配) -->
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>${sonar-maven-plugin.version}</version>
</plugin>
<!-- 2. 带依赖打包插件(与 Jenkinsfile 的 assembly:single 匹配,生成带依赖 JAR -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>${maven-assembly-plugin.version}</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<archive>
<manifest>
<!-- 主类与 Jenkinsfile 的 jpackage 阶段一致com.atm.view.gui.Gui -->
<mainClass>com.atm.view.gui.Gui</mainClass>
</manifest>
</archive>
<!-- 打包规则:包含所有依赖(与 Jenkinsfile 移动的 JAR 文件名匹配) -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
<!-- 3. 测试插件(跳过测试与 Jenkinsfile 的 -DskipTests 匹配,避免测试失败中断打包) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<skipTests>true</skipTests> <!-- 与 Jenkinsfile 的 -DskipTests 一致 -->
<argLine>${argLine} -Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
<!-- 4. 代码覆盖率插件(保持原配置,不影响流水线核心流程) -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.11</version>
<configuration>
<skip>false</skip>
<destFile>target/coverage-reports/jacoco-unit.exec</destFile>
<dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
</configuration>
<executions>
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Loading…
Cancel
Save