Jenkins - iOS Build、Archive、Upload

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,复制密码并粘贴到输入框,点击继续按钮
image.png

6. 安装 Jenkins 插件

1592568762751-5b2a5b63d53f59bc.png

7. 创建 Jenkins 账号

1592568788249-0003346ca218ecaf.png

8. 欢迎来到 Jenkins!

1592568815124-9d1d8e1209e3b002.png

二、安装插件

前往 Manage Jenkins -> Manage Plugins 进行插件管理

image.png
  • 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,添加步骤如下:

1593313820116-fc7d74a193249262.png

选择 SSH Username with private key 类型

1593313900430-561700e41b818559.png

配置信息主要填一下几个

  • Username(用户名)
  • Private Key(私钥)
  • Passphrase(密码)

我们添加完 Credentials 之后可以在 Jenkins -> Credemtials(凭证)-> System -> Global credentials(unrestricted)编辑配置

四、简单执行一个项目

前往 Jenkins -> 新建 Item

1593313755549-99a7008a2ee4094d (1).png

新建完一个项目后,可以根据【SSH 配置】,然后配置完 Repository URLCredentials 进行保存

1593314409699-192662958f698587.png

点击 Build Now 可以开始第一次尝试构建项目

1593314502665-b0931885773f2ce5.png
1593314596710-b9edafaef1942aef.png

在构建历史中,我们可以看到构建进度,并且我们可以关闭此次构建,点击构建序列号可以进去查看构建详情

1593314664662-9c1ea35f89ae2339.png

控制台可以查看详细的报错信息,有利于我们定位问题

五、构建前的参数选择及填写

勾选 GeneralThis project is parameterized,然后开始添加参数

在下面例子,使用的是 Choice Paramenter(可选参数), 定义了 ENVIRONMENT 变量,之后可以使用 ${ENVIRONMENT}来引用该变量

1593483810371-2b5bab50f5865047.png

之后在 Build 之前就可以选择参数 ENVIRONMENT 的变量值

1593483966114-6838ec4f218dcd9f.png

六、Cocoapods

对于使用了 Cocoapods 的项目,但是没有上传 Pods 文件夹到仓库中,需要在构建项目前进行 pod install

1593764664726-439b3b3ce0e1e710.png
  • 这里用到 WORKSPACE 环境变量,使用变量用 ${} 将变量名括起来,为了防止变量名中存在空格执行有误,可以用 "" 双引号括起来
  • 如何查看 Jenkins 已有的环境变量
    前往 [JENKINS_URL]/env-vars.html/ 网页查看

如果跑 Jenkins 出现 pod install 慢,有可能是在向 Github 源项目进行 CloneCocoapods Cache (/Users/[USER]/Library/Caches/CocoaPods/Pods/Release) 没有缓存,这种情况需要开启代理,添加 git config --global,详细见上代码


七、邮件发送

系统有一个自带的邮件插件,可以用来测试邮件配置,前往 Jenkins -> Configure System -> 邮件通知

1593502023203-0f0dd84402d6e177.png
  1. 填写和勾选,以下几个选项 — — 填写 SMTP 服务器 / 用户默认邮件后缀 / 使用 SMTP 认证 / 用户名 / 密码 / 使用 SSL 认证 / SMTP 端口
  2. 发送邮件测试 — — 勾选通过发送测试邮件测试配置,然后填写 Test e-mail recipient(接收者邮件), 点击 Test configuration 测试邮件功能

安装 Email Extension Plugin 插件

Q: 在构建项目中添加发送邮件的任务 ?

安装完插件之后,在 Jenkins -> Configure System

image.png

添加构建后发送邮邮件组件

image.png

新增触发器、填写收件人、发送内容、主题

1593505168477-8874684336c2f92a.png

八、构建脚本

主要涉及到的 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

    image.png

  • 执行结果 Forwording 那一行的地址就可以供外部访问

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352