OC

GithubAction持续集成

Posted by sunzhongliang on April 12, 2023

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省略或仅为空格,则运行名称将设置为工作流运行的事件特定信息。例如,对于由pushpull_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 secretsRepository secrets

- `Environment secrets`:特定于 Github Actions 中的环境,它允许您在单个存储库中使用不同的配置运行不同的环境
- `Repository secrets`:特定于单个存储库(以及其中使用的所有环境)

接下来我们使用github secrets将证书文件保存上去

  1. 使用base64 -i BUILD_CERTIFICATE.p12 | pbcopy将p12证书文件复制到剪切板当中,保存在github secrets上,名称可以随便取,我采用的是P12_BASE64,内容就是文件的base64格式
  2. github secrets再新建一个用于保存p12证书的密码,名称为P12_PASSWORD,内容就是p12证书文件的密码(注意不是base64格式)
  3. 使用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] , 转载请保留原文链接.