JLBA202505130001_关于吉林银行新建AI智能培训系统的需求_完善代码规范
This commit is contained in:
+142
-136
@@ -1,5 +1,7 @@
|
||||
pipeline {
|
||||
agent {label 'macos'}
|
||||
agent {
|
||||
label 'macos'
|
||||
}
|
||||
tools {
|
||||
nodejs 'node22'
|
||||
}
|
||||
@@ -82,140 +84,140 @@ pipeline {
|
||||
echo "✅ 版本号:${env.versionCode}"
|
||||
}
|
||||
}
|
||||
//stage('安装证书 & 描述文件') {
|
||||
// steps {
|
||||
// echo "# =============== 安装 p12 证书 ==============="
|
||||
// sh '''
|
||||
// security unlock-keychain -p ${MAC_LOGIN_PWD} ~/Library/Keychains/login.keychain-db >/dev/null 2>&1
|
||||
// security import ${P12_FILE} -k ~/Library/Keychains/login.keychain-db -P ${P12_PASSWORD} -A >/dev/null 2>&1
|
||||
// security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k ${MAC_LOGIN_PWD} ~/Library/Keychains/login.keychain-db >/dev/null 2>&1
|
||||
// '''
|
||||
// echo "# =============== 安装描述文件 ==============="
|
||||
// sh '''
|
||||
// mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles"
|
||||
// cp "${PROFILE_FILE}" "$HOME/Library/MobileDevice/Provisioning Profiles/"
|
||||
// '''
|
||||
// }
|
||||
//}
|
||||
//stage('打包uniapp') {
|
||||
// steps {
|
||||
// sh "npm run build:app-plus:${env.BRANCH_NAME}"
|
||||
// }
|
||||
//}
|
||||
//stage('复制UniApp资源到目录') {
|
||||
// steps {
|
||||
// echo "开始复制 dist 资源到 ${ASSETS_DIR}"
|
||||
// // 先创建目标目录(防止目录不存在报错)
|
||||
// sh "mkdir -p ${ASSETS_DIR}"
|
||||
// // 把 dist 里所有文件 复制 到安卓资源目录(推荐)
|
||||
// sh "cp -rf dist/build/app/* ${ASSETS_DIR}/"
|
||||
// echo "✅ 资源复制完成"
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//stage('️清理旧构建内容') {
|
||||
// steps {
|
||||
// sh """
|
||||
// xcodebuild clean \\
|
||||
// -project ${APP_DIR}/${PROJECT_NAME}.xcodeproj \\
|
||||
// -scheme ${SCHEME_NAME} \\
|
||||
// -configuration ${CONFIGURATION}
|
||||
// """
|
||||
//
|
||||
// }
|
||||
//}
|
||||
//stage('创建SDK软链接') {
|
||||
// steps {
|
||||
// sh '''
|
||||
// # 删除旧的软链接/目录
|
||||
// rm -rf "${TARGET_LINK}"
|
||||
//
|
||||
// # 创建软链接(不进入任何目录)
|
||||
// ln -s "${SOURCE_SDK}" "${TARGET_LINK}"
|
||||
//
|
||||
// # 验证链接是否生效
|
||||
// ls -la "${TARGET_LINK}"
|
||||
// '''
|
||||
// }
|
||||
//}
|
||||
//stage('✅ 开始归档(静默模式)') {
|
||||
// steps {
|
||||
// script {
|
||||
// // Groovy 里拼接命令,随便写注释,不会影响 shell
|
||||
// def xcodeCommand = [
|
||||
// 'xcodebuild archive',
|
||||
// // 项目路径
|
||||
// "-project ${APP_DIR}/${PROJECT_NAME}.xcodeproj",
|
||||
// // Scheme 配置
|
||||
// "-scheme ${SCHEME_NAME}",
|
||||
// // 编译模式 Release/Debug
|
||||
// "-configuration ${CONFIGURATION}",
|
||||
// // 归档输出路径
|
||||
// "-archivePath ${ARCHIVE_PATH}",
|
||||
// // 平台通用 iOS
|
||||
// "-destination generic/platform=iOS",
|
||||
// // 版本号
|
||||
// "MARKETING_VERSION=${versionName}",
|
||||
// "CURRENT_PROJECT_VERSION=${versionCode}",
|
||||
//
|
||||
// // 手动签名
|
||||
// "CODE_SIGN_STYLE=Manual",
|
||||
// "CODE_SIGN_IDENTITY='${CERTIFICATE_NAME}'",
|
||||
// "PROVISIONING_PROFILE_SPECIFIER='${PROVISIONING_PROFILE_UUID}'",
|
||||
// "PROVISIONING_PROFILE='${PROVISIONING_PROFILE_UUID}'",
|
||||
// "DEVELOPMENT_TEAM='${DEVELOPMENT_TEAM}'",
|
||||
//
|
||||
// // 钥匙串
|
||||
// "OTHER_CODE_SIGN_FLAGS='--keychain ~/Library/Keychains/login.keychain-db'",
|
||||
//
|
||||
// // 编译所有架构
|
||||
// "ONLY_ACTIVE_ARCH=NO",
|
||||
//
|
||||
// // 清空编译参数
|
||||
// "OTHER_CFLAGS=''",
|
||||
// "OTHER_CPLUSPLUS_FLAGS=''",
|
||||
// "OTHER_SWIFT_FLAGS=''",
|
||||
// "> /dev/null 2>&1"
|
||||
// ].join(' ') // 拼接成一行完整命令
|
||||
// // 打印最终命令
|
||||
// echo "执行命令:${xcodeCommand}"
|
||||
// // 执行!
|
||||
// sh(xcodeCommand)
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
//stage('✅ 开始导出 IPA安装包') {
|
||||
// steps {
|
||||
// sh '''
|
||||
// xcodebuild -exportArchive \\
|
||||
// -archivePath ${ARCHIVE_PATH} \\
|
||||
// -exportPath ${APP_DIR}/build \\
|
||||
// -exportOptionsPlist ${EXPORT_OPTIONS_PLIST} \\
|
||||
// -allowProvisioningUpdates
|
||||
// '''
|
||||
// }
|
||||
//}
|
||||
//stage('🚀 验证并上传 TestFlight') {
|
||||
// steps {
|
||||
// echo "✅ 开始验证 IPA 有效性"
|
||||
// sh '''
|
||||
// mkdir -p $HOME/private_keys
|
||||
// cp -f "${P8_FILE}" $HOME/private_keys/
|
||||
// '''
|
||||
// // 1. 先验证 IPA(必须这一步,提前拦截错误)
|
||||
// sh """
|
||||
// xcrun altool --validate-app \\
|
||||
// --file ${APP_DIR}/build/${SCHEME_NAME}.ipa \\
|
||||
// --type ${API_TYPE} \\
|
||||
// --apiKey ${API_KEY} \\
|
||||
// --apiIssuer ${API_ISSUER}
|
||||
// """
|
||||
//
|
||||
// echo "✅ IPA 验证成功!开始上传到 TestFlight"
|
||||
//
|
||||
// echo "🎉 全部完成!请到 App Store Connect TestFlight 查看构建"
|
||||
// }
|
||||
//}
|
||||
stage('安装证书 & 描述文件') {
|
||||
steps {
|
||||
echo "# =============== 安装 p12 证书 ==============="
|
||||
sh '''
|
||||
security unlock-keychain -p ${MAC_LOGIN_PWD} ~/Library/Keychains/login.keychain-db >/dev/null 2>&1
|
||||
security import ${P12_FILE} -k ~/Library/Keychains/login.keychain-db -P ${P12_PASSWORD} -A >/dev/null 2>&1
|
||||
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k ${MAC_LOGIN_PWD} ~/Library/Keychains/login.keychain-db >/dev/null 2>&1
|
||||
'''
|
||||
echo "# =============== 安装描述文件 ==============="
|
||||
sh '''
|
||||
mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles"
|
||||
cp "${PROFILE_FILE}" "$HOME/Library/MobileDevice/Provisioning Profiles/"
|
||||
'''
|
||||
}
|
||||
}
|
||||
stage('打包uniapp') {
|
||||
steps {
|
||||
sh "npm run build:app-plus:${env.BRANCH_NAME}"
|
||||
}
|
||||
}
|
||||
stage('复制UniApp资源到目录') {
|
||||
steps {
|
||||
echo "开始复制 dist 资源到 ${ASSETS_DIR}"
|
||||
// 先创建目标目录(防止目录不存在报错)
|
||||
sh "mkdir -p ${ASSETS_DIR}"
|
||||
// 把 dist 里所有文件 复制 到安卓资源目录(推荐)
|
||||
sh "cp -rf dist/build/app/* ${ASSETS_DIR}/"
|
||||
echo "✅ 资源复制完成"
|
||||
}
|
||||
}
|
||||
|
||||
stage('️清理旧构建内容') {
|
||||
steps {
|
||||
sh """
|
||||
xcodebuild clean \\
|
||||
-project ${APP_DIR}/${PROJECT_NAME}.xcodeproj \\
|
||||
-scheme ${SCHEME_NAME} \\
|
||||
-configuration ${CONFIGURATION}
|
||||
"""
|
||||
|
||||
}
|
||||
}
|
||||
stage('创建SDK软链接') {
|
||||
steps {
|
||||
sh '''
|
||||
# 删除旧的软链接/目录
|
||||
rm -rf "${TARGET_LINK}"
|
||||
|
||||
# 创建软链接(不进入任何目录)
|
||||
ln -s "${SOURCE_SDK}" "${TARGET_LINK}"
|
||||
|
||||
# 验证链接是否生效
|
||||
ls -la "${TARGET_LINK}"
|
||||
'''
|
||||
}
|
||||
}
|
||||
stage('✅ 开始归档(静默模式)') {
|
||||
steps {
|
||||
script {
|
||||
// Groovy 里拼接命令,随便写注释,不会影响 shell
|
||||
def xcodeCommand = [
|
||||
'xcodebuild archive',
|
||||
// 项目路径
|
||||
"-project ${APP_DIR}/${PROJECT_NAME}.xcodeproj",
|
||||
// Scheme 配置
|
||||
"-scheme ${SCHEME_NAME}",
|
||||
// 编译模式 Release/Debug
|
||||
"-configuration ${CONFIGURATION}",
|
||||
// 归档输出路径
|
||||
"-archivePath ${ARCHIVE_PATH}",
|
||||
// 平台通用 iOS
|
||||
"-destination generic/platform=iOS",
|
||||
// 版本号
|
||||
"MARKETING_VERSION=${versionName}",
|
||||
"CURRENT_PROJECT_VERSION=${versionCode}",
|
||||
|
||||
// 手动签名
|
||||
"CODE_SIGN_STYLE=Manual",
|
||||
"CODE_SIGN_IDENTITY='${CERTIFICATE_NAME}'",
|
||||
"PROVISIONING_PROFILE_SPECIFIER='${PROVISIONING_PROFILE_UUID}'",
|
||||
"PROVISIONING_PROFILE='${PROVISIONING_PROFILE_UUID}'",
|
||||
"DEVELOPMENT_TEAM='${DEVELOPMENT_TEAM}'",
|
||||
|
||||
// 钥匙串
|
||||
"OTHER_CODE_SIGN_FLAGS='--keychain ~/Library/Keychains/login.keychain-db'",
|
||||
|
||||
// 编译所有架构
|
||||
"ONLY_ACTIVE_ARCH=NO",
|
||||
|
||||
// 清空编译参数
|
||||
"OTHER_CFLAGS=''",
|
||||
"OTHER_CPLUSPLUS_FLAGS=''",
|
||||
"OTHER_SWIFT_FLAGS=''",
|
||||
"> /dev/null 2>&1"
|
||||
].join(' ') // 拼接成一行完整命令
|
||||
// 打印最终命令
|
||||
echo "执行命令:${xcodeCommand}"
|
||||
// 执行!
|
||||
sh(xcodeCommand)
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('✅ 开始导出 IPA安装包') {
|
||||
steps {
|
||||
sh '''
|
||||
xcodebuild -exportArchive \\
|
||||
-archivePath ${ARCHIVE_PATH} \\
|
||||
-exportPath ${APP_DIR}/build \\
|
||||
-exportOptionsPlist ${EXPORT_OPTIONS_PLIST} \\
|
||||
-allowProvisioningUpdates
|
||||
'''
|
||||
}
|
||||
}
|
||||
stage('🚀 验证并上传 TestFlight') {
|
||||
steps {
|
||||
echo "✅ 开始验证 IPA 有效性"
|
||||
sh '''
|
||||
mkdir -p $HOME/private_keys
|
||||
cp -f "${P8_FILE}" $HOME/private_keys/
|
||||
'''
|
||||
// 1. 先验证 IPA(必须这一步,提前拦截错误)
|
||||
sh """
|
||||
xcrun altool --validate-app \\
|
||||
--file ${APP_DIR}/build/${SCHEME_NAME}.ipa \\
|
||||
--type ${API_TYPE} \\
|
||||
--apiKey ${API_KEY} \\
|
||||
--apiIssuer ${API_ISSUER}
|
||||
"""
|
||||
|
||||
echo "✅ IPA 验证成功!开始上传到 TestFlight"
|
||||
|
||||
echo "🎉 全部完成!请到 App Store Connect TestFlight 查看构建"
|
||||
}
|
||||
}
|
||||
stage('🔐 生成 JWT') {
|
||||
steps {
|
||||
script {
|
||||
@@ -226,11 +228,15 @@ node -e "const fs=require('fs');const jwt=require('jsonwebtoken');const privateK
|
||||
''',
|
||||
returnStdout: true
|
||||
).trim()
|
||||
|
||||
echo "✅ JWT 生成成功:${JWT_TOKEN}"
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('🚀 发布到 TestFlight 测试组') {
|
||||
steps {
|
||||
echo "todo"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
const fs = require('fs');
|
||||
const jwt = require('jsonwebtoken');
|
||||
|
||||
// 从 Jenkins 环境变量获取
|
||||
const API_KEY = process.env.API_KEY;
|
||||
const API_ISSUER = process.env.API_ISSUER;
|
||||
const P8_FILE = process.env.P8_FILE;
|
||||
|
||||
// 读取 p8 私钥
|
||||
const privateKey = fs.readFileSync(P8_FILE, 'utf8');
|
||||
|
||||
// 生成 JWT(苹果标准格式)
|
||||
const token = jwt.sign(
|
||||
{
|
||||
iss: API_ISSUER,
|
||||
exp: Math.floor(Date.now() / 1000) + 1200, // 20分钟
|
||||
aud: 'appstoreconnect-v1'
|
||||
},
|
||||
privateKey,
|
||||
{
|
||||
algorithm: 'ES256',
|
||||
header: {
|
||||
kid: API_KEY,
|
||||
alg: 'ES256'
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// 输出 JWT(Jenkins 会捕获这个值)
|
||||
console.log(token);
|
||||
Reference in New Issue
Block a user