【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

如何尝试用 GitHub Actions 项目编写容器应用?

  • 2019-01-23
  • 本文字数:2465 字

    阅读完需:约 8 分钟

如何尝试用GitHub Actions项目编写容器应用?

早前,GitHub 发布 GitHub Actions 项目,开发者可通过 GitHub Actions 存储和搜索代码,部分代码可直接运行。本文尝试使用 AWS Lambda 和 API Gateway 作为基本 API,编写应用程序原型并用名为 gourmet 的容器运行函数,虽然这可能不会让代码易于管理,但至少不需要写 API 或者 Web 应用程序。


正如 Lambda 函数在 AWS 中运行一样,Github Actions 是一种强大的管理方式,可直接扩展应用。使用 AWS Lambda,可将代码挂接到几乎任何事件上,比如 EC2 创建、终止、DNS 记录更改等,不需要运行服务器,只需加载代码就能正常工作。


本文作者针对此做了一些尝试,但需要 CI 服务器。为了拥有可测试的 kubernetes 集群,作者自建私有存储库,目前因内部有些混乱暂不准备开源。


无论如何,以下是项目文件夹:


├── .github│   ├── actions│   │   ├── deploy│   │   │   ├── deploy│   │   │   └── Dockerfile│   │   └── dryrun│   │       ├── Dockerfile│   │       └── dryrun│   └── main.workflow└── kubernetes    ├── digitalocean.yaml    ├── external-dns.yaml    ├── micro.yaml    ├── namespaces.yaml    ├── nginx.yaml    └── openvpn.yaml
复制代码


kubernetes 目录包含集群安装的所有东西。对于此存储库的每次新推送,需要检查是否可用命令 kubectl apply -f./kubernetes --dryrun 将其应用于 kubernetes 集群,并且当合并 PR 时,应用更改。


因此,作者在.github/main.workflow 中创办了工作流:


## Workflow defines what we want to call a set of actions.## For every new push check if the changes can be applied to kubernetes ## using the action called: kubectl dryrunworkflow "after a push check if they apply to kubernetes" {  on = "push"  resolves = ["kubectl dryrun"]}## When a PR is merged trigger the action: kubectl deploy. To apply the new code to master.workflow "on merge to master deploy on kubernetes" {  on = "pull_request"  resolves = ["kubectl deploy"]}## This is the action that checks if the push can be applied to kubernetesaction "kubectl dryrun" {  uses = "./.github/actions/dryrun"  secrets = ["KUBECONFIG"]}## This is the action that applies the change to kubernetesaction "kubectl deploy" {  uses = "./.github/actions/deploy"  secrets = ["KUBECONFIG"]}
复制代码


secrets 是一组环境变量,可从外部设置值。如果帐户启用 GitHub Action,则每个存储库的 Setting 都会有一个名为 secrets 的新标签。


本例,作者将 KUBECONFIG 设置为 kubeconfig 文件的 base64,允许 GitHub Action 授权给 Kubernetes 集群。


两个操作类似,第一个操作位于 .github/actions/dryrun 目录:


├── .github    ├── actions        └── dryrun            ├── Dockerfile            └── dryrun

复制代码


包含一个 Dockerfile


FROM alpine:latest
## The action name displayed by GitHubLABEL "com.github.actions.name"="kubectl dryrun"## The description for the actionLABEL "com.github.actions.description"="Check the kubernetes change to apply."## https://developer.github.com/actions/creating-github-actions/creating-a-docker-container/#supported-feather-iconsLABEL "com.github.actions.icon"="check"## The color of the action iconLABEL "com.github.actions.color"="blue"
RUN apk add --no-cache \ bash \ ca-certificates \ curl \ git \ jq
RUN curl -L -o /usr/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/linux/amd64/kubectl && \ chmod +x /usr/bin/kubectl && \ kubectl version --client
COPY dryrun /usr/bin/dryrunCMD ["dryrun"]

复制代码


如上所示,只需要一个 Dockerfile,工作原理和 docker 类似。Cmd dryrun 在这里是复制的 bash 脚本:


#!/bin/bash
main(){ echo ">>>> Action started" # Decode the secret passed by the action and paste the config in a file. echo $KUBECONFIG | base64 -d > ./kubeconfig.yaml echo ">>>> kubeconfig created" # Check if the kubernetes directory has change diff=$(git diff --exit-code HEAD~1 HEAD ./kubernetes) if [ $? -eq 1 ]; then echo ">>>> Detected a change inside the kubernetes directory" # Apply the changes with --dryrun just to validate them kubectl apply --kubeconfig ./kubeconfig.yaml --dry-run -f ./kubernetes else echo ">>>> No changed detected inside the ./kubernetes folder. Nothing to do." fi}
main "$@"
复制代码


第二个操作和此几乎一样,Dockerfile 是相同的,但 CMD 看起来是这样的:


#!/bin/bash
main(){ # Decode the secret passed by the action and paste the config in a file. echo $KUBECONFIG | base64 -d > ./kubeconfig.yaml # Check if it is an event generated by the PR is a merge merged=$(jq --raw-output .pull_request.merged "$GITHUB_EVENT_PATH") # Retrieve the base branch for the PR because I would like to apply only PR merged to master baseRef=$(jq --raw-output .pull_request.base.ref "$GITHUB_EVENT_PATH")
if [[ "$merged" == "true" ]] && [[ "$baseRef" == "master" ]]; then echo ">>>> PR merged into master. Shipping to k8s!" kubectl apply --kubeconfig ./kubeconfig.yaml -f ./kubernetes else echo ">>>> Nothing to do here!" fi}
main "$@"
复制代码


除此之外,工作流文件还有一个生成器,似乎效果不错。secrets 允许开箱即用,并与第三方服务集成,也可用 bash 做任何想做的事情!


参考链接:https://gianarb.it/blog/kubernetes-github-action


2019-01-23 17:535720
用户头像
赵钰莹 InfoQ 主编

发布了 874 篇内容, 共 604.5 次阅读, 收获喜欢 2671 次。

关注

评论

发布
暂无评论
发现更多内容

文心一言 VS 讯飞星火 VS chatgpt (118)-- 算法导论10.3 3题

福大大架构师每日一题

福大大架构师每日一题

用Python实现微信多开,1行代码免费用

程序员晚枫

Python 微信

Kubernetes多租户实践

俞凡

架构 Kubernetes 云原生

Studio One 6 for mac(音乐制作工具) v6.2.0完整激活版

mac

Studio One 音乐制作软件 苹果mac Windows软件

MATLAB R2023b for Mac中文激活版(数值计算和科学编程软件)

iMac小白

MATLAB破解版 MATLAB R2023b MATLAB R2023b下载 MATLAB R2023b破解版

2024西安国际风机展|2024中国工业通风设备展会

秋硕展览

2024年中国(南京)国际生活用纸及造纸设备展会

秋硕展览

Linux的挂载介绍

二哈侠

如何发现更多比特币大户钱包地址?以bitget 钱包为例

鳄鱼视界

BOE(京东方)首个智慧医养示范社区启航 树立医养融合新标杆

科技热闻

Python 函数:定义、调用、参数、递归和 Lambda 函数详解

小万哥

Python 程序员 软件 后端 开发

不愧是疑问解决神器(二)!你强任你强👍👍👍

控心つcrazy

JavaScript

草图大师SketchUp Pro 2023最新版激活安装教程

iMac小白

SketchUp Pro 2023下载 SketchUp Pro 2023破解 SketchUp Pro 2023 mac

Ableton Live 11 Suite for mac(音乐制作软件) v11.3.11永久激活版

mac

Ableton Live 11 Suite 音乐制作软件 苹果mac Windows软件

Zebec Protocol 薪酬支付工具 WageLink 上线,掀新一轮薪酬支付浪潮

大瞿科技

Minitab Express for Mac(数据分析统计软件)v1.5.0激活版

iMac小白

Minitab Express for Mac Minitab Express下载 Minitab Express破解版

寓言灼真知——比小说更好看的理财故事书

少油少糖八分饱

赚钱 理财 日积月累 致富 寓言

【运维】mysql与mongo的自动备份脚本

百度搜索:蓝易云

MySQL mongodb 云计算 Linux 运维

Nik Collection 6 for Mac(PS滤镜插件套装) v6.1.0中文激活版

iMac小白

PS滤镜Nik Collection Nik Collection下载 Nik Collection插件

Aescripts StyleX for Mac激活版(AI高级视频风格化工具)

iMac小白

Aescripts StyleX下载 Aescripts StyleX插件

如何发现更多比特币大户钱包地址?以bitget 钱包为例

石头财经

Bitget Wallet教程:快速寻找比特币和以太坊大户钱包地址的技巧

BlockChain先知

Animate 2024 for mac(an2024) v24.0永久激活版

mac

an 苹果mac Windows软件 Animate 2024 动画制作软件

如何发现更多比特币大户钱包地址?以bitget 钱包为例

威廉META

如何尝试用GitHub Actions项目编写容器应用?_语言 & 开发_赵钰莹_InfoQ精选文章