基于jenkins搭建iOS APP持续集成和发布环境

安装jenkins

java环境准备

jenkins主要依赖的java环境 所以确保电脑中java环境准确就绪支撑软件检测是否已经部署了java环境在终端输入

$ java –version

如果出现类似于如下的字样 则标识您已经安装了java环境

$ java version "1.8.0_77"

若出现如下

$ -bash: java: command not found

则表示没有安装java环境 则需要下载java安装下载地址 (1.8版本,后续下载版本下载地址可能会有变化)jre 1.8 下载安装后重复上述步骤 确保java环境成功搭建

在mac上安装jenkins

  • 安装HomeBrew
    jenkins依赖HomeBrew包管理,所以我们要先安装homebrew,
    若已安装则跳转,查看方法
$ brew -v

若正确显示版本信息则代表安装成功安装homebrew(参考网站)安装完成之后
homebrew的源在国外,所以我们需要配置一下使之下载的快一点参考网站 http://ban.ninja
在终端中输入

$ vim ~/.bash_rc

在文件最后一行 添加七牛cdn加速

$ export HOMEBREW_BOTTLE_DOMAIN=http://7xkcej.dl1.z0.glb.clouddn.com

注:以上工作都是前期准备,因为大部分包管理(包括brew和gem)的源都在国外,所以可能下载速度会很感人

  • 开始安装jenkins
    在终端输入
$ brew install jenkins

根据提示操作即可完成 大概需要不到5分钟(排除网络原因)
至此,jenkins环境搭建成功

安装fastlane和fir-CLI

fastlane和fir-CLI工具介绍

fastlanefir-CLI是一组工具套件,旨在实现iOS应用发布的自动化,并且提供一个良好的持续集成和部署流程,只需要一个点击或者一个命令就可以触发这个流程

shenzhen已经由一年以上没有更新了,很多功能都并不是很好用了,所以在这里我们才会安装fastlane这个工具,截止到2016年07月,fastlane工具还是可以上传到itc的

rubygems环境搭建

fastlane 和 shenzhen都是ruby编写的 所以要用到gem安装
查看当前的ruby版本

$ ruby –v

若输出

$ ruby x.x.x

代表ruby gem安装成功已经安装,若没有安装rubygems 可以利用我们刚刚搭建好的brew包管理来安装gem

$ brew install ruby

注:gems其实是ruby的包管理,ruby自1.9.2以后已经安装gems
gem安装完成后我们还要修改ruby的下载源到国内
参考网站(只需要了解到该网站下的如何使用就可以了)
http://gems.ruby-china.org/

安装fastlane

安装fastlaneshenzhen的前提是确保已经安装了xcode-tool-chain工具链,如果本地没有安装这个工具链,需要下载并安装,最简单的办法就是下载xcode

若已经安装了这个工具链(一般本地安装了xcode软件,会自动安装这个工具链的),键入如下命令

$ sudo gem install fastlane

可能需要输入密码,密码为现在mac登入账户下的登录密码

如果出现如下错误

while executing gem ... (Errno::EPERM)
…
…

…

键入

$ export GEM_HOME=~/.ruby;sudo nvram boot-args="rootless=0"; sudo reboot

等待重启完成后继续安装fastlane

$ sudo gem install –n /usr/local/bin fastlane  --no-ri --no-rdoc

$ sudo gem install –n /usr/local/bin fir-cli --no-ri --no-rdoc

为项目初始化fastlane

检查初始化

查看项目code文件夹下,与xcodeproj同级目录下是否存在fastlane文件夹
如果存在,可以跳过这一步,直接进行jenkins设置和环境搭建
如果不存在,则要为项目初始化fastlane了

开始

在终端中cd 到项目所在的文件夹下,注意:与xcodeproj文件同级)
执行下面的命令

$ fastlane init

按照提示完成输入
贴几张样例图

  • 初始化输入appleid(该appleid 必须是对应着该项目的,而且在本地xcode中已经登录并存在与钥匙串中,并确保证书已经下载)
  • 核对信息下载文件
    fastlane初始化结束后,会在本地生成一个名为fastlane的文件夹文件夹内包含三个文件和两个额外的文件夹

Appfile
Deliverfile
Fastfile
metadata
copyright.txt
primary_category.txt
primary_first_sub_category.txt
primary_second_sub_category.txt
secondary_category.txt
secondary_first_sub_category.txt
secondary_second_sub_category.txt
zh-Hans
description.txt
keywords.txt
marketing_url.txt
name.txt
privacy_url.txt
release_notes.txt
support_url.txt

screenshots

这其中最重要的也是和上传相关最大关联的文件就是Fastfile和metadata文件夹中的zh-Hans文件夹中的内容.

其中: description.txt:是描述这个app的文本文档
keywords.txt::appstore ASO(搜索关键字)
marketing_url.txt :销售url
name.txt: 应用名称,一般不会修改
release_notes.txt: 应用更新内容, 一般在发布版本的时候都会修改

Fastfile文件样例: (ruby代码)

# Customise this file, documentation can be found here:
# https://github.com/fastlane/fastlane/tree/master/fastlane/docs
# All available actions: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Actions.md
# can also be listed using the `fastlane actions` command

# Change the syntax highlighting to Ruby
# All lines starting with a # are ignored when running `fastlane`

# If you want to automatically update fastlane if a new version is available:
# update_fastlane

# This is the minimum version number required.
# Update this, if you use features of a newer version
fastlane_version "1.98.0"

default_platform :ios

platform :ios do
  before_all do
    # ENV["SLACK_URL"] = "https://hooks.slack.com/services/..."
    
    
  end

  desc "Runs all the tests"
  lane :test do
    scan
  end

  desc "Submit a new Beta Build to Apple TestFlight"
  desc "This will also make sure the profile is up to date"
  lane :beta do
    # match(type: "appstore") # more information: https://codesigning.guide
    gym(scheme: "example") # Build your app - more options available
    pilot

    # sh "your_script.sh"
    # You can also use other beta testing services here (run `fastlane actions`)
  end

  desc "Deploy a new version to the App Store"
  lane :appstore do
    # match(type: "appstore")
    # snapshot
    gym(scheme: "example") # Build your app - more options available
    deliver(force: true)
    # frameit
  end
  # You can define as many lanes as you want

  after_all do |lane|
    # This block is called, only if the executed lane was successful

    # slack(
    #   message: "Successfully deployed new App Update."
    # )
  end
  error do |lane, exception|
    # slack(
    #   message: exception.message,
    #   success: false
    # )
  end
end
# More information about multiple platforms in fastlane: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Platforms.md
# All available actions: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Actions.md

# fastlane reports which actions are used
# No personal data is recorded. Learn more at https://github.com/fastlane/enhancer

到现在为止,所有的准备工作已经就绪,现在我们就要进入jenkins的后台去进行持续集成了.

注意:fastlane的init工作一般只进行一次,如果发现存在fastlane文件夹,就不要进行这个工作了,而且这个文件会随着svn或者git一起上传上去

我已经减少了不必要下载的文件和样例,只保留了两个文件 fastlane/metadata/zh-Hans/下的description.txt和release_notes.txt 因为在我看来,这个文件才是有可能经常会改动的,其他的如果想要修改,可以去https://itunesconnect.apple.com 上登录去修改

jenkins的配置和自动打包脚本的编写

启动jenkins

在终端输入

$ jenkins –h

输出结果:

如果看到最后一行 Jenkins is fully up and running 则代表jenkins启动成功

在浏览器(safiri或chrome中输入地址 127.0.0.1:8080),默认jenkins的启动端口是8080

如果是第一次进入到后台,会有一些基本的配置需要来完成.按照提示来就可以了
到最后一步,会让我们去安装插件,如果网络环境不好,可能会出现安装失败的情况,但是不会影响主要功能的使用

jenkins界面

如果所有的配置都是在正确的,那么你会看到这样的界面

顾名思义:
新建 可以新建一个持续集成的任务
用户 管理用户
任务历史 可以查看持续集成的历史
系统管理 类似于系统设置,一般我们使用的较多的功能则是插件管理.
Credentials 管理所有的通行证,可以是git的也可以是svn的……

构建view界面

构建视图view可以查看当前的构建的队列和构建任务的进行情况

搭建基于jenkins的iOS_example_beta项目

  • 项目目的
    建立该项目的目的主要是为了一键能够将iOS应用example能够快速方便的提供给测试人员测试,并且能够将项目一键打包成三个版本(dev,qa,prod)和分发给测试人员测试

  • 新建任务
    回到主面板,点击新建

  • 输入信息
    名称我们定为iOS_example_beta
    紧接着选择 构建一个只有风格的软件项目 最后点击ok

  • 源码管理
    随后进入一个新的页面 找到源码管理

如果发现源码管理中没有找到你想要的 可能是没有安装对应的插件,安装插件的过程如下
主界面系统管理管理插件可选插件找到 GIT plugin或者Subversion Plug-in勾选后点击最下面的按钮直接安装安装完后重启即可

可能会由于网络的原因,安装失败或根本不能访问到jenkins-ci.org
提供一个subversion.hdi的国内私有下载地址,如果失效,请另行想办法下载

$ wget http://7xrlqi.com1.z0.glb.clouddn.com/subversion.hpi

下载完成后,上传到jenkins安转即可
主界面系统管理管理插件高级上传插件选择文件后上传完成后重启

插件安装完成后,进入到项目配置页面,找到源码管理
这个项目我们使用的是svn 输入svn的地址和用户名密码

  • 添加构建命令
    找到 构建 这一栏点击增加构建步骤 点击 Execute shell

输入如下命令

#1.usr/bin/env bash
source ~/.bash_profile

发布qa环境

en="qa"
#打包文件存放的目录
di="${HOME}/jenkins/app/${JOB_NAME}/${en}/"
#打包的文件的名称
name="example_${en}-${BUILD_NUMBER}-`date \"+%m月%d日%H时%M分\"`.ipa"
#ci环境变量路径
cienvpath="${WORKSPACE}/example/ci.env"
#修改ci.env的值 
echo "{\"env\":\"${en}\"}">$cienvpath
#修改应用名称
sed -i '' -e "s/example/example_${en}/g" ${WORKSPACE}/example/Info.plist
mkdir -p $di
#打包

#编译环境
scheme="example"
configuration="Debug"
export_method='ad-hoc'
#指定项目地址
in_path="${WORKSPACE}/example.xcodeproj"
#指定输出归档文件地址
archive_path="$di/archive/example_${en}-${BUILD_NUMBER}-`date \"+%m月%d日%H时%M分\"`.xcarchive"
#先清空前一次build在发布
gym --project ${in_path} --scheme ${scheme} --clean --configuration ${configuration} --archive_path ${archive_path} --export_method ${export_method} --output_directory ${di} --output_name ${name}

#ipa build -c Release -d $di --ipa $name
#发布到蒲公英
curlfileurl="@${di}${name}"
curl -F "file=${curlfileurl}" -F "uKey=..." -F "_api_key=..." http://www.pgyer.com/apiv1/app/upload

#还原名称
sed -i '' -e "s/example_${en}/example/g" ${WORKSPACE}/example/Info.plist


#发布production环境 ali环境(测试用) 不是发布到App Store
en="prod"
di="${HOME}/jenkins/app/${JOB_NAME}/${en}/"
name="example_${en}-${BUILD_NUMBER}-`date \"+%m月%d日%H时%M分\"`.ipa"
echo "{\"env\":\"${en}\"}">$cienvpath
sed -i '' -e "s/example/example_${en}/g" ${WORKSPACE}/example/Info.plist
mkdir -p $di
#打包
#编译环境
scheme="example"
configuration="Debug"
export_method='ad-hoc'
#指定项目地址
in_path="${WORKSPACE}/example.xcodeproj"
#指定输出归档文件地址
archive_path="$di/archive/example_${en}-${BUILD_NUMBER}-`date \"+%m月%d日%H时%M分\"`.xcarchive"
#先清空前一次build在发布
gym --project ${in_path} --scheme ${scheme} --clean --configuration ${configuration} --archive_path ${archive_path} --export_method ${export_method} --output_directory ${di} --output_name ${name}

#发布到testin
curlfileurl="@${di}${name}"
#上传到testin
curl -F "file=${curlfileurl}" -F "user_key=..." -F "update_notify=1" http://api.pre.im/api/v1/app/upload


#还原名称
sed -i '' -e "s/example_${en}/example/g" ${WORKSPACE}/example/Info.plist

#发布dev环境
en="dev"
di="${HOME}/jenkins/app/${JOB_NAME}/${en}/"
name="example_${en}-${BUILD_NUMBER}-`date \"+%m月%d日%H时%M分\"`.ipa"
echo "{\"env\":\"${en}\"}">$cienvpath
sed -i '' -e "s/example/example_${en}/g" ${WORKSPACE}/example/Info.plist
mkdir -p $di
#发布到fir.im 需要安装gem插件 fir-cli #gem install fir-cli
fir upgrade
fir build_ipa ${WORKSPACE} -o $di$name -p -T ...

点击保存

  • 开始第一次构建
    现在我们回到主面板,发现已经多了一个名为 iOS_example_qa 的项目,点击进入后 点击立即构建开始第一次构建

配置一键上传iTunesConnect

项目目的

建立该项目的目的主要是为了一键能够将iOS应用example能够快速方便的上传到苹果iTunesConnect的服务器,节省开发人员和上传人员的时间

建立任务

如4.3.1所示,新建一个名为iOS_example_appstore的任务
svn地址和描述都和上一个一样

编写脚本

如4.3.4所示:脚本更改内容如下

#1.usr/bin/env bash
cd ${WORKSPACE}
chmod +x upload2Appstore.sh
./upload2Appstore.sh

upload2Appstore.sh 这个文件是随着svn一起down下来的
附: upload2Appstore.sh 源码

#1.usr/bin/env bash

cienvpath="example/ci.env"
#修改ci.env的值 
echo "{\"env\":\"production\"}">$cienvpath

rm -f example.ipa
rm -f example.app.dSYM.zip

fastlane ios appstore
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 143,540评论 1 302
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 61,539评论 1 258
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 95,005评论 0 213
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 41,159评论 0 180
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 48,946评论 1 258
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 38,864评论 1 178
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,468评论 2 273
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,218评论 0 167
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 29,070评论 6 234
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 32,574评论 0 213
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,353评论 2 215
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 30,683评论 1 232
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 24,270评论 0 32
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,168评论 2 214
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 31,591评论 3 210
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,638评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,035评论 0 166
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 33,590评论 2 232
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 33,685评论 2 233

推荐阅读更多精彩内容