Github Action介绍
Github Action
是一种持续集成和持续交付(CI/CD) 平台,可用于自动执行生成、测试和部署管道,它是Github提供的持续集成服务,在2018年的时候推出。每个Github账户每个月都有固定的免费时长用于构建,超出免费时长后收费
计划 | 存储 | 分钟数(每月) |
---|---|---|
GitHub Free | 500 MB | 2000 |
GitHub Pro | 1GB | 3000 |
GitHub Organization Free | 500 MB | 2000 |
GitHub Team | 2 GB | 3000 |
GitHub Enterprise Cloud | 50 GB | 50000 |
Github Action
有3种操作环境可供选择,在Windows 和 macOS 运行器上运行的作业,其消耗分钟数是在 Linux 运行器上运行的作业的 2 倍和 10 倍。 例如,1,000 分钟的 Windows 使用时间将占用帐户中包含的 2,000 分钟。 1,000 分钟的 macOS 使用时间将占用帐户中包含的 10,000 分钟
操作系统 | 消耗系数 |
---|---|
Linux | 1 |
Windows | 2 |
macOS | 10 |
Github的工作流
工作流
是由一个或多个作业组成的可配置自动化流程,工作流文件使用 YAML 语法,并且必须具有.yml或.yaml文件扩展名
name
工作流程的名称。GitHub 在存储库的“操作”选项卡下显示工作流程的名称。如果省略name,GitHub 将显示相对于存储库根目录的工作流文件路径
run-name
从工作流生成的工作流运行的名称。如果run-name
省略或仅为空格,则运行名称将设置为工作流运行的事件特定信息。例如,对于由push
或pull_request
事件触发的工作流,将其设置为提交消息
on
要自动触发工作流,例如on: push
代表当有推送到存储库中的任何分支时,将会执行工作流;可以配合过滤器使用,比如:
on:
push:
branches:
- main
- 'releases/**'
例如,该push事件具有一个branches过滤器,该过滤器会导致工作流仅在发生与过滤器匹配的分支的推送时运行branches,而不是在发生任何推送时运行
workflow_dispatch
如果配置workflow_dispatch后,将只能通过手动执行workflow,例如:
on:
workflow_dispatch:
# inputs代表输入参数
inputs:
# 输入参数logLevel,下面的参数配置代表为选择性的输入
logLevel:
description: 'Log level'
required: true
default: 'warning'
type: choice
options:
- info
- warning
- debug
# 输入参数tags,下面的参数配置代表bool类型的输入
tags:
description: 'Test scenario tags'
required: false
type: boolean
# 输入参数environment,下面的参数配置代表可选环境
environment:
description: 'Environment to run tests against'
type: environment
required: true
jobs:
log-the-inputs:
runs-on: ubuntu-latest
steps:
- run: |
echo "Log level: $LEVEL"
echo "Tags: $TAGS"
echo "Environment: $ENVIRONMENT"
env:
LEVEL: $
TAGS: $
ENVIRONMENT: $
YAML语法的详细介绍https://learnxinyminutes.com/docs/yaml/
Github secrets介绍
iOS包的构建过程中,有一个非常重要的iOS证书配置,包含3个部分,P12文件和密码以及PROVISIONING_PROFILE文件
配置不成功就会导致打包失败,Github上并不能通过显式的方式安装证书,它推荐我们将证书转换为Base64格式并存储在github secrets
。
github secrets
github secrets
是在组织、存储库或存储库环境中创建的变量。您创建的github secrets
可在 GitHub Actions 工作流程中使用。仅当工作流中明确包含机密时,GitHub Actions 才能读取该机密,因此它非常安全。
创建github secrets
在Github存储库名称下,单击 “Settings”,然后在左侧菜单中Serurity
-> Secrets and variables
-> Actions
有两种类别分别是Environment secrets
和Repository secrets
- `Environment secrets`:特定于 Github Actions 中的环境,它允许您在单个存储库中使用不同的配置运行不同的环境
- `Repository secrets`:特定于单个存储库(以及其中使用的所有环境)
接下来我们使用github secrets将证书文件保存上去
- 使用
base64 -i BUILD_CERTIFICATE.p12 | pbcopy
将p12证书文件复制到剪切板当中,保存在github secrets上,名称可以随便取,我采用的是P12_BASE64
,内容就是文件的base64格式 - github secrets再新建一个用于保存p12证书的密码,名称为
P12_PASSWORD
,内容就是p12证书文件的密码(注意不是base64格式) - 使用
base64 -i PROVISIONING_PROFILE.mobileprovision | pbcopy
将provisioning文件复制到剪切板中,保存在github secrets上,名称为MOBILEPROVISION_BASE64
,内容就是文件的base64格式
准备工作完成,接下来进入yml命令编写及打包的过程
iOS打包
下面是完整的YML文件,该工作流采用手动触发的形式
name: release-ios
on:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
inputs:
# 这里可以定义输入参数
deploy:
description: 'start deploy'
required: false
default: 'true'
jobs:
build_with_signing:
runs-on: macos-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: pod
run: pod install
- name: Install the Apple certificate and provisioning profile
env:
BUILD_CERTIFICATE_BASE64: $
P12_PASSWORD: $
BUILD_PROVISION_PROFILE_BASE64: $
KEYCHAIN_PASSWORD: $
run: |
# create variables
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
# import certificate and provisioning profile from secrets
echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH
echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH
# create temporary keychain
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
# import certificate to keychain
security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security list-keychain -d user -s $KEYCHAIN_PATH
# apply provisioning profile
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
- name: Build app
run: |
BUILD_FOLDER=$RUNNER_TEMP/Build
TARGET_ARCHIVE=$BUILD_FOLDER/QMSPad.xcarchive
xcodebuild \
-quiet \
-workspace QMSPad.xcworkspace \
-scheme QMSPad \
-sdk iphoneos \
-configuration Release \
-archivePath ${TARGET_ARCHIVE} \
archive
echo "----------开始执行导出----------"
EXPORT_OPTIONS_PLIST=$GITHUB_WORKSPACE/Script/ExportOptions.plist
TARGET_IPA_PATH=${BUILD_FOLDER}/IPA
PROJECT_RUN_ENV="terminal" xcodebuild \
-exportArchive \
-archivePath ${TARGET_ARCHIVE} \
-exportPath ${TARGET_IPA_PATH} \
-exportOptionsPlist ${EXPORT_OPTIONS_PLIST} \
-allowProvisioningUpdates
- name: Publish iOS Artefacts
uses: actions/upload-artifact@v4.3.1
with:
name: release-ios
path: $/Build/IPA
if-no-files-found: error
最后打包出来的产出物,在Artifacts
上存放,可以自己下载,也可以将ipa包上传到fir提供测试
本文首次发布于 孙忠良 Blog, 作者 [@sunzhongliang] , 转载请保留原文链接.