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

栏目: 编程工具 · 发布时间: 5年前

内容简介:早前,GitHub 发布 GitHub Actions 项目,开发者可通过 GitHub Actions 存储和搜索代码,部分代码可直接运行。本文尝试使用 AWS Lambda 和 API Gateway 作为基本 API,编写应用程序原型并用名为 gourmet 的容器运行函数,虽然这可能不会让代码易于管理,但至少不需要写 API 或者 Web 应用程序。正如 Lambda 函数在 AWS 中运行一样,Github Actions 是一种强大的管理方式,可直接扩展应用。使用 AWS Lambda,可将代码

早前,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 wanttocallasetofactions.
##Foreverynewpushcheckifthe changes can be appliedtokubernetes ##usingthe actioncalled: kubectl dryrun
workflow "after a push check if they apply to kubernetes" {
on= "push"
resolves = ["kubectl dryrun"]
}
##Whena PRismergedtriggerthe action: kubectl deploy.Toapply thenewcodetomaster.
workflow "on merge to master deploy on kubernetes" {
on= "pull_request"
resolves = ["kubectl deploy"]
}
## Thisisthe action that checksifthe push can be appliedtokubernetes
action "kubectl dryrun" {
uses = "./.github/actions/dryrun"
secrets = ["KUBECONFIG"]
}
## Thisisthe action that applies the changetokubernetes
action "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

复制代码

FROMalpine:latest

## The action name displayed by GitHub
LABEL"com.github.actions.name"="kubectl dryrun"
## The description for the action
LABEL"com.github.actions.description"="Check the kubernetes change to apply."
## https://developer.github.com/actions/creating-github-actions/creating-a-docker-container/#supported-feather-icons
LABEL"com.github.actions.icon"="check"
## The color of the action icon
LABEL"com.github.actions.color"="blue"

RUNapk add --no-cache \
bash \
ca-certificates \
curl \
git \
jq

RUNcurl -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

COPYdryrun /usr/bin/dryrun
CMD["dryrun"]

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

复制代码

#!/bin/bash

main(){
echo">>>> Action started"
# Decode thesecretpassed by the actionandpaste theconfigina file.
echo$KUBECONFIG| base64 -d > ./kubeconfig.yaml
echo">>>> kubeconfig created"
# Checkifthe 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 justtovalidate 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 thesecretpassed by the actionandpaste theconfigina file.
echo$KUBECONFIG| base64 -d > ./kubeconfig.yaml
# Checkifit is an event generated by the PR is a merge
merged=$(jq --raw-output .pull_request.merged"$GITHUB_EVENT_PATH")
# Retrieve the base branchforthe PR because I would liketoapply only PR mergedtomaster
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


以上所述就是小编给大家介绍的《如何尝试用 GitHub Actions 项目编写容器应用?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Clean Architecture

Clean Architecture

Robert C. Martin / Prentice Hall / 2017-9-20 / USD 34.99

Practical Software Architecture Solutions from the Legendary Robert C. Martin (“Uncle Bob”) By applying universal rules of software architecture, you can dramatically improve developer producti......一起来看看 《Clean Architecture》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码