iOS 接入 Github Actions

  • 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-base64p12-cer-base64mobileprovision-base64code-signing-identityteam-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 钥匙串删除,再打包,另外证书记得添加在登录钥匙串中

你可能感兴趣的:(iOS 接入 Github Actions)