云原生之旅 – 13)基于 Github Action 的自动化流水线

前言

GItHub Actions是一个持续集成和持续交付的平台,能够让你自动化你的编译、测试和部署流程。GitHub 提供 Linux、Windows 和 macOS 虚拟机来运行您的工作流程,或者您可以在自己的数据中心或云基础架构中托管自己的自托管运行器。它是 GitHub 于2018年10月推出的持续集成服务。

 

基本概念 

  • workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
  • job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
  • step(步骤):每个 job 由多个 step 构成,一步步完成。
  • action (动作):每个 step 可以依次执行一个或多个命令(action)

 ### 本文同步发表于知乎 //zhuanlan.zhihu.com/p/584810055

 

使用

下面用例子来介绍一个workflow

首先定义一个workflow 的 name 

# This is a CICD workflow for demo
name: cicd-demo

然后定义一下事件触发机制

# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the below branch and specific path
on:
  push:
    branches:
    - main
    - develop
    paths:
      - 'demo-app/**'
  pull_request:
    branches:
    - main
    paths:
      - 'demo-app/**'

然后定义一个 Build Job 以及 Outputs 供后续步骤使用

jobs:
# The "build" job
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest
    outputs:
      image_tag: ${{ steps.build_app.outputs.image_tag }}
      actor: ${{ steps.build_app.outputs.actor }}
    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:

来看Steps

Checkout 代码

    steps:
    # Checks-out your repository under $GITHUB_WORKSPACE
    - name: checkout repo
      uses: actions/checkout@v3

Setup go env

    - name: Setup go
      uses: actions/setup-go@v3
      with:
        go-version-file: 'demo-app/go.mod'
        check-latest: true
        cache: true
        cache-dependency-path: demo-app/go.sum

Login google container registry

    - name: Login to GCR
      uses: docker/login-action@v2
      with:
        registry: asia.gcr.io
        username: _json_key
        password: ${{ secrets.GCR_JSON_KEY }}

Build Image and Push to registry

make 命令很简单,执行的就是docker build 和 push

    - name: build application
      id: build_app
      run: |-
        VER=`cat demo-app/Makefile| grep TAG= | awk -F "=" 'NR==1{print $2}'`
        GIT_COMMIT=$(git log | grep commit | awk 'NR==1{print $2}' | cut -c1-7) 
        cd helm-go-client
        make push TAG2=-$GIT_COMMIT
        # set output
        echo "::set-output name=image_tag::$(echo "$VER-$GIT_COMMIT")"
        echo "::set-output name=actor::$(echo "$GITHUB_ACTOR")"

Makefile 供参考

export TAG=1.0.0
export DOCKERHUB=wadexu007/demo-app

hello:
	echo "This is Go client call helm sdk"

local: hello
	echo "run locally"
	go run main.go

build: hello
	echo "building docker container"
	docker build -t ${DOCKERHUB}:${TAG} .

push: build
	echo "pushing to my docker hub"
	docker push ${DOCKERHUB}:${TAG}

Makefile

### 本文同步发表于知乎 //zhuanlan.zhihu.com/p/584810055

 

Post setup

    # Workaround to avoid Post Use step failures related to cache
    # Error: There are no cache folders on the disk
    - name: Post setup
      run: mkdir -p /home/runner/.cache/go-build
      continue-on-error: true

接下来我们定义Deploy job

Checkout K8S YAML manifests repository

  deploy:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest
    needs: build
    steps:    
    # Checks-out k8s YAML manifests repository 
    - name: checkout k8s manifests repo
      uses: actions/checkout@v3
      with:
        # clone //github.com/xxx/sre_manifests which contains deploy manifests
        repository: xxx/sre_manifests
        # auth by ssh key or personal toke 
        ssh-key: ${{ secrets.SSH_PRIVATE_KEY }}
        ref: refs/heads/master

然后用Kustomize 来 Edit image tag, 它是由上面步骤 output出来的

    # Update image version
    - name: Update Kubernetes resources
      run: |
       cd demo-manifests/services/demo-app/dev 
       kustomize edit set image asia.gcr.io/sre-dev/demo-app:${{ needs.build.outputs.image_tag }}
       cat kustomization.yaml

接下来我们可以直接连到cluster kubectl apply部署, 也可以commit 代码然后触发 ArgoCD, ArgoCD可以自动Sync repo来部署以及更新同步资源,后续文章会讲到。

下面例子是 gcloud login 然后 获取cluster 最后用kubectl apply 部署资源。

      # authentication via credentials json
      - id: 'auth'
        uses: 'google-github-actions/auth@v0'
        with:
          credentials_json: '${{ secrets.GCR_JSON_KEY }}' # test key's json
      # Setup gcloud CLI
      - name: Set up Cloud SDK
        uses: google-github-actions/setup-gcloud@v0
      # Get the GKE credentials so we can deploy to the cluster
      - name: Set up GKE credentials
        run: |-
          gcloud container clusters get-credentials xxx_gke_cluster --region xxx_gke_region --project xxx_gcp_project
      # Deploy to the GKE cluster
      - name: Deploy
        run: |-
          gcloud container clusters list --project xxx_gcp_project
          cd demo-manifests/services/demo-app/dev
          cat kustomization.yaml
          kustomize build . | kubectl apply -f -
kubectl rollout status deploy/demo-app -n demo

 完整例子可以参考 My Github repo

### 本文同步发表于知乎 //zhuanlan.zhihu.com/p/584810055

 

参考

//docs.github.com/en/actions/quickstart
 
 
感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以打赏和推荐,您的鼓励是我创作的动力