你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 使用GitLab來實現IOS項目的持續集成CI

使用GitLab來實現IOS項目的持續集成CI

編輯:IOS開發綜合

作為程序員,代碼是一定要寫的,而且要天天寫。在好多地方見過這樣一種說法:

只會寫程序的程序員不是好程序員

當然,我不贊同這種觀點,因為有的人他天生就是為程序而生的。但是掌握一些代碼之外的理論知識也是一個不錯的選擇,它能讓你的代碼質量上一個新的台階,能極大的提高你的“摳碼”效率。

最近新的APP即將上線,但在產品、研發、運營幾個環節出了一些問題,也讓我靜下心來思考一些一個程序員覺得很難直面的問題。這其中和技術相關的問題包括:

APP版本更新較為頻繁的問題。

測試覆蓋不到位的問題。

APP的開發可能跟以前我所經歷的大部分企業級應用軟件、IaaS\/PaaS平台、大數據平台相關產品完全的不同,為了響應市場需求,APP的迭代周期要以周為單位(打開手機看看常用 的APP大部分每周一更新),IOS還受到蘋果審核周期的影響,會有更多的不可控因素。為了解決這些問題,目前我們主要做的工作包括幾個方面:

解決運營和產品環節的反饋機制問題。

優化APP的打包、測試的方式。

合理的制定版本發布計劃。

今天想給技術人員分享的主要就是持續集成和交付/部署(CI/CD)方面的一些基礎知識,同時結合我們現在正在開發的APP中遇到的一些問題,和大家共同探討如何才能更好的優化我們的產品打包、測試過程。

持續集成和持續交付/部署 CI/CD

Continuous Integration (CI) is a development practice that requires developers to integrate code into a shared repository several times a day. Each check-in is then verified by an automated build, allowing teams to detect problems early.

By integrating regularly, you can detect errors quickly, and locate them more easily.

上面對CI的定義參考 thoughtworks,可能把它生硬的翻譯過來也不太好理解,我從這些年的產品研發過程中見到過的各種CI工具來定義CI的話,可以做如下定義:

CI是軟件(產品)研發生命周期中對代碼質量、系統集成的一個持續構進的過程,當作為一個團隊開發產品時,每個人都要開發自己的功能模塊,最終都需要集成在一起,代碼也需要集中托管到同一個地方,通過使用一些自動化的代碼打包、測試工具,能夠在開發人員每提交一次代碼的時候,系統自動對程序進行打包和單元測試,如果出現問題,及時通過郵件等方式通知相關的開發人員。

5年前,我還在從事企業級應用軟件的開發,那時根本就沒有什麼單元測試,更沒有自動打包、測試的工具,也就大家開發完功能,提交到SVN服務器,還有一個專業的人在需要打包裡把代碼down下來在自己機器上打包,然後部署到測試環境跑一把,沒什麼大問題就上生產環境。現在想想還是真“土”。

這幾年,我和我的團隊主要是基於openstack開發一款企業級的雲管理平台,從一開始的懵懵懂懂,到現在形成比較成熟的基於CI的整個開發流程,也爬過了一個又一個的坑和坎。

目前我們比較成熟的套路是: _ git+gerrit+jenkins _

其中git用於代碼托管,gerrit主要是是代碼的評審,jenkins用於打包和跑單元測試。這樣的組合百度一下,會有很多先輩們已經寫了很多博客和文章,我這裡就不在爛費精力了。今天我想介紹一下的是目前我們的APP開發過程中想采用的gitlab。要不然大家都覺得我寫的東西沒干貨,也不好意思啊。

GitLab

GitLab是一個集代碼管理、測試、代碼部署於一體的開源應用程序,它包括一個有非常好的權限控制的Git版本管理系統,代碼評審系統,問題跟蹤系統,活動反饋系統,wiki,持續集成CI系統等。

上面的翻譯可能有點別扭,沒辦法,我就這水平了,咱們直接進入正題吧。

我個人比較喜歡的就是gitlab長的太像github了,使用很方便,同時采用了github的pull request方式來對代碼進行審核,還集成了CI(雖然大部分還是要看你寫腳本的水平如何)。

我將通過使用一個ios的demo項目來給大家展示如何用gitlab來管理代碼、進行代碼審核、CI等等。

安裝GitLab

在Docker盛行的今天,我也就偷偷懶,跑個docker實例給大家演示一下,如果您在打算在生產環境使用gitlab,可以參考官方的安裝文檔,包括一些集群方案都能找到。用Docker跑gitlab就一個命令:

這裡假設我們的服務器IP是:47.88.21.77 一定要記得根據您的實際情況更改IP地址哦。

sudo docker run --detach --hostname gitlab.example.com --env GITLAB_OMNIBUS_CONFIG="external_url 'http://47.88.21.77/'; gitlab_rails['lfs_enabled'] = true;" --publish 443:443 --publish 80:80 --publish 22:22 --name gitlab --restart always --volume /srv/gitlab/config:/etc/gitlab --volume /srv/gitlab/logs:/var/log/gitlab --volume /srv/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest

服務啟動後,浏覽器進入:http://47.88.21.77/

gitlib_login

首次進入可以設置root的密碼,注冊用戶即可進入系統,這裡我們演示時使用的用戶名是cjzhao,登錄後如下圖所示:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="gitlab_firstpage" src="/uploadfile/Collfiles/20160806/201608060919431129.png" title="\" />

空空如也……

使用gitlab評審代碼

在這裡可以創建組織、項目,基本概念和github一樣,這裡我們直接創建我們要演示的項目ios_ci_demo。

gitlab_newproject

OK,多的不解釋了,一看就懂。

gitlab_projecthome

創建完成後,進入項目首頁,看到黃色的提示信息了吧,為了能從遠程把代碼推到服務器,需要配置一個ssh公鑰,點擊add an SSH key把你自己的公鑰添加完成,就可以把代碼上傳上去了,這個過程就不截圖了哦,看到我的公鑰也不是太好……呵呵。

添加完公鑰後,回到項目首頁,如下圖所示:

gitlab_codeuploadmethod

我們根據第三種方法把現有的代碼上傳到gitlab,即執行下面的代碼:

cd existing_folder
git init
git remote add origin [email protected]:cjzhao/ios_ci_demo.git
git add .
git commit
git push -u origin master

我們的app很簡單,如下圖所示:

Simulator_hello

很明顯, word是錯的哦,後面我們將演示另一個用戶修改完後提交代碼,並做代碼審核。

上傳完代碼後,進入項目首頁,如下圖所示:

gitlab_project_home_first

再注冊一個新用戶jack,然後用cjzhao登錄後,進入項目設置頁面(如下圖所示),把jack增加到項目中,這樣他就能提交代碼了。

gitlab_project_setting_menu

添加的過程自己研究吧,很簡單,要不編輯會認為我的文章就靠截圖湊數了。加完後如下圖所示:

gitlab_add_user_to_project

OK了,接下來用用戶jack修改代碼,並提交到git服務器。

jack的操作主要包括以下幾個步驟:

git clone [email protected]:cjzhao/ios_ci_demo.git
git checkout -b wordbug
//將word改為world
git add .
git commit -m "change word to world"
git push origin wordbug

這時jack登錄系統後,會看到提交的代碼,同時系統會提示您創建一個Merge request,如下圖所示:

gitlab_create_merge_request

點擊Create Merge Request,填寫一些修改內容的描述信息,請求cjzhao將代碼合並到master即可提交。

cjzhao登錄系統後就能看到jack請求合並的分支,如下圖所示:

gitlab_accept_merge_request

在完成代碼評審後,點擊Accept Merge Request即可將代碼合並到master。選中Remove source branch同時將wordbug分支刪除。

OK,這就完成了多開發人員合作的項目代碼評審流程。

gitlab中的CI

在gitlab中完成持續集成CI包括兩個操作:

配置一個Runner(用來編譯、測試、打包的服務器節點)。

在項目根目錄增加YAML格式的CI腳本文件.gitlab-ci.yml。

配置Runner

我們首先來為我們的項目配置一個Runner,由於我們的項目是ios的,因此需要在安裝了macos操作系統和xcode的環境下才能編譯、打包我們的APP,因此我們需要將一台mac計算機配置成我們的一個Runner,基本原理就是在Mac上安裝一個代理程序gitlab-ci-multi-runner,然後將mac注冊到gitlab服務器端,然後這台mac機器就能接收到gitlab服務器下發的CI任務,完成相應的編譯、測試、打包等工作,然後將結果反饋給gitlab服務器。

在一台Mac機器上執行如下命令安裝gitlab-ci-multi-runner(可能需要翻牆才能裝哦):

sudo curl --output /usr/local/bin/gitlab-ci-multi-runner https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-darwin-amd64

sudo chmod +x /usr/local/bin/gitlab-ci-multi-runner

進入項目的Runner配置頁面,如下圖所示:

gitlab_config_runner

在Mac機器上執行如下命令,將這台Mac注冊到gitlab並綁定到我們示例項目。

gitlab-ci-multi-runner register
#Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):
#輸入上圖中的URL.
#Please enter the gitlab-ci token for this runner:
#輸入上圖中的token.
#Please enter the gitlab-ci description for this runner:
#輸入一個描述信息,這裡我們輸入mac_runner
#Please enter the gitlab-ci tags for this runner (comma separated):
#輸入一些標簽,這裡我們輸入"mac,xcode7.1"
# Registering runner... succeeded runner=euasz2j9 
#Please enter the executor: docker-ssh+machine, docker, docker-ssh, parallels, shell, ssh, virtualbox, docker+machine:
#這裡我們輸入shell,因為ios項目的編譯、測試、打包我們都采用腳本來執行。
#Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
#注冊成功,接下來啟動它
gitlab-ci-multi-runner install 
gitlab-ci-multi-runner start

現在我們的Mac機器就注冊為一個Runner了,查看項目的Runner頁面,如下圖所示:

gitlab_runner_running

我們的Runner就成功注冊上了。接下來就可以編寫CI的腳本了。

增加CI腳本文件.gitlab-ci.yml

在項目根目錄創建.gitlab-ci.yml文件,內容如下:

stages:
  - build
  - archive

build_project:
  stage: build
  script: 
    - xctool -project ioscidemo.xcodeproj -scheme ioscidemo clean
    - xctool -project ioscidemo.xcodeproj -scheme ioscidemo test -test-sdk iphonesimulator9.3

archive_project:
  stage: archive
  script: 
    - xctool -project ioscidemo.xcodeproj -scheme ioscidemo archive -archivePath build/ioscidemo
    - xcodebuild -exportArchive -exportFormat ipa -archivePath "build/ioscidemo.xcarchive" -exportPath "build/ioscidemo.ipa"
  only: 
    - master
  artifacts:
    paths:
      - build/ioscidemo.ipa

上面腳本使用了xctool,它是facebook推出的一款替代xcodebuild的app打包和測試工具,它日志輸出更加友好,性能高效,我們需要在剛才安裝了Runner的Mac機器上先安裝它,可以使用如下命令安裝:


brew install xctool

OK,接下來就是提交我們最新的代碼了:


git add .

git commit -m "add CI cfg file"

git push origin master

如果沒有什麼異常的話,CI已經在開始執行編譯、測試、打包等工作了。見下圖所示:

gitlab_project_build_status

看到綠色的passed了吧?這就說明編譯、測試、打包都成功了(我可是耗費了好長時間才成功的哦,中間總會出現各種各樣的問題)。就寫到這兒吧,最後再給大家提供一點CD的思路(技術層面的),剛才的過程已經完成了app的打包,我們可以創建一個Releases的分支,在腳本中增加APP上傳到itunesconnect的腳本,這樣就可以在發布新版本的時候完成APP的整個發布流程。

Apple給我們提供了一套命令行工具altool可以直接把ipa上傳到itunesconnect,很方便的

OK,真的結束了,自己去研究吧。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved