Open liusheng opened 3 years ago
作者: Liusheng
本文介绍Github action基本概念流程以及和华为云CCE集群资源集成,借此实现github开源项目利用华为云ARM资源实现ARM CI。
在Github 的代码仓库中自动化、自定义和执行软件开发工作流程以完成软件开发周期中特定的任务。 可以发现、创建和共享操作以执行任何作业(包括 CI/CD),并将操作合并到完全自定义的工作流程中。
Github action整个流程包含以下几个基本概念:
push
pull_request
issue
label
关于github action更多介绍可以查看其文档。
下图示意了整个workflow流程:
在项目repo的根目录下面添加.github/workflows/目录并新建一个yaml文件用于定义workflow,下面是一个简单的示例:
.github/workflows/
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:
actions/checkout@v2
actions/setup-node@v1
bats
bats -v
我们可以在github marketplace发现很多已有的 action。例如,一些有趣有用的github action:
Github action曾经有计划支持ARM64平台,但是后续修改了其路标,短期内不计划支持ARM64平台,详见这里。在github社区也有很多人咨询github action能否支持ARM平台,社区主要建议使用self hosted runner的方式实现,而self hosted runner是github action提供的一种机制,允许接入外部的机器作为一个runner,对于公开仓库来说存在安全风险,具体详见这里。
self hosted 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集群用于前期的测试:
前面提到了action是整个流程里面可服用的最小代码段,github 支持创建Docker容器 action和JavaScript 以及二者结合3中类型。创建action也有两种形式:
Docker
JavaScript
.github
.github/actions/action-xxx
这里我们以下面要介绍到的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等字段。
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集群的登录信息。具体见代码仓库。
dist/index.js
上面的示例,我们可以发现,action正真的功能实现在main: 'dist/index.js'这一步,这里定义了整个功能的入口,在正真的代码实现里面主要包含:
main: 'dist/index.js'
具体华为云CCE服务的API可以参见华为云的相关文档。
github action使用华为云CCE资源主要就是在触发执行github action的时候,将预先定义好的测试流程定义为CCE集群中的应用,再将应用部署到CCE集群中最后返回测试结果。如下图所示:
准备工作:
具有华为云CCE服务权限的账号,创建并保存该账户下的Access Key和Secret Acess Key
Access Key
Secret Acess Key
创建一个CCE集群
准备如下信息:
将Access Key和Secret Acess Key设置到要集成的项目的github secrets中,设置字段为ACCESS_KEY_ID和SECRET_ACCESS_KEY
github secrets
ACCESS_KEY_ID
SECRET_ACCESS_KEY
集成到项目中:
准备环境变量
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"
- name: Checkout uses: actions/checkout@v2
(可选)构建docker镜像
- name: Build Docker images run: | docker build -f my-project/.github/docker/Dockerfile -t ${{ DEPLOYMENT_IMAGE }}:${{ github.sha }}
(可选)登录华为云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服务的权限,并且预先创建一个组织用于管理容器镜像。
(可选)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服务中。
ghcr.io
安装kubectl
- name: "Install kubectl" uses: azure/setup-kubectl@v1
获取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 }}"
配置CCE集群登录的context
- name: Set CCE cluster context(external as default) run: |- kubectl config use-context external
在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集群上测试的结果
作者: Liusheng
本文介绍Github action基本概念流程以及和华为云CCE集群资源集成,借此实现github开源项目利用华为云ARM资源实现ARM CI。
0. Github action简介
在Github 的代码仓库中自动化、自定义和执行软件开发工作流程以完成软件开发周期中特定的任务。 可以发现、创建和共享操作以执行任何作业(包括 CI/CD),并将操作合并到完全自定义的工作流程中。
1. 基本概念
Github action整个流程包含以下几个基本概念:
push
、pull_request
、issue
、label
等操作行为,具体见这里。关于github action更多介绍可以查看其文档。
下图示意了整个workflow流程:
2. 使用示例
在项目repo的根目录下面添加
.github/workflows/
目录并新建一个yaml文件用于定义workflow,下面是一个简单的示例:上面的是是一个workflow的定义,整个流程会在
push
到repo的提交这个行为发生的时候被触发。包含一个job,job会在Ubuntu最新的镜像的操作系统上执行,该job包含4个steps:actions/checkout@v2
切换到目标源码上actions/setup-node@v1
安装nodejsbats
这个库bats -v
命我们可以在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集群用于前期的测试:
4. 创建自己的action
前面提到了action是整个流程里面可服用的最小代码段,github 支持创建
Docker
容器 action和JavaScript
以及二者结合3中类型。创建action也有两种形式:.github
目录,比如.github/actions/action-xxx
。这里我们以下面要介绍到的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的元数据定义:
上面定义了该action实现的输入数据,以及入口
dist/index.js
,具体的功能实现就是通过这些输入字段获取到华为云上面的CCE集群的登录信息。具体见代码仓库。上面的示例,我们可以发现,action正真的功能实现在
main: 'dist/index.js'
这一步,这里定义了整个功能的入口,在正真的代码实现里面主要包含:具体华为云CCE服务的API可以参见华为云的相关文档。
5. 集成action使用华为云CCE集群资源
github action使用华为云CCE资源主要就是在触发执行github action的时候,将预先定义好的测试流程定义为CCE集群中的应用,再将应用部署到CCE集群中最后返回测试结果。如下图所示:
准备工作:
具有华为云CCE服务权限的账号,创建并保存该账户下的
Access Key
和Secret Acess Key
创建一个CCE集群
准备如下信息:
将
Access Key
和Secret Acess Key
设置到要集成的项目的github secrets
中,设置字段为ACCESS_KEY_ID
和SECRET_ACCESS_KEY
集成到项目中:
准备环境变量
(可选)构建docker镜像
(可选)登录华为云SWR服务
如果需要上传镜像到HuaweiSWR服务,则需要账号具有SWR服务的权限,并且预先创建一个组织用于管理容器镜像。
(可选)push docker镜像到镜像仓库
上面的step中可以上传docker镜像到github 的镜像仓库
ghcr.io
,并且要设置镜像公共可访问,也就是不用登录也可以pull,或者上传到华为云的SWR服务中。安装kubectl
获取CCE集群的登录信息
配置CCE集群登录的context
在CCE集群上执行Docker镜像
验证: 下面是我在我fork的项目上使用github action + 华为云CCE集群上测试的结果