- GitHub Actions 官方文檔
- 這里默認你已經對YMAL 及 GitHub Actions 工作流有所了解
- 下面所講的主要是讓你快速了解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-base64
、code-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 鑰匙串刪除,再打包,另外證書記得添加在登錄鑰匙串中