写点什么

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

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

关注

评论

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

iOS MachineLearning 系列(19)—— 分析文本中的问题答案

珲少

模板一作业

家有两宝

#架构训练营

C语言编程—数组

梦笔生花

使用Go语言实现门面模式:简化复杂子系统的访问

Jack

CMake构建指南:如何提高C/C++项目的可维护性

小万哥

Linux 程序员 C/C++ 后端开发 cmake

非常全面的 SpringBoot 保姆级笔记,面面俱到,太牛了

做梦都在改BUG

Java spring 微服务 Spring Boot 框架

低代码的“钱景”——专业的事交给专业的人来做

引迈信息

低代码 JNPF

Java面试集锦

源字节1号

微信小程序 开源 软件开发 后端开发

软件测试/测试开发丨Web自动化 PageObject 设计模式

测试人

程序员 软件测试 自动化测试 测试开发 Web自动化测试

Nautilus Chain上线主网,为DeFi和流支付的未来构建基础

股市老人

文心一言 VS 讯飞星火 VS chatgpt (23)-- 算法导论4.2 5题

福大大架构师每日一题

福大大 文心一言 讯飞星火

深度学习进阶篇-预训练模型[4]:RoBERTa、SpanBERT、KBERT、ALBERT、ELECTRA算法原理模型结构应用场景区别等详解

汀丶人工智能

自然语言处理 深度学习 预训练模型 Transformer BERT

Parallels Desktop如何退出账号?PD18虚拟机退出账号方法

Rose

pd18虚拟机 PD如何退出账号 Parallels Desktop下载 Parallels破解版 Mac虚拟机下载

DR5白金版 for mac(PS一键磨皮插件Delicious Retouch)支持ps2022 v5.0汉化版

Rose

DR5白金版 PS一键磨皮插件 dr5插件 汉化版PS插件 dr5插件教程

爆肝了!阿里最新版的这份Spring Security源码手册,狂揽GitHub榜首

做梦都在改BUG

Java spring spring security Spring Security OAuth

Nautilus Chain上线主网,为DeFi和流支付的未来构建基础

鳄鱼视界

2023华为伙伴大会:ISDP发布伙伴体验中心,邀伙伴探索数智化未来

科技怪授

华为ISDP:从ChatGPT说起,企业作业数字化转型需要怎样的平台工具?

科技怪授

AE模板:短信消息聊天对话气泡动画Smart Text Message

Rose

AE模板下载 Smart Text Message 对话框气泡生生成器插件

【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache抽象详解的核心原理探索

洛神灬殇

spring 缓存 cache 缓存管理

Maven Cannot resolve plugin org.apache.maven.plugins

Andy

2023-05-27:给你一个只包含小写英文字母的字符串 s 。 每一次 操作 ,你可以选择 s 中两个 相邻 的字符,并将它们交换。 请你返回将 s 变成回文串的 最少操作次数 。 注意 ,输入数据

福大大架构师每日一题

Go 算法 rust 福大大

photoshop神经滤镜是什么,神经滤镜功能揭秘~

Rose

photoshop神经滤镜 Neural Filters插件 ps滤镜下载 PS2023破解

基于Redis讲解,学懂缓存雪崩,缓存击穿,缓存穿透

做梦都在改BUG

Java redis 缓存穿透 缓存击穿 缓存雪崩

Python潮流周刊#3:PyPI 的安全问题

Python猫

Python 编程 rust 安全

高并发封神之作的《亿级流量高并发》惨遭GitHub免费开源

小小怪下士

Java 程序员 高并发

Nautilus Chain上线主网,为DeFi和流支付的未来构建基础

西柚子

Office 2021和 Office 365 有什么不同之处?office 2021 和 365 区别是什么

Rose

Office 365 Office 2021 office下载

国外顶级架构师编写2580页DDD领域驱动设计笔记,看到内容后破防了

做梦都在改BUG

Java 架构 领域驱动设计 DDD

不愧是阿里巴巴内网的“高并发系统设计”学习笔记,全程不讲一句废话!

采菊东篱下

Java 高并发

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