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


    前言

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

     

    基本概念 

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

     ### 本文同步发表于知乎 https://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

    ### 本文同步发表于知乎 https://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 https://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

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

     

    参考

    https://docs.github.com/en/actions/quickstart
     
     
    感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以打赏和推荐,您的鼓励是我创作的动力
     
     
  • 相关阅读:
    双十一数码产品选购指南,2022年数码产品选购清单
    Unity——对象池
    Linux消息队列信号量(了解)
    【操作系统】了解Linux操作系统中PCB进程管理模块与进程PID
    Qt扫盲-QJsonObject理论总结
    Java反序列化
    论文阅读:ECAPA-TDNN
    c++学习【23】matlab实现FOC算法
    mysql数据库进阶
    钉钉统计部门个人请假次数go
  • 原文地址:https://www.cnblogs.com/wade-xu/p/16863921.html