1. 程式人生 > Android開發 >iOS進行CI整合

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檔案

CI配置詳解

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開發規範。