pgyer document center

蒲公英 -凯发k8地址

这篇文章将会给大家介绍如何在 ios 项目中使用 travis ci ,并将 app 签名后发布到蒲公英。

关于 travis ci 产品分类

是目前比较流行的持续集成工具之一,用来构建及测试在 github 托管的代码,使用它可以极大的简化工作流程。 产品分为:

  1. travis ci.org (用于github开源项目的免费产品)
  2. travis ci.com (用于私有项目的付费产品)

注:本文中介绍的demo是基于(travis-ci.org)

准备工作

需要在本地安装 travis ci 命令工具。

  1. 确保本地系统配置 ruby 1.9 以上版本:

    ruby -v
    
  2. 安装travis-ci (如果使用 mac os 最好先更新 ruby 到最新版本,然后再安装)

    gem install travis --no-rdoc --no-ri
    
  3. 验证 travis 是否安装成功 (有版本输出则说明安装成功)

    travis -v
    1.8.8
    
  4. 登录 travis。在命令行中,使用 github 账号登录

    travis login 
    

    登录后,可以用

    travis accounts
    

    来验证账号是否成功登录。

集成步骤

一、启用travis ci

通过 github 账号登录 travis 平台。travis 会自动同步github账号上所有的开源项目。通过列表选择需要启动的项目。

二、创建travis ci构建

  1. 在工程根目录下添加 .travis.yml文件。这个文件用于说明 travis ci 需要处理的构建。
  • travis ci 本身提供基本的构建和支持语言,同时开发者可以通过.travis.yml文件设置自己的构建操作,同时需要遵从 travis ci 自己规定的构建生命周期。

  • 在完成 .travis.yml 定义后, 可以通过 travis lint [path to your .travis.yml] 命令验证这个文件语法是否正确性。如果正确会出现以下的提示:

  1. 配置 ios 工程基本模板,在 .travis.yml 中定义以下内容:

    language: objective-c
    osx_image: xcode9
    

    如果你只是想使用 travis ci 的构建功能,那么这两行已经足够了。在你把.travis.yml push 到 github 上之后,travis ci 就会自动开始 build 流程,在 build 完成之后,github 绑定的邮箱就能收到通知。当然,对蒲公英的用户来说,只是 build 是不够的,我们还希望能够对 app 进行打包,签名,并发布到蒲公英平台上。

三、配置项目:

在使用 travis ci 需要我们修改两处项目配置,否则的话,会导致 build 失败。

  1. 将项目的 scheme 管理方式改成 shared:
  1. 关闭 bitcode 选项:

四、打包签名并上传至蒲公英

为了对 app 进行签名,我们必须得配置好证书和配置文件。

1. 苹果全球开发者关系认证

从下载证书,或者从钥匙串中导出。并将其保存到项目的目录 travis/certificates/applewwdrca.cer 中。

2. 导出发布证书和私钥

钥匙串程序中选中证书分别导出证书和私钥。

切记:不要上传没有加密的证书和描述文件到 github 的公开仓库(下文会讲如何加密)

将证书和和 p12 文件放在 travis/certificates/sdk_demo.certravis/certificates/sdk_demo.p12 。导出 p12 文件的时候要输入密码。

travis ci 在使用 p12 文件的时候需要知道密码,而我们又不能将密码明文保存在某个地方,所以这个时候我们可以使用到 travis ci 的功能。

打开终端,定位到.travis.yml文件所在的目录,用下列命令来保存 p12 文件的密码。

travis encrypt "key_password=123456" --add

这其中的123456就是你导出 p12 文件时输入的密码。在输入了这条命令之后我们就会发现.travis.yml多了一行数据

 - secure: xjz9e1ejdbdaizcnaz86a7nrjpbdphs3xixu5l4gj4rfr0tcxhshuu2dczr/yrjrhg6oum2zumr0xbssffmbyfhx5kw2jb31ci6ufboti/fgbrwdvfhqbl h/7xe/j3l1bmbmfelyp02fijvn5vsvya0    3iobp7u3vy0tw7yce po23dmjctygnudfuf4ebo3gpgbotpdmixqyhqqw5ndwmvxpq9bqneqec3pmncc1fc6h4rmgjkwnmln5ffwixnn nwgpzsdqhdmunqaytvuu/chlqcmncgqmkrg/owyvlo4rqpex6vzv5bua6gd    7d4lgcfxhonkmlknbiwbgdrbbbqnnsbubttglygtzchwee4kvhom4n0ydzqtd9edgrxlosubgnlqk /3c6bhzzi2rwnlnqbu7f/zsmjbonwgrufzj2zjbyhwlottohvybfdk4ctmt5qmqpq7favmu1l9tubpbx4qbx4d    ixpeknodtwovdyjlfiz us6i637jezf8ok9bbtuf4okjvl1oz5ly56sntbknf3v if6vohlg1cfroqhy2f7ahs2k3aq0u4o2gmivqtrd1jublo6qkzv/f go4kvydwofpax05ayrjnoqgahae5a8px2yict1qcrtl  r    enqx1qzqwxiexpezm8m1pr8tcb8d2wblgtwtd/8=

这行数据就是通过上述命令安装到.tarvis.yml文件中的环境变量key_password,在后续打包的过程中,travis 就可以通过引用key_password来使用 p12 文件对应的密码。

3. 描述文件

签名打包的时候,我们还需要用到 .mobileprovison 描述文件。描述文件可以在在苹果开发者网站上创建和下载(provisioning profiles > distribution > add > ad hoc or in house)。将下载后的文件保存在travis/certificates/sdk_demo.mobileprovision

同时,我们还需要将对应的,描述文件的文件名,app 名称,开发者名称都保存在 .travis.yml 文件中:

env:
  global:
  - appname="pgysdkdemo"
  - 'developer_name="iphone distribution: your developer name (your developer code)"'
  - profile_name="sdk_demo"

4. 加密证书和配置文件

如果使用的是 github 的公开仓库,我们还需要对证书,配置文件,私钥这些敏感文件进行加密。加密了之后,我们还需要告诉 travis ci 如何去解密这些文件。

  1. 加密

travis 在解密时只支持单文件,所以,我们还需要在加密前把证书和配置文件打包成一个压缩包。

tar cvf certificates.tar sdk_demo.cer sdk_demo.p12 sdk_demo.mobileprovison

运行完命令之后,就会发现,文件目录中多了一个 certificates.tar的文件,我们把这个文件放到项目的根目录下。然后在项目的根目录下运行命令:

travis encrypt-file certificates.tar -a

对压缩后的证书和配置文件进行加密。-a 参数的作用是自动的把解密文件的指令添加到.travis.yml文件中。运行完指令后,我们会得到一个名为 certificates.tar.enc的加密文件。这个时候,就可以把未加密的 certificates.tartravis/certificates 文件夹目录下的 sdk_demo.cer sdk_demo.p12 sdk_demo.mobileprovison这四个文件删除掉。

  1. 解密

运行完加密命令后,我们还会发现 .travis.yml 文件中多了一行:

- openssl aes-256-cbc -k $encrypted_2838d02a56a6_key -iv $encrypted_2838d02a56a6_iv
  -in certificates.tar.enc -out certificates.tar -d

这一行的作用就是解密证书文件。需要注意的是,解密之后的文件仍然是一个压缩包,我们需要将压缩包解压缩。

before_install:中添加下列代码:

- tar xvf certificates.tar -c ./travis/certificates

5.导入钥匙串

为了进行签名打包,我们还需要将证书导入到 travis ci 运行环境的钥匙串中。为了导入钥匙串我们在 scripts文件夹中添加一个名为add-key.sh的文件。下面是add-key.sh的全部内容:

#!/bin/sh
# create a custom keychain
security create-keychain -p travis ios-build.keychain
security default-keychain -d user -s ios-build.keychain
security unlock-keychain -p travis ios-build.keychain
security set-keychain-settings -t 3600 -l ~/library/keychains/ios-build.keychain
security import ./scripts/travis/applewwdrca.cer -k ~/library/keychains/ios-build.keychain -t /usr/bin/codesign
security import ./scripts/travis/sdk_demo.cer -k ~/library/keychains/ios-build.keychain -t /usr/bin/codesign
security import ./scripts/certs/sdk_demo.p12 -k ~/library/keychains/ios-build.keychain -p $key_password -a
echo "list keychains: "
security list-keychains
echo " ****** "
echo "find indentities keychains: "
security find-identity -p codesigning  ~/library/keychains/ios-build.keychain
echo " ****** "
mkdir -p ~/library/mobiledevice/provisioning\ profiles
cp "./scripts/profile/sdk_demo.mobileprovision" ~/library/mobiledevice/provisioning\ profiles/

通过add-key.sh这个脚本,我们创建了一个名为 ios-build 的临时钥匙串。临时钥匙串里包含了所有的证书信息。其中 $key_password就是在引用 p12 文件的密码。通过这个脚本创建的临时钥匙串,还需要在我们完成了签名打包之后删除掉。

为了保证脚本能够正常运行,我们还需要给脚本设置可执行权限:

before_install:
 - chmod  x scripts/travis/add-key.sh

6. 打包

在 xcode 8.2 以前广泛使用的打包工具 xctool 现在已经不能使用了,我们只能通过 xcodebuild 来打包,打包分为两步:archive 和 签名。打包脚本如下:

#!/bin/sh
xcrun xcodebuild -project pgysdkdemo.xcodeproj -scheme pgysdkdemo \
  -archivepath pgysdkdemo.xcarchive archive
xcrun xcodebuild -exportarchive -archivepath pgysdkdemo.xcarchive \
  -exportpath ./build -exportoptionsplist exportoptions.plist

这其中需要一个-exportoptionsplist 文件,获取这个文件最简单的方式就是通过使用 xcode 导出一个 ipa ,在导出的 ipa 所在的文件夹中就有一个 exportoptions.list。我们把这个文件放在项目的根目录中就可以了。

运行完打包脚本之后,我们就可以在项目的 ./build 目录下找到签名好的 ipa 文件了。

7. 上传蒲公英

我们已经写好了一个上传 ipa 文件的 shell 脚本。你只需要在 before_install: 中下载该脚本,并给与该脚本执行权限,并在打包完成之后调用该上传脚本。

- wget -c https://raw.githubusercontent.com/pgyer/travisfile/master/pgyer_upload.sh
  -o pgyer_upload.s
#!/bin/sh
./pgyer_upload.sh "./build/$appname.ipa" $pgyer_apikey

上传的时候,需要用到蒲公英的 api_key, 你可以在这里找到你的 api_key。由于 api_key 不能明文保存,所以我们通过使用和保存密码一样的方式,把它安装到 .travis.yml文件中。打开终端,定位至项目的根目录,在命令行中输入:

travis encrypt "pgyer_apikey=655b39fe4bad7a701bd44dfbcafdcc2f" --add

8. 清理钥匙串

在所有环节都结束后,我们还需要删除掉导入的钥匙串信息。我们在 /scripts/travis 文件夹下添加一个新的文件 remove-key.sh :

#!/bin/sh
security delete-keychain ios-build.keychain
rm -f ~/library/mobiledevice/provisioning\ profiles/$profile_name.mobileprovision
rm -f ~/library/mobiledevice/provisioning\ profiles/team.mobileprovision

完成上述工作之后,每次我们新上新代码到 github 都会触发 travis ci 的持续集成,并将打包签名后的 app 发布到蒲公英上。

一个完整版的 .travis.yml 文件如下所示:

language: objective-c
osx_image: xcode9.2
env:
  global:
  - appname=pgysdkdemo
  - profile_name=sdk_demo
  - 'developer_name="iphone distribution: shengtao lei (dg37yk9prk)"'
  - secure: il2khndykzwlttvaxmmq3/ci66b0z5c8vctmpaomiotdtwytogmnpzh vyrof3qbh/nv2of6put/b5y6s6lrcy5b4nzsfhy8xl6fepdbovzpq2qias4gn6qcgukikaxpcnkg9sbcxdsi5alvoqxoevuhkb2rkw925twrg6 bfagtwqzvvkbyiht2jm2 7bkmnux7uiiggnyn h2acpfdf/d9g7lc7w2hlb6ho0mt5pk5egbzlh8kn/1cnx7jsww3syeabej3cqozx5x/ynp4oijlgdegw3sy1erai2uo i89vdu1sarcdlbnuamlxb95dlvbvu7uwildwth6 o6fvl2eoj1yprnbjdcryktvacsr1exps6ucoq9tcwz0zinamsbzemojdk g loc6ipt9ltimt5ln0lgqovyerxnvjmehr/2rflvstiqd wt8agfqr9eeu0ah8agwitie6eua0xdtyc0eykvykzxby4wi6r2fknfn6uhyefein9zpwy8tcwz8prldd xiyohgsybs1dk xr21lloopxkc/aacnoeslcinn28in9qrdwsiduslab6dq3prcs/cdorjbm759xcz7kdmnwvacsx7az9p8ht0ugvyujdyndr4vp0r98rtpi/7jonpxqxuwzsazzdq5aazchwnfabtcrasw6qqhy=
  - secure: kud0jyzqjetezcbkj6zkfw7i 0vgiv6e7goa34kuzysjwplnzpyb08 nsyzymh6yjc8pkc8 mixgxlohupwm5v3irthwqd/tdmuf5bdqqidrwkmqsl0ck9m rmgc vapajguc0/yf bopwl6cjxoullzj3d6ixuwzevyhmpb4nbv/yhvk/fnwns4aqp9ssp98vqoyragavusy3jm5l1qsnwcjpmbcx4qnlbx5mjl0mef0pebj3zzaz9azpalfcyr4ppss7/eshxvapnbod5jvqak6nhafctuw0/ulghw9m9ey3aezmpzo1m8khxzxsc0bwop8r4h6wytybilxz6aramb8n12r ntlfaawnfng5kv4mtuhfy7bqnu tybkba4axkclay90fetekhucciqtlvmmjlkq6dzwkq4hgmdteajajzhqmpbumy5o8n8lxkww/zkpvgehrjjbxbmfcop4os2u9vxi/q18t mroqhgfan2cvqxdpqhk0s8scisvvnusfhsglt79kjgkwnuvktipw89bg8hhqaqigpfycvibdrxsm6xd i7aizz25xfde/ao03ulrndaizlbgua igjdknkrjmg9hfqko2grkz/jqnxqdsmeixzrh46cocd1 j39k6wvyler5fdcistf waw4hxmio0en2hl2 qeftjds=
  - secure: yecgzldjxnbjuiyjoywdan2lj4stoyx2iq8ficmezodxuxeghrl6s6xfopltsm6cnyuzkft9bzaewugwnnes8fcpvmuakvynhcrw/d9jtmm/fboidsjb2ht8f/dy1ifgb241pmu7skpifvil08yxemyzfwgfxbdqn60axciukwuecqmgxx2ylx9uhr t/xuy6e nx6ueb/6imx3rq047nvfefmgh9ymggl0zh/n9bezgmrwlzn1lafkmrkbj3vw1go2rzxndwa/noy 6ekfbc8r4rgcvwq6oxbexg1iujhbinhr5pxajz/5jbum9t64fhurx8e2apkryrwwjooq5q7 aer7pnahtgfymhhdwum7wexomuh5ltp7jcnziakdxuoonw4hz oexkbm4nyjcmfczjw4bqkh0gqnytphl/y/08u0fuqxtp3wu6zi0q0qo6e3eqctgv3q9yzem7jwab6rso09arrvvz7hwdzfwbhy07t9//ymusx/chhw7fziso1wkutwosvcfbvjmgo6nve/b8xdcvv4sqiex/wk3c/cnhb7dtve9sc6nelrkuyveqktxk87/idbo0sahxounw9phwtxg rm8fn rvbqd9ry4h8hrrazkdfqikmt3yexofkcraqbquhedvlz2dxdxzhgjopyvaejsohi2jt1bb58=
before_install:
- openssl aes-256-cbc -k $encrypted_2838d02a56a6_key -iv $encrypted_2838d02a56a6_iv
  -in certificates.tar.enc -out certificates.tar -d
- cd $travis_build_dir
- wget -c https://raw.githubusercontent.com/pgyer/travisfile/master/pgyer_upload.sh
  -o pgyer_upload.sh
- tar xvf certificates.tar -c ./travis/certificates
- chmod  x pgyer_upload.sh
- chmod  x travis/scripts/add-key.sh
- chmod  x travis/scripts/build.sh
- chmod  x travis/scripts/upload.sh
- chmod  x travis/scripts/remove-key.sh
before_script:
- "./travis/scripts/add-key.sh"
script:
- "./travis/scripts/build.sh"
after_success:
- "./travis/scripts/upload.sh"
after_script:
- "./travis/scripts/remove-key.sh"

结语

本文介绍了如何使用 travis ci 对 ios 项目进行持续集成,并把打包签名后的 app 上传到蒲公英。希望对你能有所帮助。对应的 demo 项目你可以在上找到。