iOS進行CI整合
CI介紹
GitLab CI 是GitLab內建的進行持續整合的工具,只需要在倉庫根目錄下建立.gitlab-ci.yml 檔案,並配置GitLab Runner;每次提交的時候,gitlab將自動識別到.gitlab-ci.yml檔案,並且使用Gitlab Runner執行該指令碼。
簡而言之,擁有有效配置項所需的步驟可以總結為:
1、新增.gitlab-ci.yml到您的儲存庫的根目錄 2、配置Runner
每次推送到Git儲存庫時,Runner都會自動啟動管道,並且該管道將顯示在專案的Pipelines頁面下。
gitlab-ci配置
GitLab CI使用YAML檔案(.gitlab-ci.yml)來管理專案配置。該檔案存放於專案倉庫的根目錄,並且包含了你的專案如何被編譯的描述語句。YAML檔案使用一系列約束敘述定義了Job啟動時所要做的事情。
.gitlab-ci.yml
檔案
stages:
- build
- test
- deploy
job 1:
stage: build
script: xxxx
job 2:
stage: build
script: xxxx
job 3:
stage: test
script: xxxx
job 4:
stage: deploy
script: xxxx
複製程式碼
stages是可以支援的步驟,job可以自定義命名,job下的stage是相同的說明這些job可以併發執行,如果是不同的就按stages規定的步驟依次執行。script是可以執行的shell命令。
給GitLab上的server安裝runner
https://docs.gitlab.com/runner/install/osx.html
複製程式碼
專案倉庫配置runner介面
找到當前專案的Runner配置
配置Runner需要的token,配置成功如下
Runner都配置完了,下面就可以對iOS寫相應的CI指令碼【script】了。
iOS CI場景
分支合併提醒
在dev-2.0拉出一個業務分支feature/2.0-room進行開發,這時候dev-2.0也許會修復一些bug,我在feature/2.0-room開發的分支應該及時合併dev-2.0的程式碼過來,feature/2.0-room打包的時候測試就會驗證到這些問題。
.gitlab-ci.yml
before_script:
- echo 'this is before script'
- git version
- uname -a
- xcodebuild -version
- sw_vers
stages:
- check
- build
- test
- deploy
merge_check:
stage: check
tags:
- check
script:
- echo "Merge Check..."
- pwd
- python3 -u ci/merge_check.py $CI_COMMIT_REF_NAME
only:
- /^feature.*$/
複製程式碼
only代表只有我當前的分支名符合/^feature.*$/這個正則的情況下才出發merge_check這個job。 tags代表我需要排程的Runner服務的哪一個tag。
主分支程式碼檢查
before_script:
- echo 'this is before script'
- git version
- uname -a
- xcodebuild -version
- sw_vers
stages:
- check
- build
- test
- deploy
code_style_check:
stage: check
tags:
- check
script:
- echo "Code Style Check..."
- pwd
- git fetch
- echo "Source Branch " $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
- echo "Target Branch " $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
- git diff origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME...origin/$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME -- '*.h' '*.m' -U0 | grep '^[+]' | grep -Ev '^(--- a/|\+\+\+ b/)' | sed 's/^+//' > ./tmp.diff || echo 'nothing to diff' > ./tmp.diff
- python3 code_style_check.py $CI_MERGE_REQUEST_TARGET_BRANCH_NAME $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
only:
- merge_requests
複製程式碼
merge_requests只有feature的業務合併到dev的時候,才觸發code_style_check這個job。 gif diff出dev和feature的不同寫到tmp.diff檔案裡面,對tmp.diff進行程式碼檢查舒服符合規範。
def rule_else(line):
if '}else' in line or 'else{' in line:
print("❌ else 兩側需要有空格: } else {",flush=True)
stop(line,'spaces around else')
def rule_if(line):
if 'if(' in line:
print("❌ if( 中間需要空格",'spaces after if')
def rule_space(line):
if '){' in line:
print("❌ 需要空格 ){ -> ) {",'space between ){')
def rule_string_define_copy(line):
if 'NSString' in line and '@property' in line and 'copy' not in line and '<' not in line:
print("❌ NSString 需要用 copy 修飾",'NSString need copy')
def rule_comma(line):
if ',' in line and ',\n' not in line and ',' not in line and ',"' not in line:
print("❌ 逗號右側要有空格",'space after comma')
複製程式碼
程式碼檢查的部分指令碼如上,對tmp.diff每一行進行掃描,檢查是否符合iOS開發規範。