- GitHub Actions 官方文档
- 这里默认你已经对YMAL 及 GitHub Actions 工作流有所了解
- 下面所讲的主要是让你快速了解GitHub Actions 并集成到自己的项目中
了解GitHub Actions
- GitHub Actions 是 github 发布的一款CI/CD 工具, 它使用 hook 技术来帮助你完成流水线的操作,完全不用借助 GUI 工具。当我们打包时,打包机可以设置成自己的主机。也可以使用 github 提供的打包机,不过 github 提供的打包机免费时长有限,超过免费时长后是要缴费才能用的,了解收费请前往使用限制、计费和管理
配置 GitHub Actions
配置 ymal 文件
- 首先 GitHub Actions 是 github 发布的功能,所以你的代码仓库要在github 上,才可以使用该工具。
-
可以通过 github 上代码仓库下的 Actions Tab 来配置 Github Actions ,我们只需要按照页面的提示,点击 set up workflow yourself 来添加一个工作流就好,详情如下图
-
我们可以自定义工作流文件的名称,注意不要修改文件类型,github Actions配置文件使用的YMAL 格式的。文件里配置的内容可以先不用管,然后点击 Start commit 提交就好,操作如下图
- 在Start commit 后,我们就可以到仓库主目录下看到新增了一个 .github->workflow->***.yml 的目录
- 以上就给我们的仓库添加 github Actions功能,不过想让它按照你的意愿工作,还需你在刚才添加的***.yml 文件中去用代码实现你的流程。
配置打包流程
初识
- 我们以官方生成的默认文档为例先了解一下 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: 控制工作流什么时候执行, 这其中的 push 和 pull_request 表示的是什么事件会触发这个工作流的执行, branches 表示的是发生在那个分支,当然可以有多个分支。
on:
push:
branches: [ master, dev*] # 这里是指定多个分支上的 push 事件都可以触发工作流的执行, 其中 dev*代表所有以 dev 开头的分支名
- jobs: 就是我们工作流的内容
- build: 表示下面工作的名称, 一个 jobs 中可以有多个工作
- runs-on: 表示该流程运行在哪里, 这里可以用 github 提供的云主机,也可以用自己的打包机
runs-on: self-hosted # 这里就是指定该流程运行在本机上
runs-on: [self-hosted,macOS,X64],这种指定的更加详细点,要求本地主机操作系统是 macOs, 同时是 X64 架构
runs-on: macos-latest # 这里指定该步骤运行在 github 提供的最新 MAC OS 系统上,
- steps: 表示是具体的步骤
- steps 中的 name: 每个步骤我们可以使用 name 给该步骤命个名,当然也可以没有 name
- steps 中的 uses: 每个步骤中我们用的插件,插件我们可以在Actions 插件库中自己查找需要的插件
- steps 中的 with: 如果我们使用的插件需要一些参数,这写参数就需要在 with 下配置
- steps 中的 run: 如果我们不用写好的插件,而是要用写的脚本或指令,这个时候我们就需要用 run,比如 :可以使用 run: pod install 来用 pod 安装三方库, 也可以使用run: exec .github/scripts/import-profile.sh 运行我们写的import-profile.sh脚本
- steps 中的 id: 该步骤的标识,可以用这个标识来找到该步骤,后面我们就是通过 id 来找到该步骤设置的环境变量
- 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 执行多行命令,这个 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/[email protected]
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": "这个即将发布的新版本称它为。而在此之前,每当面临重大升级产品经理们都会取一个应景的代",
"title": "ios 自动打包",
"messageUrl": "https://www.pgyer.com/****" # 包在蒲公英上的位置
}
}
- 第一步: 使用的是Checkout插件将代码下载到本地,这个插件的详细用法就不多少了,想了解的可以点进去具体去看
- 第二步: 执行 pod install ,如果你没有使用 pod 这步可以略过
- 第三步: 这里是输出一个时间变量,给后面导出的包命名用
- 第四步: 使用的是Build iOS Action插件, 具体用法可以点进去看,
注意
:
project-path
参数,不论有没有用 pod 都需要传的
team-id
可以在 Xcode->工程名->Targets->Signing & Capabilities -> Siging -> Team 中查看
code-signing-identity
这个一定要跟 Build Setting -> Code Signing Identity 中对应的设置的一致,如果你不是Automatically manage signing
这里就不要填iOS Distribution或 iOS Development, 而是填你对应的开发者,可以在 Xcode 中将其拷贝出来
output-path
参数:使用了上一步获取的时间变量(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插件时,需要一些参数,其中
p12-key-base64
、p12-cer-base64
、mobileprovision-base64
、code-signing-identity
、team-id
都使用到了${{secrets.***}},这些是什么东西呢?从参数名就可以看出这些就是我们打包需要的证书,描述文件,签名的信息。它们是从里获取的呢? 接下来我们就对其进行配置,然后就知道从哪里获取的了。 - 还是到我们 github 的代码仓库下, 找到 Settings, 在 Settings 下找到 Secrets , 通过 Secrets 右上角的 New repository secret 就可以新添加我们的 secret 了,这里要注意 Build iOS Action插件使用的 secret 名称一定要与这里添加的一样,还要注意,Build iOS Action插件要求的 cer,p12,描述文件都是要经过 base64 运算的,如果你用的别的插件,则根据别的插件的要求进行添加
- 配置到这里,如果你用的是 github 提供的云打包机,这里已经可以,但如果你用的是自己本地主机,请继续看下面。
配置 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 的执行了
是不是感觉很简单,不过我在配置的时候还是遇到一些问题的,下面我按顺序将我遇到大问题一一记录下来,供大家参考
- 问题一:
刚开始我用的是 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",应该是用证书的开发者如"Apple Development: *** *** (4HU553XF99)" - 问题三:
在执行 插件时报: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 "[email protected]:"]
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插件代码,发现这个钥匙串是它在打包的时候创建的,而且密码是随机生成的,所以我不知道密码,索性我将其删了,但是后再打包的时候还是会弹出来。后来我我所有的证书,描述文件,全部删了,然后重新只添加打包需要的,并在 github->settings->secrects 中的 secrect 更新了一遍,然后再打包就好了。 - 总结:如果遇到 fastline 生成钥匙串的错误,我总结大概率是证书,描述文件,p12 文件,签名,teamid 配置的不配套,我建议把这些删了重新配置一遍,我有几次遇到这种问题都是这样操作的,记得把钥匙串中生成的 ios-build 钥匙串删除,再打包,另外证书记得添加在登录钥匙串中