Github Action Basic

Github Action 是做什么的?

  • Github Action 是一个基于repo的Push或Pull Request触发的事件驱动的workflow,在当前项目的.git/workflow/路径下的以 .yml 后缀的文件中定义工作流。

  • 一个工作流中,可以包含有一个或多个job,每个job可以有一个或多个Step。

  • Runners是运行workflow的环境,可以使用Github自带的runner(windows,ubuntu,mac, 预装了特定的软件环境),也可以使用自己的runner环境(只要具备联网能力的机器都可以)。

  • Github Action 使用的github host的runner,预装了aws cli,azure cli等各种工具,在通过Github Action做CD的时候,可以将 secrets 放在Github的 repository secret中,然后通过 ${{SECRET_NAME}} 的方式调用。secrets里面的值只有第一次存放的时候能看到,以后就看不到了,因此安全性会更有保障一些,尤其是对于运维人员不可见。

有关Github Action的介绍,参考:https://docs.github.com/en/actions/learn-github-actions/introduction-to-github-actions

一个Github Action的示例

  • 示例:获取Azure VM的list。有关在workflow中配置azure creds的方法,参考这里

name: GitHubAction-Example01

# 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:
  getlocation:
    runs-on: ubuntu-latest
    steps:
      - name: Get GITHUB_WORKSPACE_LOCATION
        run: echo $GITHUB_WORKSPACE
  echotest:
    runs-on: ubuntu-latest
    steps:
      - name: Run a one-line script
        run: echo Hello, world !
      - name: Run a multi-line script
        run: |
          echo echo another line,
          echo echo two more lines.
  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

      - name: Azure Login
        uses: azure/login@v1
        with:
          creds: ${{secrets.AZURE_CREDENTIALS}}
          environment: 'AzureCloud'
          enable-AzPSSession: false
          allow-no-subscriptions: false
      - name: Get AZ VM List
        run: |
          az vm list

有关uses

  • 上述代码中的 uses: actions/checkout@v2,相当于 git clone 项目到本地,就不用自己写了,使用起来比较方便.

  • 从上述示例中也可以看出, uses可以从github的repo中下载和部署应用,这样就能在环境内配置自己的应用依赖了。比如我们可以用下面的这个示例来配置k8s的kubectl: https://github.com/steebchen/kubectl

搜索github action

在将Github的代码部署到某个地方的时候,很多时候网上都有各种大神写好了 actions的插件,可以搜索Github Actions Azure或者 Github Actions AWS,Github Actions Kubectl 等方法直接使用别人写好的插件。

Github Action的触发

github action支持多种触发途径,比如可以通过 tag 触发,一旦打了tag就执行某个操作

name: label create
on:
  push:
    tags:
     - "*"
jobs:
  tagjob:
    runs-on: ubuntu-latest
    steps:
      - name: tag job
        run: |
          echo "hello tag created"
      

也可以手动触发,在触发的时候,可以通过文本框传变量,也可以通过下拉框传变量

name: manually

on:
  workflow_dispatch:
    inputs:
      username: 
        description: "input your username"
        default: "world"
        required: false
        type: string
      job:
        description: "select job from droplist"
        default: "none"
        type: choice
        options:
          - IT
          - DevOps
          - Dev
        required: true

jobs:
  manuallyjob:
    runs-on: ubuntu-latest
    steps:
      - name: manually trigger event
        run: |
          echo "hello ${{inputs.username}}"
          echo "your job is: ${{inputs.job}}"

也可以基于pr 创建,更新pr里的commit来进行触发。甚至在触发的时候,可以调用另外一个 workflow(需要指定这个workflow的yaml文件路径,同仓库,或者跨仓库都可以)

name: pr-open-update

on:
  pull_request:
      types: [opened, synchronize] 
jobs:
  call-workflow-in-local-repo:
    uses: ./.github/workflows/reuse-workflow.yaml
  testjob:
    runs-on:  ubuntu-latest
    steps:
    - name: pr open event
      run: |
        echo "this event is created when pr created"

上述 reuse-workflow.yaml 在编写的时候,需要on workflow_call事件,比如

name: reused-workflow
on:
  workflow_call:
jobs:
  deploy:
    runs-on: ubuntu-latest
    
    steps:
    - name: reuse
      run: |
        echo "this is reused workflow"

Github Action 里的checkout拉代码,是通过 graft 嫁接commit得方式获得,但是这个 graft commit 也是主分支的commit。我们在github action里获得主分支最新tag

      - name: get_tag
        id: get_tag
        run: |
          git fetch --tags
          tag=$(git describe --tags --exact-match)
          echo "latest_tag=${tag}"
          echo "tag=${tag}" >> $GITHUB_OUTPUT
      -
        name: Docker meta
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: myrepo.gcr.io/my_service
          tags: type=raw,value=${{ steps.get_tag.outputs.tag }}

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          tags: ${{ steps.meta.outputs.tags }}
          push: true

自己写github action

默认github action可以支持其他仓库,使用的时候为uses: org/repo:tag 的方式调用。github action编写支持Docker,js,以及composite三种方式,在action的git repo里,一定要指定 action.yaml或 action.yml,在这个文件的run里,定义了action runner的入口

学习链接:

https://docs.github.com/en/actions/quickstart https://blog.csdn.net/qq_39969226/article/details/106216566

最后更新于