本文记录一次从零新建 Pipeline 到生成 JKS、配置凭据、上传 XAPK 构建、验证产物的完整过程。照着截图顺序操作即可复现。
Seesaw-APK-Pipeline-Walkthroughseesaw-keystore-walkthrough / seesaw-keystore-pass-walkthroughSeesaw-APK-Pipeline(不要在生产任务上做实验)说明:本演示为了不覆盖已有生产凭据,使用了带
-walkthrough后缀的凭据。你复现时可以把流水线里的凭据 ID 换成自己的。第 11 步在 Jenkins Script Console 里生成的是一个临时演示 JKS(密码随机、不回显),用于展示
keytool的生成和验证输出。实际构建使用的是keys/seesaw-release.jks,命令完全相同。
登录后进入 Dashboard。左侧是 New Item,右上角是当前用户。

点击左侧 New Item,进入新建任务页面。

Seesaw-APK-Pipeline-Walkthrough
配置页分为 General、Triggers、Pipeline、Advanced 几个区域。

勾选 This project is parameterized,下面会出现 Add Parameter 按钮。

点击 Add Parameter,菜单里可以看到:

选择 File Parameter,填写:
XAPK_FILE上传 seesaw-class-*.xapk 文件
继续添加 3 个 String Parameter:
| Name | Default Value | 说明 |
|---|---|---|
XAPK_URL | 空 | 可选,从 URL 下载 XAPK |
EXPECTED_PACKAGE | seesaw.shadowpuppet.co.classroom | 期望包名 |
EXPECTED_VERSION | 空 | 可选,留空不校验版本 |

在 Pipeline → Definition 选择 Pipeline script,把 pipeline.groovy 的全部内容粘贴进去。
脚本包含 6 个阶段:Source、Extract、Merge、Sign、Verify、Artifact。

点击 Save,任务创建完成。此时还没有构建记录。

进入 Manage Jenkins → Script Console。这里用来演示 JKS 的生成与验证(也可以在本机终端执行同样的 keytool 命令)。

在 Script Console 执行 keytool 后,结果里可以看到:
Generating 4,096 bit RSA key pair ...JKS saved: /var/jenkins_home/walkthrough-keys/seesaw-demo.jksKeystore type: JKSAlias name: seesawEntry type: PrivateKeyEntrySignature algorithm name: SHA384withRSA关键命令(实际生成 keys/seesaw-release.jks 时使用):
bashkeytool -genkeypair -storetype JKS \
-keystore seesaw-release.jks \
-storepass "$PASS" -keypass "$PASS" \
-alias seesaw -keyalg RSA -keysize 4096 -validity 10000 \
-dname "CN=Seesaw Internal, OU=Mobile, O=DEXA, L=Shanghai, ST=Shanghai, C=CN"
验证命令:
bashkeytool -list -v -keystore seesaw-release.jks -storepass "$PASS"
密码保存在
keys/keystore-info.txt,不会写入本文档。

进入 Manage Jenkins → Credentials → System → Global credentials。

点击 Add Credentials,Kind 选择 Secret file,点击 Next。

seesaw-release.jksseesaw-keystore-walkthrough演示用 JKS(alias: seesaw)
凭据列表中出现 seesaw-keystore-walkthrough。

再次 Add Credentials,Kind 选择 Secret text:
seesaw-keystore-pass-walkthrough演示用 JKS 密码
现在有:
seesaw-keystore-walkthrough(JKS 文件)seesaw-keystore-pass-walkthrough(密码)
打开任务 Configure,把脚本中的:
groovyfile(credentialsId: 'seesaw-keystore', ...) string(credentialsId: 'seesaw-keystore-pass', ...)
改为:
groovyfile(credentialsId: 'seesaw-keystore-walkthrough', ...) string(credentialsId: 'seesaw-keystore-pass-walkthrough', ...)
如果你只创建了一套凭据,直接使用原来的 ID 即可,不需要这一步。

点击 Save,回到任务页面。

点击 Build with Parameters,可以看到:
XAPK_FILE:选择文件XAPK_URL:留空EXPECTED_PACKAGE:默认包名EXPECTED_VERSION:留空选择 seesaw-class-10-150-1.xapk,点击 Build。

构建开始,页面显示 In progress 和当前构建号。

Build #1 完成,结果 SUCCESS。

Build Artifacts 中可以看到:
| 文件 | 大小 |
|---|---|
Seesaw-10.150.1-signed.apk | 43.02 MiB |
build-info.txt | 330 B |
apk-info.txt | 208 B |
sign.log | 1.17 KiB |

6 个阶段全部变绿:
textSource → Extract → Merge → Sign → Verify → Artifact
本次总耗时约 15 秒(工具已缓存)。

Console Output 中可以看到 Verify 阶段的检查结果:
text+ grep -q signature verified build/sign.log + unzip -t build/signed/seesaw-merged-aligned-signed.apk + echo VERIFIED package=seesaw.shadowpuppet.co.classroom version=10.150.1 code=1988154 VERIFIED package=seesaw.shadowpuppet.co.classroom version=10.150.1 code=1988154 + FINAL=build/Seesaw-10.150.1-signed.apk
说明:
signature verified)unzip -t)seesaw.shadowpuppet.co.classroom10.150.1,versionCode 1988154| 检查项 | 预期 |
|---|---|
| 任务类型 | Pipeline |
| 参数 | XAPK_FILE、XAPK_URL、EXPECTED_PACKAGE、EXPECTED_VERSION |
| 凭据 | JKS Secret file + 密码 Secret text |
| 构建结果 | SUCCESS |
| 阶段 | 6 个阶段全部通过 |
| 产物 | Seesaw-<版本>-signed.apk |
| 验签 | 日志包含 signature verified |
| 完整性 | unzip -t 无错误 |
本次演示创建的是 Seesaw-APK-Pipeline-Walkthrough,正式任务 Seesaw-APK-Pipeline 不受影响。
复现时建议:
seesaw-keystore本文截图位于 screenshots/walkthrough/,完整原理与排错见 Seesaw-APK流水线复盘.md。
本文作者:墨洺的文档
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!