写点什么

如何尝试用 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:535791
用户头像
赵钰莹 InfoQ 主编

发布了 882 篇内容, 共 637.7 次阅读, 收获喜欢 2678 次。

关注

评论

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

如何防止 Elasticsearch 服务 OOM ?

极限实验室

ES console Gateway easysearch

春招开始,面试也多起来了

王磊

Java 面试

Selenium帮助你轻松实现浏览器多窗口操作

霍格沃兹测试开发学社

Dapp/DeFi/Swap交易所代币质押项目挖矿系统开发详情

l8l259l3365

JavaScript之structuredClone现代深拷贝

南城FE

JavaScript 前端 深拷贝

华为云命令行工具KooCLI—高效云端管理的秘诀

华为云PaaS服务小智

云计算 API 华为云

请认真对待你的简历

老张

面试 简历优化 简历

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

福大大架构师每日一题

福大大架构师每日一题

2024中国云计算大分野:重回当年,还是走向未来?

脑极体

云计算

深入了解手机App开发:从构思到上线的全过程

天津汇柏科技有限公司

数字化转型 低代码开发 定制软件开发 软件开发定制

为什么说 TiDB 在线扩容对业务几乎没有影响

PingCAP

数据库 TiDB TiKV

LED户外广告屏寿命的关键因素及解决方案

Dylan

广告 维护 系统维护 LED显示屏 户外LED显示屏

RDS for MySQL Serverless公测上线:弹性伸缩,最高可降成本超80%

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 华为云Serverless

【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit

HarmonyOS SDK

HarmonyOS

独立站的SEO优化:提升网站排名的秘诀

技术冰糖葫芦

API 接口

读TiDB源码聊设计:引子

泊浮目

分布式数据库 TiDB HTAP

QCN9274/Super WiFi 7: Explore the unlimited potential of next-generation networks

wallysSK

详解Python中sys模块的功能与应用

华为云开发者联盟

Python 开发 华为云 函数 华为云开发者联盟

国内主流AI大模型都是Python 开发的,国外AI大模型是什么语言开发的?为什么要用python?

算法的秘密

掰扯掰扯需求分析:从工程到生活中的4个case

泊浮目

系统设计 需求分析

Python黑科技揭秘:多窗口操作不再是难题,这些技巧让你轻松搞定

测吧(北京)科技有限公司

测试

Programming Abstractions in C阅读笔记:p312-p326

codists

算法与数据结构

小红书笔记详情API:为开发者开启的新世界大门

技术冰糖葫芦

API 接口 API】

内含资料下载丨黄东旭:2024 现代应用开发关键趋势——降低成本、简化架构

PingCAP

数据库 TiDB AI技术 应用开发

AmzTrends x TiDB Serverless:通过云原生改造实现全局成本降低 80%

PingCAP

数据库 数据分析 云原生 TiDB

Uber/Google Golang编码标准深度分析

俞凡

golang 最佳实践

Amazon Q :企业级的对话智能导航

亚马逊云科技 (Amazon Web Services)

Python黑科技揭秘:多窗口操作不再是难题,这些技巧让你轻松搞定

测试人

Python 软件测试 自动化测试 测试开发

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