Jenkins 自动上传 IPA 到 App Store 把发布步骤融入 CI/CD

Jenkins 做 iOS 发布时,可以把流程拆成两段

  1. macOS 节点负责构建 IPA
  2. Jenkins 调用命令行工具上传 IPA

如果 IPA 已经由 Xcode、Fastlane、Flutter、uni-app 云打包生成,Jenkins 只需要处理上传阶段。

Jenkins 里需要准备的变量

在 Jenkins 凭据或环境变量中保存:

ini 复制代码
APPLE_ID=your@email.com
APP_PASSWORD=xxxx-xxxx-xxxx-xxxx
IPA_PATH=build/app.ipa

这里的 APP_PASSWORD 是 Apple App 专用密码,不是 Apple ID 登录密码。

使用 AppUploader CLI 上传

下载 AppUploader 后,在 runtime 目录中找到命令行工具。

Linux/macOS 先加执行权限"chmod +x appuploader_cli" Jenkins Pipeline 示例:

python 复制代码
pipeline {
    agent any

    environment {
        APPLE_ID = credentials('apple-id')
        APP_PASSWORD = credentials('apple-app-password')
        IPA_PATH = 'build/app.ipa'
    }

    stages {
        stage('Check IPA') {
            steps {
                sh '''
                if [ ! -f "$IPA_PATH" ]; then
                  echo "IPA not found: $IPA_PATH"
                  exit 1
                fi
                '''
            }
        }

        stage('Upload to App Store') {
            steps {
                sh '''
                ./appuploader_cli upload \
                  -f "$IPA_PATH" \
                  -u "$APPLE_ID" \
                  -p "$APP_PASSWORD" \
                  --type ios
                '''
            }
        }
    }
}

和构建阶段配合

如果 Jenkins 同时负责构建,可以这样分工:

阶段 工具
构建 IPA Xcode / Fastlane / Flutter
证书与描述文件 AppUploader
上传 IPA AppUploader CLI
审核提交 App Store Connect

AppUploader CLI 上传时会自动处理上传 metadata,包括 AppStoreInfo.plist,不需要手动生成。

上传后检查

进入"App Store Connect → TestFlight"确认新构建是否出现。

如果没有出现,先检查:

  • Build 号是否递增
  • Bundle ID 是否一致
  • IPA 是否使用 App Store 描述文件签名
  • Apple 专用密码是否有效
相关推荐
名字还没想好☜32 分钟前
Go 的 io.Reader/Writer 组合实战:io.Copy、TeeReader、MultiWriter 优雅处理数据流
开发语言·后端·golang·go·iphone
喵个咪1 小时前
GoWind Shop 架构剖析:一个 REST 请求穿越三服务 BFF 的七环链路
vue.js·后端·go
喵个咪1 小时前
GoWind Shop 安全设计:JWT 鉴权、Ent 行级隔离、防篡改审计与四个真实漏洞修复
vue.js·后端·go
喵个咪1 小时前
GoWind Shop:一个 proto 文件如何生成后端、前端、文档、校验六路代码
vue.js·后端·go
用户7783366132111 小时前
从 0 搭一个关键词排名监控:核心思路 + 可运行代码
后端·python·api
喵个咪1 小时前
GoWind Shop 出海实战:多语言商品内容怎么存、怎么录、怎么按 locale 取
vue.js·后端·go
郝学胜_神的一滴2 小时前
C++20 高级编程 001:从极简HelloWorld到现代类型体系全梳理
c++·后端
卷无止境2 小时前
FastAPI中间件全解析:请求处理链条上的隐形关卡
后端·python·fastapi
badhope2 小时前
MCP协议:号称要统一AI工具调用,但大多数人连第一步都走不对
后端·架构
思考着亮3 小时前
2. Redis 缓存实战
后端