liusheng / liusheng.github.io

Liusheng's blog
http://liusheng.github.io
5 stars 1 forks source link

Github action及其与华为云CCE服务的集成 #38

Open liusheng opened 3 years ago

liusheng commented 3 years ago

作者: Liusheng

本文介绍Github action基本概念流程以及和华为云CCE集群资源集成,借此实现github开源项目利用华为云ARM资源实现ARM CI。

0. Github action简介

在Github 的代码仓库中自动化、自定义和执行软件开发工作流程以完成软件开发周期中特定的任务。 可以发现、创建和共享操作以执行任何作业(包括 CI/CD),并将操作合并到完全自定义的工作流程中。

1. 基本概念

Github action整个流程包含以下几个基本概念:

关于github action更多介绍可以查看其文档

下图示意了整个workflow流程: image

2. 使用示例

在项目repo的根目录下面添加.github/workflows/目录并新建一个yaml文件用于定义workflow,下面是一个简单的示例:

name: learn-github-actions
on: [push]
jobs:
  check-bats-version:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
      - run: npm install -g bats
      - run: bats -v

上面的是是一个workflow的定义,整个流程会在push到repo的提交这个行为发生的时候被触发。包含一个job,job会在Ubuntu最新的镜像的操作系统上执行,该job包含4个steps:

我们可以在github marketplace发现很多已有的 action。例如,一些有趣有用的github action:

3. Github action ARM平台支持

Github action曾经有计划支持ARM64平台,但是后续修改了其路标,短期内不计划支持ARM64平台,详见这里。在github社区也有很多人咨询github action能否支持ARM平台,社区主要建议使用self hosted runner的方式实现,而self hosted runner是github action提供的一种机制,允许接入外部的机器作为一个runner,对于公开仓库来说存在安全风险,具体详见这里

在研究过Github action机制后,发现github action可以实现对接公有云,从而在其工作流中使用公有云提供的资源(虚拟机、容器等)来执行具体的任务。在starter-workflows中定义了很多action使用用例,可以在github页面中添加workflow的时候给出流程模板,是github action官方的一些基础实例。在这个仓库目前已经有很多公有云实现了起容器集群资源的对接,如AWS、Azure、Google cloud、Aliyun等,见这里。而目前华为云还没有相应的Action实现。华为云CCE是华为云提供的云容器引擎,支持Kubernetes原生应用,可以支持使用Kubernetes的接口很方便地部署应用。

因此,实现对接华为云CCE集群资源的action,一方面是补全这方面的功能,另一方面,华为云提供了基于鲲鹏服务起的ARM64架构的资源,可以创建ARM64架构的CCE集群,以通用Kubernetes API方式集成到github action流程中从而满足开源项目ARM CI的基础要求。

下面是目前创建在华为云上的一个ARM64架构的CCE集群用于前期的测试: image

4. 创建自己的action

前面提到了action是整个流程里面可服用的最小代码段,github 支持创建Docker容器 action和JavaScript 以及二者结合3中类型。创建action也有两种形式:

这里我们以下面要介绍到的github action对接华为云CCE服务的action huaweicloud/cce-cluster-credentials为例来介绍如何创建一个github action。该action实现了根据输入的Access Key和Secret Access key来调用华为云的API鉴权后获取华为云CCE集群的认证信息。

根据使用场景,该action使用JavaScript开发,并且以单独的代码仓库实现以便于公开使用。action的实现核心是需要一个元数据文件定义action的输入、输出和主要处理入口,元数据文件名称必须是action.yaml。关于github action元数据可以见文档。 其中内容主要包括name, description, inputs, runs等字段。

下面既是github action对接华为云CCE集群的github action的元数据定义:

name: 'Huawei Cloud CCE cluster credentials' # 名称
description: 'Get the Huawei Cloud CCE cluster credential' # 描述
inputs: # 输入数据
  access-key-id:
    description: 'Access key id'
    required: true
    default: ''
  access-key-secret:
    description: 'Secret access key'
    required: true
    default: ''
# ......
branding: # action标签,用于在market place上展示
  color: 'green'
  icon: 'anchor'
runs: # 入口
  using: 'node12'
  main: 'dist/index.js'

上面定义了该action实现的输入数据,以及入口dist/index.js,具体的功能实现就是通过这些输入字段获取到华为云上面的CCE集群的登录信息。具体见代码仓库

上面的示例,我们可以发现,action正真的功能实现在main: 'dist/index.js'这一步,这里定义了整个功能的入口,在正真的代码实现里面主要包含:

具体华为云CCE服务的API可以参见华为云的相关文档

5. 集成action使用华为云CCE集群资源

github action使用华为云CCE资源主要就是在触发执行github action的时候,将预先定义好的测试流程定义为CCE集群中的应用,再将应用部署到CCE集群中最后返回测试结果。如下图所示: image

准备工作:

  1. 具有华为云CCE服务权限的账号,创建并保存该账户下的Access KeySecret Acess Key

  2. 创建一个CCE集群

  3. 准备如下信息:

    • Access Key ID
    • Secret Access Key
    • Region, 华为云账号Region
    • CCE Cluster ID, CCE集群的ID
    • Docker Image,要执行信用的Docker镜
  4. Access KeySecret Acess Key设置到要集成的项目的github secrets中,设置字段为ACCESS_KEY_IDSECRET_ACCESS_KEY

集成到项目中:

  1. 准备环境变量

    env:
     ACCESS_KEY_ID: ${{ secrets.ACCESS_KEY_ID }}
     SECRET_ACCESS_KEY: ${{ secrets.SECRET_ACCESS_KEY }}
     REGION: "ap-southeast-3"
     PROJECT_ID: "c847fb717563484fa95d18a75ae7831c"
     CLUSTER_ID: "f7b6239b-9391-11eb-95a2-0255ac1001da"
     DEPLOYMENT_IMAGE: "ghcr.io/liusheng/alluxio-aarch64"
    1. 切换到项目源码
    - name: Checkout
      uses: actions/checkout@v2
  2. (可选)构建docker镜像

    - name: Build Docker images
     run: |
       docker build -f my-project/.github/docker/Dockerfile -t ${{ DEPLOYMENT_IMAGE }}:${{ github.sha }}
  3. (可选)登录华为云SWR服务

    - uses: huaweicloud/swr-login@v1
     with:
       region: '<region id>' # example: ap-southeast-3
       access-key-id: '<access key id>'
       access-key-secret: '<access key secret>'

    如果需要上传镜像到HuaweiSWR服务,则需要账号具有SWR服务的权限,并且预先创建一个组织用于管理容器镜像。

  4. (可选)push docker镜像到镜像仓库

    - name: Build Docker images
     run: |
       docker push ${{ DEPLOYMENT_IMAGE }}:${{ github.sha }} # push 到github的镜像仓库
       docker tag ${{ DEPLOYMENT_IMAGE }}:${{ github.sha }} swr.${{ region }}.myhuaweicloud.com/openlab/my-image
       docker push swr.${{ region }}.myhuaweicloud.com/openlab/my-image

    上面的step中可以上传docker镜像到github 的镜像仓库ghcr.io,并且要设置镜像公共可访问,也就是不用登录也可以pull,或者上传到华为云的SWR服务中。

  5. 安装kubectl

    - name: "Install kubectl"
    uses: azure/setup-kubectl@v1
  6. 获取CCE集群的登录信息

    - name: Get Huawei Cloud CCE cluster credentials
     uses: huaweicloud/cce-cluster-credentials@v1
     with:
       access-key-id: "${{ secrets.ACCESS_KEY_ID }}"
       access-key-secret: "${{ secrets.ACCESS_KEY_SECRET }}"
       cluster-id: "${{ env.CLUSTER_ID }}"
       project-id: "${{ env.PROJECT_ID }}"
       region: "${{ env.REGION }}"
  7. 配置CCE集群登录的context

    - name: Set CCE cluster context(external as default)
     run: |-
       kubectl config use-context external
  8. 在CCE集群上执行Docker镜像

    - name: Run with specific image
     run: |-
       kubectl config use-context external
       kubectl run --rm -i --privileged=true --image "${{ env.ALLUXIO_IMG }}" action-test

    验证: 下面是我在我fork的项目上使用github action + 华为云CCE集群上测试的结果 image