iOS 接入 Github Actions

了解GitHub Actions

  • GitHub Actions 是 github 發(fā)布的一款CI/CD 工具, 它使用 hook 技術來幫助你完成流水線的操作,完全不用借助 GUI 工具捏检。當我們打包時,打包機可以設置成自己的主機荞驴。也可以使用 github 提供的打包機,不過 github 提供的打包機免費時長有限,超過免費時長后是要繳費才能用的,了解收費請前往使用限制、計費和管理

配置 GitHub Actions

配置 ymal 文件

  • 首先 GitHub Actions 是 github 發(fā)布的功能,所以你的代碼倉庫要在github 上,才可以使用該工具贯城。
  • 可以通過 github 上代碼倉庫下的 Actions Tab 來配置 Github Actions ,我們只需要按照頁面的提示,點擊 set up workflow yourself 來添加一個工作流就好,詳情如下圖


  • 我們可以自定義工作流文件的名稱,注意不要修改文件類型,github Actions配置文件使用的YMAL 格式的熊楼。文件里配置的內容可以先不用管,然后點擊 Start commit 提交就好,操作如下圖


  • 在Start commit 后,我們就可以到倉庫主目錄下看到新增了一個 .github->workflow->***.yml 的目錄
  • 以上就給我們的倉庫添加 github Actions功能,不過想讓它按照你的意愿工作,還需你在剛才添加的***.yml 文件中去用代碼實現(xiàn)你的流程。

配置打包流程

初識
  • 我們以官方生成的默認文檔為例先了解一下 yml 文件中的內容
# This is a basic workflow to help you get started with Actions
name: CI
# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest
    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2

      # Runs a single command using the runners shell
      - name: Run a one-line script
        run: echo Hello, world!

      # Runs a set of commands using the runners shell
      - name: Run a multi-line script
        run: |
          echo Add other actions to build,
          echo test, and deploy your project.

我們先對上面的內容做個了解再逐步深入

  • name: 可以理解為該工作流的名稱
  • on: 控制工作流什么時候執(zhí)行, 這其中的 push 和 pull_request 表示的是什么事件會觸發(fā)這個工作流的執(zhí)行, branches 表示的是發(fā)生在那個分支,當然可以有多個分支能犯。
on:
  push:
    branches: [ master, dev*] # 這里是指定多個分支上的 push 事件都可以觸發(fā)工作流的執(zhí)行, 其中 dev*代表所有以 dev 開頭的分支名
  • jobs: 就是我們工作流的內容
  • build: 表示下面工作的名稱, 一個 jobs 中可以有多個工作
  • runs-on: 表示該流程運行在哪里, 這里可以用 github 提供的云主機,也可以用自己的打包機
runs-on: self-hosted # 這里就是指定該流程運行在本機上
runs-on: [self-hosted,macOS,X64],這種指定的更加詳細點,要求本地主機操作系統(tǒng)是 macOs, 同時是 X64 架構
runs-on: macos-latest # 這里指定該步驟運行在 github 提供的最新 MAC OS 系統(tǒng)上, 
  • steps: 表示是具體的步驟
  • steps 中的 name: 每個步驟我們可以使用 name 給該步驟命個名,當然也可以沒有 name
  • steps 中的 uses: 每個步驟中我們用的插件,插件我們可以在Actions 插件庫中自己查找需要的插件
  • steps 中的 with: 如果我們使用的插件需要一些參數(shù),這寫參數(shù)就需要在 with 下配置
  • steps 中的 run: 如果我們不用寫好的插件,而是要用寫的腳本或指令,這個時候我們就需要用 run,比如 :可以使用 run: pod install 來用 pod 安裝三方庫, 也可以使用run: exec .github/scripts/import-profile.sh 運行我們寫的import-profile.sh腳本
  • steps 中的 id: 該步驟的標識,可以用這個標識來找到該步驟,后面我們就是通過 id 來找到該步驟設置的環(huán)境變量
  • steps 中的 env: 該步驟設置的變量
    steps:
      - name: Print a greeting
        env:
          MY_VAR: Hi there! My name is
          FIRST_NAME: Mona
          MIDDLE_NAME: The
          LAST_NAME: Octocat
        run: echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.
  • run: 后面的| 表示run 執(zhí)行多行命令,這個 ymal 的語法,具體可以查看 ymal 語法,
run: |
  echo hello 
  echo world !
深入
  • 有了上面的基礎認識,下面我們結合我的打包流程再深入認識一下,下面是我完整的 ymal 文件
name: CI
on:
  push:
    branches: [ master* ]
  pull_request:
    branches: [ master* ]
   
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

jobs:
  build:
    runs-on: self-hosted
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2
        
      - name: pod
        run: pod install
        
      - name: Get current date
        id: date
        run: echo "::set-output name=date::$(date +'%m%d%H%m')"
    
      - uses: yukiarrr/ios-build-action@v1.4.0
        with:
            project-path: ***xcodeproj
            workspace-path: ***.xcworkspace # optional
            p12-key-base64: ${{ secrets.P12_KEY_BASE64 }}
            p12-cer-base64: ${{ secrets.P12_CER_BASE64 }}
            mobileprovision-base64: ${{ secrets.MOBILEPROVISION_BASE64 }}
            code-signing-identity: ${{ secrets.CODE_SIGNING_IDENTITY }}
            team-id: ${{ secrets.TEAM_ID }}
            export-method: 'development'
            output-path: /Users/***/Desktop/${{ steps.date.outputs.date }}/${{ github.run_number }}/me.ipa
            
      - name: push to fir
        id: PushToFir
        run: curl -F file=@/Users/***/Desktop/${{ steps.date.outputs.date }}/${{ github.run_number }}/me.ipa -F '_api_key=255538ec7cc065061e64e5f01f97278e' https://www.pgyer.com/apiv2/app/upload 

      - name: Send dingding notify
        uses: zcong1993/actions-ding@master
        with:
          dingToken: "bfc********496737765a2dc1c0c2"
          secret: "SECf559********0f563"
          body: |
            {
              "msgtype": "link",
              "link": {
                  "text": "這個即將發(fā)布的新版本稱它為鲫骗。而在此之前犬耻,每當面臨重大升級產品經理們都會取一個應景的代",
                  "title": "ios 自動打包",
                  "messageUrl": "https://www.pgyer.com/****" # 包在蒲公英上的位置
              }
            }
  • 第一步: 使用的是Checkout插件將代碼下載到本地,這個插件的詳細用法就不多少了,想了解的可以點進去具體去看
  • 第二步: 執(zhí)行 pod install ,如果你沒有使用 pod 這步可以略過
  • 第三步: 這里是輸出一個時間變量,給后面導出的包命名用
  • 第四步: 使用的是Build iOS Action插件, 具體用法可以點進去看,
    注意:
    project-path參數(shù),不論有沒有用 pod 都需要傳的
    team-id 可以在 Xcode->工程名->Targets->Signing & Capabilities -> Siging -> Team 中查看

    code-signing-identity 這個一定要跟 Build Setting -> Code Signing Identity 中對應的設置的一致,如果你不是Automatically manage signing 這里就不要填iOS Distribution或 iOS Development, 而是填你對應的開發(fā)者,可以在 Xcode 中將其拷貝出來

    output-path參數(shù):使用了上一步獲取的時間變量(steps.date.outputs.date) 和 本次運行的 number(github.run_number)
  • 第五步: 推送到蒲公英,具體代碼可以參考蒲公英文檔
  • 第六步: 接入釘釘機器人, 這里使用的是DingDing Notify Action插件,釘釘機器人接入步驟
  • 以上就是我配置的打包工作流,看到這里是不是了解更深入了一些。

上面我們輸出 ipa 包的路徑是寫死的絕對路徑,如果更換打包機,還要更換路徑,可以將其改成相對路徑如下:

      - name: Get current date
        id: date
        run: echo "::set-output name=date::$(date +'%m%d%H%m')"
        
      - name: Get current path
        id: path
        run: echo "::set-output name=path::${{ github.workspace }}/${{ steps.date.outputs.date }}/${{ github.run_number }}/me.ipa"

配置 Secrets

  • 上面build流程的第四步,我們用到ios-build-action插件時,需要一些參數(shù),其中p12-key-base64执泰、p12-cer-base64枕磁、mobileprovision-base64code-signing-identity术吝、team-id都使用到了${{secrets.***}},這些是什么東西呢?從參數(shù)名就可以看出這些就是我們打包需要的證書,描述文件,簽名的信息计济。它們是從里獲取的呢? 接下來我們就對其進行配置,然后就知道從哪里獲取的了。
  • 還是到我們 github 的代碼倉庫下, 找到 Settings, 在 Settings 下找到 Secrets , 通過 Secrets 右上角的 New repository secret 就可以新添加我們的 secret 了,這里要注意 Build iOS Action插件使用的 secret 名稱一定要與這里添加的一樣,還要注意,Build iOS Action插件要求的 cer,p12,描述文件都是要經過 base64 運算的,如果你用的別的插件,則根據(jù)別的插件的要求進行添加
  • 配置到這里,如果你用的是 github 提供的云打包機,這里已經可以,但如果你用的是自己本地主機,請繼續(xù)看下面排苍。
配置 runner
  • 在 github 倉庫下找到 Settings->Actions->Runners, 我們就是在這里添加 runner 的沦寂。可以直接通過右上角的Add runner 添加 runner, 按照指導一步一步添加就好淘衙。添加完成后就會在你所在的路徑生成actions-runner 文件夾凑队。
  • 添加好 runner 后,以后每次我們需要打包的時候,只需要到actions-runner 目錄下運行 ./run.sh 就會啟動我們的 runner, 所有的打包操作都是在actions-runner 目錄下進行的
  • 啟動 runner 后,我們到 github 的 setting->actions->runner 下就可以看到我們添加的 runner
  • 到這里我們就完成了本地主機打包 runner 的配置,如果你本地的 runner 已啟動,這個時候你可以做一次 push 代碼的操作,然后到 github 上的 Actions 上看 build 的執(zhí)行了

是不是感覺很簡單,不過我在配置的時候還是遇到一些問題的,下面我按順序將我遇到大問題一一記錄下來,供大家參考

  • 問題一:
    剛開始我用的是 github 提供的打包機進行打包的,打包完成后我一直在本地找不到導出包的位置,后來才明白打出的包是在 github 提供的主機里/Users/runner/Library/Developer/Xcode/Archives/。
  • 問題二:
    error: No certificate matching '***' found: Select a different signing certificate for CODE_SIGN_IDENTITY, a team that matches your selected certificate, or switch to automatic provisioning. (in target 'ActionsTest' from project 'ActionsTest')
    這里是因為我簽名寫的不對,我寫的是"iOS Developer",應該是用證書的開發(fā)者如"Apple Development: *** *** (4HU553XF99)"
  • 問題三:
    在執(zhí)行 插件時報: fatal: could not read Username for Error: fatal: could not read Username for 'https://hub.fastgit.org': terminal prompts disable The process '/usr/bin/git' failed with exit code 128
    這里是因為之前我 pod install 時,某些第三那方庫一直 download 不下來,所以我在根路徑下的.gitconfig 添加了下面代碼導致的幔翰。
[url "https://hub.fastgit.org"]
    insteadOf = https://github.com

將這段代碼更換成下面的就可以了

[url "git@github.com:"]
    insteadOf = https://github.com
  • 問題四:
    推送到蒲公英提示{"code":1021,"message":"Data of file can not be empty"}, 這里是因為我指定的路徑不對, 改為文件的絕對路徑后就可以了,比如file=@/Users/***/actions-runner/_work/Actions/Actions/output.ipa
  • 問題五:
    build 的過程工彈窗向我要 ios-build鑰匙串的密碼,后來看了Build iOS Action插件代碼,發(fā)現(xiàn)這個鑰匙串是它在打包的時候創(chuàng)建的,而且密碼是隨機生成的,所以我不知道密碼,索性我將其刪了,但是后再打包的時候還是會彈出來漩氨。后來我我所有的證書,描述文件,全部刪了,然后重新只添加打包需要的,并在 github->settings->secrects 中的 secrect 更新了一遍,然后再打包就好了。
  • 總結:如果遇到 fastline 生成鑰匙串的錯誤,我總結大概率是證書,描述文件,p12 文件,簽名,teamid 配置的不配套,我建議把這些刪了重新配置一遍,我有幾次遇到這種問題都是這樣操作的,記得把鑰匙串中生成的 ios-build 鑰匙串刪除,再打包,另外證書記得添加在登錄鑰匙串中
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末遗增,一起剝皮案震驚了整個濱河市叫惊,隨后出現(xiàn)的幾起案子塘装,更是在濱河造成了極大的恐慌审丘,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砚哗,死亡現(xiàn)場離奇詭異饰及,居然都是意外死亡蔗坯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門燎含,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宾濒,“玉大人,你說我怎么就攤上這事屏箍』婷危” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵赴魁,是天一觀的道長卸奉。 經常有香客問我,道長颖御,這世上最難降的妖魔是什么榄棵? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上疹鳄,老公的妹妹穿的比我還像新娘拧略。我一直安慰自己,他們只是感情好尚辑,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盔腔,像睡著了一般杠茬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弛随,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天瓢喉,我揣著相機與錄音,去河邊找鬼舀透。 笑死栓票,一個胖子當著我的面吹牛,可吹牛的內容都是我干的愕够。 我是一名探鬼主播走贪,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惑芭!你這毒婦竟也來了坠狡?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遂跟,失蹤者是張志新(化名)和其女友劉穎逃沿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幻锁,經...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡凯亮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了哄尔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片假消。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岭接,靈堂內的尸體忽然破棺而出置谦,到底是詐尸還是另有隱情,我是刑警寧澤亿傅,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布媒峡,位于F島的核電站,受9級特大地震影響葵擎,放射性物質發(fā)生泄漏谅阿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望签餐。 院中可真熱鬧寓涨,春花似錦、人聲如沸氯檐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冠摄。三九已至糯崎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間河泳,已是汗流浹背沃呢。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拆挥,地道東北人薄霜。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像纸兔,于是被迫代替她去往敵國和親惰瓜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內容