使用现有的证书创建/修改fastlane match证书库

使用fastlane的match工具可以非常方便地管理iOS项目的证书和provisioning profile。
match可以全自动地创建证书。但有些情况下,需要使用已有的证书来生成provisioning profile。

  • 比如项目组规定不得新发行distribution证书;
  • 比如不想增加development证书的数量,同时又不想让已分发的adhoc应用失效这种很微妙的特殊情况。
  • 等等

(没错,说的都是我现在所在的这个麻烦的项目组...)

网上搜到了一些手动将证书及p12文件导入match证书库的文章,但实际操作下来会报错。
一顿google后,终于在fastlane文档的角落里发现了官方支持的方案,将过程分享出来。

官方文档

官方文档在此,英文好的大佬们直接看文档就好了。
https://docs.fastlane.tools/advanced/other/#manually-manage-the-fastlane-match-repo

实践分享

0. 用半途而废的个人项目做实验

  • 使用rbenv限定local的ruby版本
  • 使用bundler来管理gems (fastlane, cocoapods)
项目文件夹

1. 获取cert id

首先我们需要对象证书的cert id,可以利用spaceship来获取。
将下述代码保存为{任意文件名}.rb文件,在Spaceship.login()处改为自己的开发者账号。

require 'spaceship'

Spaceship.login('{开发者账号your_developer_account@address.com}')
Spaceship.select_team

Spaceship.certificate.all.each do |cert| 
  cert_type = Spaceship::Portal::Certificate::CERTIFICATE_TYPE_IDS[cert.type_display_id].to_s.split("::")[-1]
  puts "Cert id: #{cert.id}, name: #{cert.name}, expires: #{cert.expires}, type: #{cert_type}"
end

打开终端执行ruby {任意文件名}.rb,然后比较证书的失效时期,找到我们需要使用的证书的cert id。

获取cert id

2. 导出.cer和.p12文件

从keychain中找到对象证书,导出.cer及.p12文件。
注意.p12文件导出时不要设置密码。match不支持导入设置过密码的.p12文件。

导出.cer及.p12文件

文件名设为步骤1中获取的cert id。

3. 下载并解密证书库

终端cd到项目目录下输入bundle console进入bundle控制台

$ bundle console
irb(main):001:0>

按下述所示,设置证书库url,分支branch,以及match密码。
match密码在match下载证书时需要用到,match会将其保存在keychain中。
在keychain中搜索match会发现match_{证书库url}的密码项,需要时发给项目组其他成员。
一个证书库对应一个match密码

irb(main):001:0> require 'match'
irb(main):002:0> git_url = 'https://github.com/fastlane/example-certificate-repo'
=> "https://github.com/fastlane/example-certificate-repo"
irb(main):003:0> shallow_clone = false
=> false
irb(main):004:0> ENV["MATCH_PASSWORD"] = 'example-password'
=> "example-password"
irb(main):005:0> branch = 'master'
=> "master"

然后依次执行以下操作,下载并解密证书库。

irb(main):006:0> storage = Match::Storage.for_mode("git", { git_url: git_url, shallow_clone: shallow_clone, git_branch: branch, clone_branch_directly: false})
irb(main):007:0> storage.download
irb(main):008:0> encryption = Match::Encryption.for_storage_mode("git", { git_url: git_url, working_directory: storage.working_directory})
irb(main):009:0> encryption.decrypt_files
[14:24:42]: 🔓  Successfully decrypted certificates repo
irb(main):010:0> storage.working_directory
=> "/var/folders/ql/4rgq9x7j51n_971xb332w9lc0000gn/T/d20181105-65220-1oalh6v"

末行的目录即是下载后解密得到的证书库本地目录

#关于证书库和分支

fastlane推荐的实践,是将独自建立一个私有库作为证书库,每个team设一个分支存放该team的证书及provisioning profile。
实际操作可以根据项目的需求来设定。

本人的实际操作如下

 ~/dev/RegiQ   master ●  bundle console
[DEPRECATED] bundle console will be replaced by `bin/console` generated by `bundle gem <name>`
irb(main):001:0> require 'match'
=> true
irb(main):002:0> git_url = 'git@github.com:itsuhi-shu/RegiQ.git'
=> "git@github.com:itsuhi-shu/RegiQ.git"
irb(main):003:0> shallow_clone = false
=> false
irb(main):004:0> ENV["MATCH_PASSWORD"] = '**********************'
=> "**********************"
irb(main):005:0> branch = 'certs'
=> "certs"
irb(main):006:0> storage = Match::Storage.for_mode("git", { git_url: git_url, shallow_clone: shallow_clone, git_branch: branch, clone_branch_directly: false})
=> #<Match::Storage::GitStorage:0x00007f8d4f689758 @git_url="git@github.com:itsuhi-shu/RegiQ.git", @shallow_clone=false, @skip_docs=nil, @branch="certs", @git_full_name=nil, @git_user_email=nil, @clone_branch_directly=false, @git_basic_authorization=nil, @git_bearer_authorization=nil, @type="", @platform="">
irb(main):007:0> storage.download
[16:47:27]: Cloning remote git repo...
[16:47:27]: If cloning the repo takes too long, you can use the `clone_branch_directly` option in match.
[16:47:30]: Checking out branch certs...
=> ["git checkout --orphan certs", "git reset --hard"]
irb(main):008:0> encryption = Match::Encryption.for_storage_mode("git", { git_url: git_url, working_directory: storage.working_directory})
=> #<Match::Encryption::OpenSSL:0x00007f8d4f6c54d8 @keychain_name="git@github.com:itsuhi-shu/RegiQ.git", @working_directory="/var/folders/dj/qqssnmsn6hdgdjjcl98tj98sp6yz76/T/d20200612-9861-zkzbwg">
irb(main):009:0> encryption.decrypt_files
[16:48:19]: 🔓  Successfully decrypted certificates repo
=> []
irb(main):010:0> storage.working_directory
=> "/var/folders/dj/qqssnmsn6hdgdjjcl98tj98sp6yz76/T/d20200612-9861-zkzbwg"

个人习惯,直接在代码库下建立certs分支作为证书库,
在log中看到,match自动为我创建了certs的孤儿分支,将其作为我的证书库。

4. 添加现有证书并上传

open /var/folders/*********{步骤3中证书库目录}打开证书库目录。
如果是空的可以按match的规格创建certs文件夹,在其下创建development和distribution文件夹分别储存开发和发布用证书。

建立certs目录并添加现有证书

然后进行下述操作加密并上传证书库

irb(main):010:0> encryption.encrypt_files
irb(main):011:0> files_to_commit = Dir[File.join(storage.working_directory, "**", "*.{cer,p12,mobileprovision}")]
irb(main):012:0> storage.save_changes!(files_to_commit: files_to_commit)

5. 完工

在项目的fastlane目录下配置Matchfile,并执行match操作之后,fastlane会使用上传的证书创建并下载provisioning profile。


证书库

接下来只需要在项目文件中设置provisioning profile为match打头的即可。大功告成!

参考

http://macoscope.com/blog/simplify-your-life-with-fastlane-match/#migration
https://docs.fastlane.tools/advanced/other/#manually-manage-the-fastlane-match-repo

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