github action

github action 原理,使用

简介

持续集成 (CI): 是一种需要频繁提交代码到共享仓库的软件实践。可以包括代码语法检查(检查样式格式)、安全性检查、代码覆盖率、功能测试及其他自定义操作。

GitHub Actions 是 GitHub 的持续集成服务,每一步操作是一个单独的action(可以认为是一个脚本),将action进行组合,构建自己的发布工作流。工作流程可在 GitHub 托管的虚拟机或您自行托管的机器上运行。

公共存储库中标准 GitHub 托管的运行器和自托管运行器可免费使用 GitHub Actions。 对于专用存储库,每个 GitHub 帐户可获得一定数量的免费时间和存储以用于 GitHub 托管的运行器,具体取决于帐户的计划。 超出包含数量的任何使用量都由支出限制控制。

基本概念

  1. workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。

  2. job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。

  3. step(步骤):每个 job 由多个 step 构成,一步步完成。每个step的环境是单独的,在一个step 对环境的操作不会影响到其他的step。

  4. action (动作):每个 step 可以依次执行一个或多个命令(action)。

  5. workflow(工作流配置):GitHub Actions 的配置文件叫做 workflow 文件,存放在代码仓库的.github/workflows目录,采用yml格式编写,一个库可以有多个 workflow 文件。GitHub 只要发现.github/workflows目录里面有.yml文件,就会自动运行该文件。

  6. Runner:运行的环境,https://github.com/actions/runner-images,可运行macOS 的镜像(价格10倍于Linux),预装了各版本Xcode,模拟器。公开账户免费,私有账户每月免费2000分钟(Linux标准),付费账户可使用更好配置的Runner。

配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 工作流名称
name: GitHub Pages       

# 触发时机:定时,手动,HTTP触发。
# 指定操作等,可参考https://docs.github.com/zh/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows
# on字段也可以是事件的数组。 [push, pull_request]
on:
  push:
    branches:
      - main  # Set a branch to deploy
  pull_request:

# 要执行的任务
jobs:
  my-job:                        # 任务的`job_id`,具体名称自定义。
    name: My Job                 # 自定义名称
    runs-on: ubuntu-latest       # 所需要的虚拟机环境。它是必填字段
    steps:                       # 指定每个 Job 的运行步骤,可以包含一个或多个步骤
    - name: Print a greeting     # 步骤名称。

	  # 使用 `concurrency` 以确保只有使用相同并发组的单一作业或工作流才会同时运行。 并发组可以是任何字符串或表达式。
      concurrency:
        group: ${{ github.workflow }}-${{ github.ref }}
        
      env:                       # 当前step,环境变量
        MY_VAR: Hi there! My name is
        FIRST_NAME: Mona
      
      if: ${{ github.ref == 'refs/heads/main' }}    # 除非满足条件,否则不运行。
      
      #输入给action的参数。 每个输入参数都是一个键/值对。 输入参数被设置为环境变量。
      with: 
	    github_token: ${{ secrets.GITHUB_TOKEN }}
        publish_dir: ./public 
      
      run: |                     
        echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.

  job2:
    needs: my-job      # 依赖关系
  job3:
    needs: [job1, job2]     

常用action

  • checkout:拉取代码到本地
  • actions/upload-artifact:将一些运行的数据保存下来
  • setup-*:固定好环境配置,如java,ruby,node等。

常见问题

  1. push 代码403,权限被拒,需要在settings里为action开放写权限。
  2. 大文件无法上传到GitHub,可利用长裤的release存储。
  3. 密钥等信息直接存放到 项目里的 Actions secrets and variables里。
  4. 免费账户,Ubuntu,跑安卓模拟器,推荐配置
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

jobs:
    build-and-test-android:
        name: Android - Build and run Detox tests
        runs-on: ubuntu-latest
        timeout-minutes: 60
        permissions:
            contents: read
        env:
          NODE_ENV: development
        steps:
            - name: Checkout Code
              uses: actions/checkout@v4
              with:
                fetch-depth: 1

            - name: Setup Node.js
              uses: actions/setup-node@v4
              with:
                node-version: 22.2.0
                cache: 'npm'
                cache-dependency-path: './${{ github.event.inputs.appName }}/package-lock.json'

            - name: Set up Ruby
              uses: ruby/setup-ruby@v1
              with:
                ruby-version: '3.4.5'
                bundler-cache: false 

            - name: Setup Java
              uses: actions/setup-java@v4
              with:
                distribution: zulu
                java-version: 17
            
            - name: Install system dependencies
              run: |
                sudo apt-get update
                sudo apt-get install -y libpulse0    // 启动模拟器需要                

    
            - name: Run android tests
              uses: reactivecircus/android-emulator-runner@v2
              with:
                api-level: 29
                target: default
                arch: x86_64
                ram-size: 2048M
                heap-size: 512M
                disk-size: 6144M
                avd-name: Android_API29
                force-avd-creation: false
                emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -no-skin -no-metrics
                disable-animations: true
  1. 在一个step下的操作,如切换路径,设置环境(非GitHub ENV 环境)不回影响其他step。
  2. 一些缓存操作,需要流程执行成功才可缓存成功。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计