用 Github Actions 在 K8S 中运行 CI 测试
前面我们介绍了如何使用 KinD 集群来加速 CI/CD 流水线,本文我们将来介绍如何通过 Github Actions 与 K3S 运行你的 CI 集成测试。
Github Actions 如何工作
如果你之前使用过 Travis CI 之类的工具,应该对 Actions 很熟悉了:它们为你提供了一个可以测试你应用程序的环境 - 一般是以服务器的形式,你的代码在一个目录中被 checkout 出来,当代码推送到你的 Github 仓库上,一个环境会被启动,然后检出代码,在环境上执行指定的一些任务,如果有任何一个任务失败了,则你的 CI 任务就会失败。当然这不仅仅可以用于自动化测试,我们也可以用于编译应用程序,然后将相关制品上传到 S3 等服务上,或者向你的 QA 团队发送一封电子邮件,让他们知道哪些测试通过或失败了。
我们可以把 Actions 想象成 Github 启动的一个服务器,然后在里面检出你的代码,并在上面执行你想要执行的任务。
如果你的开发环境运行在 Kubernetes 集群上,或者你正计划在 Kubernetes 中运行你的 CI 环境,那么每当你把代码推送到 Github 上,我们就有一台机器可以操作,是不是很开心~~~,我们可以简单地在里面设置一个 Kubernetes 集群,然后将应用程序跑在上面。你可能觉得在 CI 环境中安装 Kubernetes 集群不是很好的一个方案:
- 在服务器上安装 Kubernetes 并不是一个简单的操作
- 相关的一些组件需要互相通信(kubectl、apiserver、etcd、kubelet 等),所以可能需要相当长的时间才能让集群运行起来
- 一般情况下 CI 环境最好在几秒钟内就能启动,所以在 CI 环境中启动一个 Kubernetes 集群似乎不是很合理
比较幸运的是,我们有一些方案是可以来解决上面的这些问题的,前面我们是使用的 KinD,今天我们介绍另外一个轻量级方案:k3s,这是一个面向物联网和边缘计算的轻量级 Kubernetes 发行版,集群在几秒钟内就能启动和运行,只需要简单的几秒命令即可:
$ curl -sfL https://get.k3s.io | sh -
# wait ~30s
$ k3s kubectl get node
有了 k3s,将 Kubernetes 引入到我们的 Actions 中就非常简单了。
K8S Github Action
首先,在我们的仓库中的 .github/workflows
文件夹下创建 action 文件,比如 test.yaml
,然后在工作流中添加如下所示的步骤:
name: K8S Github Action
on: [push]
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v2
- name: install k8s
run: |
curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE=777 sh -
cat /etc/rancher/k3s/k3s.yaml
mkdir -p ~/.kube
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
- name: example tests
run: |
# Whatever command you want to run
其中的关键就是上面执行的命令:
curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE=777 sh -
cat /etc/rancher/k3s/k3s.yaml
mkdir -p ~/.kube
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
首先下载 k3s,安装后将其配置复制到常用的 kubeconfig 路径中,这样做是为了让 kubectl 能够与集群进行交互,否则你必须使用 k3s 提供的别名 k3s kubectl
(这样就需要运行 k3s kubectl get po
等命令)。
可以前往示例仓库 https://github.com/cnych/k8s-github-action 查看相关信息,在 Actions 下面我们可以查看到构建的任务,在任务中可以很清楚地看到 Kubernetes 的启动和运行。
我们可以看到整个集群的安装任务只花费了 13s 的时间,对于 CI 环境中去安装运行 Kubernetes,这个时间是完全可以接受的。
原文链接:https://odino.org/running-ci-tests-in-kubernetes-through-github-actions/
K8S进阶训练营,点击下方图片了解详情
- 【Python环境】监督学习之KNN算法
- 【数据科学】什么是数据科学家与数据科学
- Android基础总结(12)——XML和JSON解析
- 【Python环境】scikit-learn的线性回归模型
- Android基础总结(8)——服务
- 你需要每天写代码吗?
- Java基础——多线程
- No.010 Regular Expression Matching
- JavaScript依赖注入的实现思路
- No.011 Container With Most Water
- No.009 Palindrome Number
- Windows DNS API RCE漏洞分析及PoC构造
- 爬虫采集去重优化浅谈
- Android基础总结(10)——手机多媒体的运用:通知、短信、相机、视频播放
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- VCS与Verdi的联合仿真
- ADC数据接入到AXI-Steam Interface
- Java面试必问:ThreadLocal终极篇 淦!
- BERT文本摘要
- 【NPM库】- 0x01
- 基于分类任务的信号(EEG)处理--代码分步解析
- 文件操作——举例
- flink之udf执行流程分析篇
- VBA调用外部对象02:FileSystemObject——操作文本文件
- 打卡群刷题总结0723——组合
- VBA根据单元格底色统计个数
- 打卡群刷题总结0724——子集
- 打卡群刷题总结0726——删除排序数组中的重复项 II
- VBA调用外部对象02:FileSystemObject——OpenTextFile参数
- 使用HTTP 404-File Not Found的C2