基于jenkins搭建iOS APP持續(xù)集成和發(fā)布環(huán)境

安裝jenkins

java環(huán)境準(zhǔn)備

jenkins主要依賴的java環(huán)境 所以確保電腦中java環(huán)境準(zhǔn)確就緒支撐軟件檢測(cè)是否已經(jīng)部署了java環(huán)境在終端輸入

$ java –version

如果出現(xiàn)類似于如下的字樣 則標(biāo)識(shí)您已經(jīng)安裝了java環(huán)境

$ java version "1.8.0_77"

若出現(xiàn)如下

$ -bash: java: command not found

則表示沒有安裝java環(huán)境 則需要下載java安裝下載地址 (1.8版本,后續(xù)下載版本下載地址可能會(huì)有變化)jre 1.8 下載安裝后重復(fù)上述步驟 確保java環(huán)境成功搭建

在mac上安裝jenkins

  • 安裝HomeBrew
    jenkins依賴HomeBrew包管理,所以我們要先安裝homebrew,
    若已安裝則跳轉(zhuǎn),查看方法
$ brew -v

若正確顯示版本信息則代表安裝成功安裝homebrew(參考網(wǎng)站)安裝完成之后
homebrew的源在國(guó)外,所以我們需要配置一下使之下載的快一點(diǎn)參考網(wǎng)站 http://ban.ninja
在終端中輸入

$ vim ~/.bash_rc

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

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

注:以上工作都是前期準(zhǔn)備,因?yàn)榇蟛糠职芾?包括brew和gem)的源都在國(guó)外,所以可能下載速度會(huì)很感人

  • 開始安裝jenkins
    在終端輸入
$ brew install jenkins

根據(jù)提示操作即可完成 大概需要不到5分鐘(排除網(wǎng)絡(luò)原因)
至此,jenkins環(huán)境搭建成功

安裝fastlane和fir-CLI

fastlane和fir-CLI工具介紹

fastlanefir-CLI是一組工具套件,旨在實(shí)現(xiàn)iOS應(yīng)用發(fā)布的自動(dòng)化,并且提供一個(gè)良好的持續(xù)集成和部署流程,只需要一個(gè)點(diǎn)擊或者一個(gè)命令就可以觸發(fā)這個(gè)流程

shenzhen已經(jīng)由一年以上沒有更新了,很多功能都并不是很好用了,所以在這里我們才會(huì)安裝fastlane這個(gè)工具,截止到2016年07月,fastlane工具還是可以上傳到itc的

rubygems環(huán)境搭建

fastlane 和 shenzhen都是ruby編寫的 所以要用到gem安裝
查看當(dāng)前的ruby版本

$ ruby –v

若輸出

$ ruby x.x.x

代表ruby gem安裝成功已經(jīng)安裝,若沒有安裝rubygems 可以利用我們剛剛搭建好的brew包管理來安裝gem

$ brew install ruby

注:gems其實(shí)是ruby的包管理,ruby自1.9.2以后已經(jīng)安裝gems
gem安裝完成后我們還要修改ruby的下載源到國(guó)內(nèi)
參考網(wǎng)站(只需要了解到該網(wǎng)站下的如何使用就可以了)
http://gems.ruby-china.org/

安裝fastlane

安裝fastlaneshenzhen的前提是確保已經(jīng)安裝了xcode-tool-chain工具鏈,如果本地沒有安裝這個(gè)工具鏈,需要下載并安裝,最簡(jiǎn)單的辦法就是下載xcode

若已經(jīng)安裝了這個(gè)工具鏈(一般本地安裝了xcode軟件,會(huì)自動(dòng)安裝這個(gè)工具鏈的),鍵入如下命令

$ sudo gem install fastlane

可能需要輸入密碼,密碼為現(xiàn)在mac登入賬戶下的登錄密碼

如果出現(xiàn)如下錯(cuò)誤

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

…

鍵入

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

等待重啟完成后繼續(xù)安裝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

為項(xiàng)目初始化fastlane

檢查初始化

查看項(xiàng)目code文件夾下,與xcodeproj同級(jí)目錄下是否存在fastlane文件夾
如果存在,可以跳過這一步,直接進(jìn)行jenkins設(shè)置和環(huán)境搭建
如果不存在,則要為項(xiàng)目初始化fastlane了

開始

在終端中cd 到項(xiàng)目所在的文件夾下,注意:與xcodeproj文件同級(jí))
執(zhí)行下面的命令

$ fastlane init

按照提示完成輸入
貼幾張樣例圖

  • 初始化輸入appleid(該appleid 必須是對(duì)應(yīng)著該項(xiàng)目的,而且在本地xcode中已經(jīng)登錄并存在與鑰匙串中,并確保證書已經(jīng)下載)
  • 核對(duì)信息下載文件
    fastlane初始化結(jié)束后,會(huì)在本地生成一個(gè)名為fastlane的文件夾文件夾內(nèi)包含三個(gè)文件和兩個(gè)額外的文件夾

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

這其中最重要的也是和上傳相關(guān)最大關(guān)聯(lián)的文件就是Fastfile和metadata文件夾中的zh-Hans文件夾中的內(nèi)容.

其中: description.txt:是描述這個(gè)app的文本文檔
keywords.txt::appstore ASO(搜索關(guān)鍵字)
marketing_url.txt :銷售url
name.txt: 應(yīng)用名稱,一般不會(huì)修改
release_notes.txt: 應(yīng)用更新內(nèi)容, 一般在發(fā)布版本的時(shí)候都會(huì)修改

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

到現(xiàn)在為止,所有的準(zhǔn)備工作已經(jīng)就緒,現(xiàn)在我們就要進(jìn)入jenkins的后臺(tái)去進(jìn)行持續(xù)集成了.

注意:fastlane的init工作一般只進(jìn)行一次,如果發(fā)現(xiàn)存在fastlane文件夾,就不要進(jìn)行這個(gè)工作了,而且這個(gè)文件會(huì)隨著svn或者git一起上傳上去

我已經(jīng)減少了不必要下載的文件和樣例,只保留了兩個(gè)文件 fastlane/metadata/zh-Hans/下的description.txt和release_notes.txt 因?yàn)樵谖铱磥?這個(gè)文件才是有可能經(jīng)常會(huì)改動(dòng)的,其他的如果想要修改,可以去https://itunesconnect.apple.com 上登錄去修改

jenkins的配置和自動(dòng)打包腳本的編寫

啟動(dòng)jenkins

在終端輸入

$ jenkins –h

輸出結(jié)果:

如果看到最后一行 Jenkins is fully up and running 則代表jenkins啟動(dòng)成功

在瀏覽器(safiri或chrome中輸入地址 127.0.0.1:8080),默認(rèn)jenkins的啟動(dòng)端口是8080

如果是第一次進(jìn)入到后臺(tái),會(huì)有一些基本的配置需要來完成.按照提示來就可以了
到最后一步,會(huì)讓我們?nèi)グ惭b插件,如果網(wǎng)絡(luò)環(huán)境不好,可能會(huì)出現(xiàn)安裝失敗的情況,但是不會(huì)影響主要功能的使用

jenkins界面

如果所有的配置都是在正確的,那么你會(huì)看到這樣的界面

顧名思義:
新建 可以新建一個(gè)持續(xù)集成的任務(wù)
用戶 管理用戶
任務(wù)歷史 可以查看持續(xù)集成的歷史
系統(tǒng)管理 類似于系統(tǒng)設(shè)置,一般我們使用的較多的功能則是插件管理.
Credentials 管理所有的通行證,可以是git的也可以是svn的……

構(gòu)建view界面

構(gòu)建視圖view可以查看當(dāng)前的構(gòu)建的隊(duì)列和構(gòu)建任務(wù)的進(jìn)行情況

搭建基于jenkins的iOS_example_beta項(xiàng)目

  • 項(xiàng)目目的
    建立該項(xiàng)目的目的主要是為了一鍵能夠?qū)OS應(yīng)用example能夠快速方便的提供給測(cè)試人員測(cè)試,并且能夠?qū)㈨?xiàng)目一鍵打包成三個(gè)版本(dev,qa,prod)和分發(fā)給測(cè)試人員測(cè)試

  • 新建任務(wù)
    回到主面板,點(diǎn)擊新建

  • 輸入信息
    名稱我們定為iOS_example_beta
    緊接著選擇 構(gòu)建一個(gè)只有風(fēng)格的軟件項(xiàng)目 最后點(diǎn)擊ok

  • 源碼管理
    隨后進(jìn)入一個(gè)新的頁面 找到源碼管理

如果發(fā)現(xiàn)源碼管理中沒有找到你想要的 可能是沒有安裝對(duì)應(yīng)的插件,安裝插件的過程如下
主界面系統(tǒng)管理管理插件可選插件找到 GIT plugin或者Subversion Plug-in勾選后點(diǎn)擊最下面的按鈕直接安裝安裝完后重啟即可

可能會(huì)由于網(wǎng)絡(luò)的原因,安裝失敗或根本不能訪問到j(luò)enkins-ci.org
提供一個(gè)subversion.hdi的國(guó)內(nèi)私有下載地址,如果失效,請(qǐng)另行想辦法下載

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

下載完成后,上傳到j(luò)enkins安轉(zhuǎn)即可
主界面系統(tǒng)管理管理插件高級(jí)上傳插件選擇文件后上傳完成后重啟

插件安裝完成后,進(jìn)入到項(xiàng)目配置頁面,找到源碼管理
這個(gè)項(xiàng)目我們使用的是svn 輸入svn的地址和用戶名密碼

  • 添加構(gòu)建命令
    找到 構(gòu)建 這一欄點(diǎn)擊增加構(gòu)建步驟 點(diǎn)擊 Execute shell

輸入如下命令

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

發(fā)布qa環(huán)境

en="qa"
#打包文件存放的目錄
di="${HOME}/jenkins/app/${JOB_NAME}/${en}/"
#打包的文件的名稱
name="example_${en}-${BUILD_NUMBER}-`date \"+%m月%d日%H時(shí)%M分\"`.ipa"
#ci環(huán)境變量路徑
cienvpath="${WORKSPACE}/example/ci.env"
#修改ci.env的值 
echo "{\"env\":\"${en}\"}">$cienvpath
#修改應(yīng)用名稱
sed -i '' -e "s/example/example_${en}/g" ${WORKSPACE}/example/Info.plist
mkdir -p $di
#打包

#編譯環(huán)境
scheme="example"
configuration="Debug"
export_method='ad-hoc'
#指定項(xiàng)目地址
in_path="${WORKSPACE}/example.xcodeproj"
#指定輸出歸檔文件地址
archive_path="$di/archive/example_${en}-${BUILD_NUMBER}-`date \"+%m月%d日%H時(shí)%M分\"`.xcarchive"
#先清空前一次build在發(fā)布
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
#發(fā)布到蒲公英
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


#發(fā)布production環(huán)境 ali環(huán)境(測(cè)試用) 不是發(fā)布到App Store
en="prod"
di="${HOME}/jenkins/app/${JOB_NAME}/${en}/"
name="example_${en}-${BUILD_NUMBER}-`date \"+%m月%d日%H時(shí)%M分\"`.ipa"
echo "{\"env\":\"${en}\"}">$cienvpath
sed -i '' -e "s/example/example_${en}/g" ${WORKSPACE}/example/Info.plist
mkdir -p $di
#打包
#編譯環(huán)境
scheme="example"
configuration="Debug"
export_method='ad-hoc'
#指定項(xiàng)目地址
in_path="${WORKSPACE}/example.xcodeproj"
#指定輸出歸檔文件地址
archive_path="$di/archive/example_${en}-${BUILD_NUMBER}-`date \"+%m月%d日%H時(shí)%M分\"`.xcarchive"
#先清空前一次build在發(fā)布
gym --project ${in_path} --scheme ${scheme} --clean --configuration ${configuration} --archive_path ${archive_path} --export_method ${export_method} --output_directory ${di} --output_name ${name}

#發(fā)布到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

#發(fā)布dev環(huán)境
en="dev"
di="${HOME}/jenkins/app/${JOB_NAME}/${en}/"
name="example_${en}-${BUILD_NUMBER}-`date \"+%m月%d日%H時(shí)%M分\"`.ipa"
echo "{\"env\":\"${en}\"}">$cienvpath
sed -i '' -e "s/example/example_${en}/g" ${WORKSPACE}/example/Info.plist
mkdir -p $di
#發(fā)布到fir.im 需要安裝gem插件 fir-cli #gem install fir-cli
fir upgrade
fir build_ipa ${WORKSPACE} -o $di$name -p -T ...

點(diǎn)擊保存

  • 開始第一次構(gòu)建
    現(xiàn)在我們回到主面板,發(fā)現(xiàn)已經(jīng)多了一個(gè)名為 iOS_example_qa 的項(xiàng)目,點(diǎn)擊進(jìn)入后 點(diǎn)擊立即構(gòu)建開始第一次構(gòu)建

配置一鍵上傳iTunesConnect

項(xiàng)目目的

建立該項(xiàng)目的目的主要是為了一鍵能夠?qū)OS應(yīng)用example能夠快速方便的上傳到蘋果iTunesConnect的服務(wù)器,節(jié)省開發(fā)人員和上傳人員的時(shí)間

建立任務(wù)

如4.3.1所示,新建一個(gè)名為iOS_example_appstore的任務(wù)
svn地址和描述都和上一個(gè)一樣

編寫腳本

如4.3.4所示:腳本更改內(nèi)容如下

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

upload2Appstore.sh 這個(gè)文件是隨著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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末充易,一起剝皮案震驚了整個(gè)濱河市哈蝇,隨后出現(xiàn)的幾起案子材失,更是在濱河造成了極大的恐慌淮蜈,老刑警劉巖旦部,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塞弊,死亡現(xiàn)場(chǎng)離奇詭異蔫缸,居然都是意外死亡惋鸥,警方通過查閱死者的電腦和手機(jī)猬腰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門鸟废,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姑荷,你說我怎么就攤上這事盒延。” “怎么了鼠冕?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵添寺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我懈费,道長(zhǎng)计露,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任憎乙,我火速辦了婚禮票罐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泞边。我一直安慰自己该押,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布阵谚。 她就那樣靜靜地躺著蚕礼,像睡著了一般烟具。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奠蹬,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天朝聋,我揣著相機(jī)與錄音,去河邊找鬼罩润。 笑死玖翅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的割以。 我是一名探鬼主播金度,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼严沥!你這毒婦竟也來了猜极?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤消玄,失蹤者是張志新(化名)和其女友劉穎跟伏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翩瓜,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡受扳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兔跌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勘高。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坟桅,靈堂內(nèi)的尸體忽然破棺而出华望,到底是詐尸還是另有隱情,我是刑警寧澤仅乓,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布赖舟,位于F島的核電站,受9級(jí)特大地震影響夸楣,放射性物質(zhì)發(fā)生泄漏宾抓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一豫喧、第九天 我趴在偏房一處隱蔽的房頂上張望洞慎。 院中可真熱鬧,春花似錦嘿棘、人聲如沸劲腿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焦人。三九已至挥吵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間花椭,已是汗流浹背忽匈。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矿辽,地道東北人丹允。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像袋倔,于是被迫代替她去往敵國(guó)和親雕蔽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容