Xcode 打包一定需要 苹果系统的电脑,以下均在 Mac 下操作
一、安装步骤
1. 安装 jenkins 前往 【官网】
2. 选择 MacOS X 版本进行下载【下载连接】
3. Jenkins 安装
rew install jenkins-lts
4. 运行 Jenkins
- 终端运行
jenkins-lts
- 浏览器打开
http://localhost:8080/
5. 解锁 Jenkins
- 前往本地路径
cat /Users/iosuser/.jenkins/secrets/initialAdminPassword
,复制密码并粘贴到输入框,点击继续按钮
6. 安装 Jenkins 插件
7. 创建 Jenkins 账号
8. 欢迎来到 Jenkins!
二、安装插件
前往 Manage Jenkins -> Manage Plugins 进行插件管理
- Git , Gitlab , SVN , SSH Credentials — — 用于授权后拉取远程库的代码
- Keychains and Provisioning Profiles Management — — 证书与描述文件的管理
- Xcode integration — — Xcode 打包的插件,所以 iOS 的打包只能部署在Mac系统
- Cocoapods — — 如果项目使用了 Cocoapods 插件 来获取依赖库
- Email Extension Plugin — — 邮件插件
- Locale — — 语言插件
下载过程中会比较慢,可以通过修改 default.json 文件提升下载速度
sed -i "" 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
Manage Jenkins -> Configure System -> 在主目录下可以看到 Jenkins 路径,defalut.json 在 Jenkins 根目录的 ./updates 下
三、SSH 配置
一般会在项目中添加 Credentials,添加步骤如下:
选择 SSH Username with private key 类型
配置信息主要填一下几个
- Username(用户名)
- Private Key(私钥)
- Passphrase(密码)
我们添加完 Credentials 之后可以在 Jenkins -> Credemtials(凭证)-> System -> Global credentials(unrestricted)编辑配置
四、简单执行一个项目
前往 Jenkins -> 新建 Item
新建完一个项目后,可以根据【SSH 配置】,然后配置完 Repository URL 和 Credentials 进行保存
点击 Build Now 可以开始第一次尝试构建项目
在构建历史中,我们可以看到构建进度,并且我们可以关闭此次构建,点击构建序列号可以进去查看构建详情
控制台可以查看详细的报错信息,有利于我们定位问题
五、构建前的参数选择及填写
勾选 General 的 This project is parameterized
,然后开始添加参数
在下面例子,使用的是 Choice Paramenter(可选参数), 定义了 ENVIRONMENT
变量,之后可以使用 ${ENVIRONMENT}
来引用该变量
之后在 Build 之前就可以选择参数 ENVIRONMENT
的变量值
六、Cocoapods
对于使用了 Cocoapods 的项目,但是没有上传 Pods 文件夹到仓库中,需要在构建项目前进行 pod install
- 这里用到
WORKSPACE
环境变量,使用变量用${}
将变量名括起来,为了防止变量名中存在空格执行有误,可以用 "" 双引号括起来 - 如何查看 Jenkins 已有的环境变量
前往 [JENKINS_URL]/env-vars.html/ 网页查看
如果跑 Jenkins 出现 pod install
慢,有可能是在向 Github 源项目进行 Clone,Cocoapods Cache (/Users/[USER]/Library/Caches/CocoaPods/Pods/Release) 没有缓存,这种情况需要开启代理,添加 git config --global
,详细见上代码
七、邮件发送
系统有一个自带的邮件插件,可以用来测试邮件配置,前往 Jenkins -> Configure System -> 邮件通知
- 填写和勾选,以下几个选项 — — 填写 SMTP 服务器 / 用户默认邮件后缀 / 使用 SMTP 认证 / 用户名 / 密码 / 使用 SSL 认证 / SMTP 端口
- 发送邮件测试 — — 勾选通过发送测试邮件测试配置,然后填写 Test e-mail recipient(接收者邮件), 点击 Test configuration 测试邮件功能
安装 Email Extension Plugin 插件
Q: 在构建项目中添加发送邮件的任务 ?
安装完插件之后,在 Jenkins -> Configure System
添加构建后发送邮邮件组件
新增触发器、填写收件人、发送内容、主题
八、构建脚本
主要涉及到的 api
build 并导出 xcarchive — — xcodebuild -workspace xxx.xcworkspace -destination 'generic/platform=iOS' -scheme xxxx -configuration xxxx -archivePath xxxx.xcarchive archive build -allowProvisioningUpdates
xcarchive 导 ipa — — xcodebuild -exportArchive -archivePath xxxx.xcarchive -exportOptionsPlist xxxx.plist -exportPath xxxx
plist 文件主要为以下内容,填入 bundle_id、profile_name、method(打包方法)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>provisioningProfiles</key>
<dict>
<key>${BUNDLE_ID}</key>
<string>${PROFILE_NAME}</string>
</dict>
<key>method</key>
<string>${METHOD}</string>
</dict>
</plist>
- ipa 校验 — — xcrun altool --validate-app -f xxxx.ipa -t ios --apiKey xxxx --apiIssuer xxxx --verbose
- ipa 上传 — — xcrun altool --upload-app -f xxxx.ipa -t ios --apiKey xxxx -apiIssuer xxxx --verbose
- 登陆 fir — — fir login xxxx
- 上传 ipa 到 fir — — fir publish xxxx.ipa -c xxxx
Jenkins 已有可用的环境变量
前往 [JENKINS_URL]/env-vars.html/
网页查看
BRANCH_NAME — — 对于多分支项目,这将被设置为正在构建的分支的名称,例如,如果您希望从master部署到生产环境而不是从feature分支部署;如果对应某种更改请求,则该名称通常是任意的(请参阅下面的CHANGE_ID和CHANGE_TARGET);
CHANGE_ID — — 对于与某种更改请求相对应的多分支项目,这将被设置为更改ID,例如拉取请求编号(如果支持);其他未设置;
CHANGE_URL — — 对于与某种更改请求相对应的多分支项目,这将被设置为更改URL(如果支持);其他未设置;
CHANGE_TITLE — — 对于与某种更改请求相对应的多分支项目,这将被设置为更改的标题(如果支持);其他未设置;
CHANGE_AUTHOR — — 对于与某种更改请求相对应的多分支项目,这将被设置为建议更改的作者的用户名(如果支持);其他未设置;
CHANGE_AUTHOR_DISPLAY_NAME — — 对于与某种更改请求相对应的多分支项目,这将被设置为建议更改的作者的人名(如果支持);其他未设置;
CHANGE_AUTHOR_EMAIL — — 对于与某种更改请求相对应的多分支项目,这将被设置为建议更改的作者的Email地址(如果支持);其他未设置;
CHANGE_TARGET — — 对于与某种更改请求相对应的多分支项目,这将被设置为合并到的目标或者基础分支(如果支持);其他未设置;
BUILD_NUMBER — — 当前构建的编号,例如“4674”等
BUILD_ID — — 当前构建的版本ID,与构建的BUILD_NUMBER相同
BUILD_DISPLAY_NAME — — 当前版本的显示名称,默认为“# 4674”,即BUILD_NUMBER。
JOB_NAME — — 即此版本的项目名称,例如“foo”或“foo / bar”。
JOB_BASE_NAME — — 此构建的项目的短名称剥离文件夹路径,例如“bar / foo”的“foo”。
BUILD_TAG — — {BUILD_NUMBER}”的字符串。 JOB_NAME中的所有正斜杠(/)都用破折号( - )替换。方便地放入资源文件,jar文件等,以便于识别。
EXECUTOR_NUMBER — — 唯一编号,用于标识执行此构建的当前执行程序(在同一台计算机的执行程序中)。这是您在“构建执行程序状态”中看到的数字,但数字从0开始,而不是从1开始。
NODE_NAME — — 如果构建在代理上,则代理的名称; 如果在主版本上运行,则为“MASTER”;
NODE_LABELS — — 节点分配的空白分隔的标签列表。
WORKSPACE — — 作为工作空间分配给构建的目录的绝对路径。
JENKINS_HOME — — Jenkins用于存储数据的主节点上分配的目录的绝对路径。
JENKINS_URL — — Jenkins的完整URL,如http:// server:port / jenkins /(注意:仅在系统配置中设置Jenkins URL时可用)
BUILD_URL — — 此版本的完整URL,例如http:// server:port / jenkins / job / foo / 15 /(必须设置Jenkins URL)
JOB_URL — — 该作业的完整URL,例如http:// server:port / jenkins / job / foo /(必须设置Jenkins URL)
GIT_COMMIT — — The commit hash being checked out.
GIT_PREVIOUS_COMMIT — — The hash of the commit last built on this branch, if any.
GIT_PREVIOUS_SUCCESSFUL_COMMIT — — The hash of the commit last successfully built on this branch, if any.
GIT_BRANCH — — 远程分支名称,如果有的话。
GIT_LOCAL_BRANCH — — 本地分支名称,如果有的话。
GIT_URL — — 远程git仓库的URL。如果有多个,将会是GIT_URL_1,GIT_URL_2等。
GIT_COMMITTER_NAME — — 配置的Git提交者名称(如果有的话)。
GIT_AUTHOR_NAME — — 配置的Git作者姓名(如果有的话)。
GIT_COMMITTER_EMAIL — — 配置的Git提交者电子邮件(如果有的话)。
GIT_AUTHOR_EMAIL — — 已配置的Git作者电子邮件(如果有)。
SVN_REVISION — — 当前工作区的Subversion版本号,例如“12345”
SVN_URL — — 当前工作区的Subversion版本号,例如“12345”
Keychains and Provisioning Profiles Management
Step 1
Find Keychain 并上传到 后台 钥匙串有
-
登录(login.keychain)
前往/用户/${User}/资源库/Keychains/
该路径下只有 login.keychain-db,在网上找了其他文章,说是复制 login.keychain-db 修改名字为 login.keychain 并上传 -
系统 (system.chain)
存放的路径/Library/Keychains/System.keychain
Step 2:
打开「钥匙串」 App,并点击上传对应的 keychain,找到对应的证书,复制名字后粘贴到 Code Signing identify
使用 login.keychain 之后,复制 Code Signing identify 之后无法在项目中选择,后面将证书复制到 「系统」中,并上传 system.keychain,将证书名字复制到 system.keychain 👇,之后解决了问题
Provisioning Profile
目前还未尝试使用 Jenkins 的 Provisioning Profile 去构建项目,只是添加 Profile Name 在命令行里面构建
Mac 存放的路径在 /用户/${User}/Library/MobileDevice/Provisioning Profiles
由于 Provisioning Profile 均以 ${UUID}.mobileprovision 很难辨别我们需要的 profile 是哪个,建议从 AppDevelop 后台直接下载我们需要的 profile,然后直接上传到 jenkins 后台
本地服务器映射到外网
默认端口号 8080,运行 Jenkins 可指定端口号 jenkins-lts --httpPort=8080
前往 ngrok 下载可执行文件 exec 官网
-
前往 ngrok 下载所在路径,执行
./ngrok http localhost:80
(也可直接将 exec 文件放在 /usr/local/bin 下然后直接ngrok http localhost:80
)
执行结果 Forwording 那一行的地址就可以供外部访问