写点什么

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

发布了 822 篇内容, 共 530.4 次阅读, 收获喜欢 2606 次。

关注

评论

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

区块链蕴含的变革力

CECBC

极光开发者周刊【No.0827】

极光JIGUANG

百度地图开发-绘制点线提示框 07

Andy阿辉

android Android 小菜鸟 Android端 8月日更

neo4j 基本概念与入门实例

escray

学习 neo4j 8月日更

区块链溯源:重塑咖啡产业链

CECBC

24位出品人已确认,开放原子全球开发者峰会(OADC)分论坛速览(更新中)

开放原子开源基金会

fil矿机怎么买?fil矿机厂商最强哪家?

分布式存储 IPFS Filecoin filecoin挖矿 filecoin矿机

【得物技术】得物App Android Crash治理演进

得物技术

发展 日志 进程 Crash 崩溃

VMware中安装的Ubuntu启动时出现A start job is running for raise network interfaces...

Mike

价值连城 图灵奖得主Yann LeCun 杨立昆的采访 给AI从业者的建议 John 易筋 ARTS 打卡 Week 61

John(易筋)

ARTS 打卡计划

Python代码阅读(第19篇):合并多个字典

Felix

Python 编程 Code Programing 阅读代码

GaussDB(for Redis)与原生Redis的性能对比

华为云数据库小助手

redis GaussDB GaussDB ( for Redis ) 华为云数据库

笔记分享 -- 弱网下的极限实时视频通信

声网

音视频 端到端 极限视频通信 弱网

强强联合!北鲲云与宝德就打造混合云HPC解决方案达成战略合作

北鲲云

阿里第七次更新的Java面试突击宝典,已累计拿到759份Offer

Java 程序员 架构 面试 后端

术,路,心:陈天桥的大脑行旅

脑极体

解析区块链技术如何帮助企业加速数字转型?

CECBC

审计挖掘之CNVD通用漏洞

网络安全学海

黑客 网络安全 信息安全 WEB安全 漏洞挖掘

ARM工控主板比X86工控主板好吗?

双赞工控

从350ms到80ms,揭秘阿里工程师 iOS 短视频优化方案

阿里云视频云

ios 短视频 视频 视频处理 视频流

好身体是吃出来的

石云升

健康 8月日更

我为什么坚持六点起床

月哥

Docker 系列 _ 01_ 一念缘起

编程三昧

Docker 8月日更

网络攻防学习笔记 Day118

穿过生命散发芬芳

网络安全 8月日更

“腾讯待办”小程序正式发布!初次见面,请多指教。

【虚拟机专栏】熟悉的新朋友 - 链上JVM

趣链科技

区块链

03. AI就是与人类思考方式相似的计算机程序:从仿生学看人工智能的定义

数据与智能

人工智能

JavaScript 中 Math.random() 生成随机数据

devpoint

JavaScript 8月日更 math

学术顶会再突破!计算平台MaxCompute论文入选国际顶会VLDB 2021

阿里云大数据AI技术

工业互联网如何加速释放赋能价值?工业智能是关键

浪潮云

云计算

命中率高达87%,GitHub收费下载超过28W次的Java面试题库外泄

Java架构师迁哥

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