前言

GItHub Actions是一个持续集成和持续交付的平台,能够让你自动化你的编译、测试和部署流程。GitHub 提供 Linux、Windows 和 macOS 虚拟机来运行您的工作流程,或者您可以在自己的数据中心或云基础架构中托管自己的自托管运行器。它是 GitHub 于2018年10月推出的持续集成服务。

基本概念

  • workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
  • job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
  • step(步骤):每个 job 由多个 step 构成,一步步完成。
  • action (动作):每个 step 可以依次执行一个或多个命令(action)

### 本文同步发表于知乎 https://zhuanlan.zhihu.com/p/584810055

使用

下面用例子来介绍一个workflow

首先定义一个workflow 的 name

# This is a CICD workflow for demo
name: cicd-demo

然后定义一下事件触发机制

# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the below branch and specific path
on:
push:
branches:
- main
- develop
paths:
- 'demo-app/**'
pull_request:
branches:
- main
paths:
- 'demo-app/**'

然后定义一个 Build Job 以及 Outputs 供后续步骤使用

jobs:
# The "build" job
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
outputs:
image_tag: ${{ steps.build_app.outputs.image_tag }}
actor: ${{ steps.build_app.outputs.actor }}
# Steps represent a sequence of tasks that will be executed as part of the job
steps:

来看Steps

Checkout 代码

    steps:
# Checks-out your repository under $GITHUB_WORKSPACE
- name: checkout repo
uses: actions/checkout@v3

Setup go env

    - name: Setup go
uses: actions/setup-go@v3
with:
go-version-file: 'demo-app/go.mod'
check-latest: true
cache: true
cache-dependency-path: demo-app/go.sum

Login google container registry

    - name: Login to GCR
uses: docker/login-action@v2
with:
registry: asia.gcr.io
username: _json_key
password: ${{ secrets.GCR_JSON_KEY }}

Build Image and Push to registry

make 命令很简单,执行的就是docker build 和 push

    - name: build application
id: build_app
run: |-
VER=`cat demo-app/Makefile| grep TAG= | awk -F "=" 'NR==1{print $2}'`
GIT_COMMIT=$(git log | grep commit | awk 'NR==1{print $2}' | cut -c1-7)
cd helm-go-client
make push TAG2=-$GIT_COMMIT
# set output
echo "::set-output name=image_tag::$(echo "$VER-$GIT_COMMIT")"
echo "::set-output name=actor::$(echo "$GITHUB_ACTOR")"

Makefile 供参考

export TAG=1.0.0
export DOCKERHUB=wadexu007/demo-app hello:
echo "This is Go client call helm sdk" local: hello
echo "run locally"
go run main.go build: hello
echo "building docker container"
docker build -t ${DOCKERHUB}:${TAG} . push: build
echo "pushing to my docker hub"
docker push ${DOCKERHUB}:${TAG}

Makefile

### 本文同步发表于知乎 https://zhuanlan.zhihu.com/p/584810055

Post setup

    # Workaround to avoid Post Use step failures related to cache
# Error: There are no cache folders on the disk
- name: Post setup
run: mkdir -p /home/runner/.cache/go-build
continue-on-error: true

接下来我们定义Deploy job

Checkout K8S YAML manifests repository

  deploy:
# The type of runner that the job will run on
runs-on: ubuntu-latest
needs: build
steps:
# Checks-out k8s YAML manifests repository
- name: checkout k8s manifests repo
uses: actions/checkout@v3
with:
# clone https://github.com/xxx/sre_manifests which contains deploy manifests
repository: xxx/sre_manifests
# auth by ssh key or personal toke
ssh-key: ${{ secrets.SSH_PRIVATE_KEY }}
ref: refs/heads/master

然后用Kustomize 来 Edit image tag, 它是由上面步骤 output出来的

    # Update image version
- name: Update Kubernetes resources
run: |
cd demo-manifests/services/demo-app/dev
kustomize edit set image asia.gcr.io/sre-dev/demo-app:${{ needs.build.outputs.image_tag }}
cat kustomization.yaml

接下来我们可以直接连到cluster kubectl apply部署, 也可以commit 代码然后触发 ArgoCD, ArgoCD可以自动Sync repo来部署以及更新同步资源,后续文章会讲到。

下面例子是 gcloud login 然后 获取cluster 最后用kubectl apply 部署资源。

      # authentication via credentials json
- id: 'auth'
uses: 'google-github-actions/auth@v0'
with:
credentials_json: '${{ secrets.GCR_JSON_KEY }}' # test key's json
# Setup gcloud CLI
- name: Set up Cloud SDK
uses: google-github-actions/setup-gcloud@v0
# Get the GKE credentials so we can deploy to the cluster
- name: Set up GKE credentials
run: |-
gcloud container clusters get-credentials xxx_gke_cluster --region xxx_gke_region --project xxx_gcp_project
# Deploy to the GKE cluster
- name: Deploy
run: |-
gcloud container clusters list --project xxx_gcp_project
cd demo-manifests/services/demo-app/dev
cat kustomization.yaml
kustomize build . | kubectl apply -f -
kubectl rollout status deploy/demo-app -n demo

完整例子可以参考 My Github repo

### 本文同步发表于知乎 https://zhuanlan.zhihu.com/p/584810055

参考

https://docs.github.com/en/actions/quickstart
 
 
感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以打赏和推荐,您的鼓励是我创作的动力
 
 

云原生之旅 - 13)基于 Github Action 的自动化流水线的更多相关文章

  1. 云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents

    前言 上一篇文章 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes 我们介绍了在 Kubernetes 上安装 Jenkins,本文介绍下如何设置k8s pod作为Je ...

  2. 云原生之旅 - 5)Kubernetes时代的包管理工具 Helm

    前言 上一篇文章 [基础设施即代码 使用 Terraform 创建 Kubernetes] 教会了你如何在Cloud上面建Kubernetes资源,那么本篇来讲一下如何在Kubernetes上面部署应 ...

  3. 云原生之旅 - 8)云原生时代的网关 Ingress Nginx

    前言 当我们在Kubernetes部署的服务需要暴露给外部用户使用时,有三种选择:LoadBalancer,NodePort, Ingress. LoadBalancer类型得结合各个Cloud Pr ...

  4. 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes

    前言 谈到持续集成工具就离不开众所周知的Jenkins,本文带你了解如何在 Kubernetes 上安装 Jenkins,后续文章会带你深入了解如何使用k8s pod 作为 Jenkins的build ...

  5. 云原生之旅 - 6)不能错过的一款 Kubernetes 应用编排管理神器 Kustomize

    前言 相信经过前一篇文章的学习,大家已经对Helm有所了解,本篇文章介绍另一款工具 Kustomize,为什么Helm如此流行,还会出现 Kustomize?而且 Kustomize 自 kubect ...

  6. 云原生之旅 - 7)部署Terrform基础设施代码的自动化利器 Atlantis

    前言 前面有几篇文章讲述了如何使用Terraform创建资源 (基础设施即代码 Terraform 快速入门, 使用 Terraform 创建 Kubernetes) 以及 Kubernetes时代的 ...

  7. 云原生之旅 - 9)云原生时代网关的后起之秀Envoy Proxy 和基于Envoy 的 Emissary Ingress

    前言 前一篇文章讲述了基于Nginx代理的Kuberenetes Ingress Nginx[云原生时代的网关 Ingress Nginx]这次给大家介绍下基于Envoy的 Emissary Ingr ...

  8. 云原生之旅 - 4)基础设施即代码 使用 Terraform 创建 Kubernetes

    前言 上一篇文章我们已经简单的入门Terraform, 本篇介绍如何使用Terraform在GCP和AWS 创建Kubernetes 资源. Kubernetes 在云原生时代的重要性不言而喻,等于这 ...

  9. 云原生之旅 - 2)Docker 容器化你的应用

    前言 上文中我们用Golang写了一个HTTP server,本篇文章我们讲述如何容器化这个应用,为后续部署到kubernetes 做准备. 关键词:Docker, Containerization, ...

  10. 云原生之旅 - 3)Terraform - Create and Maintain Infrastructure as Code

    前言 工欲善其事,必先利其器.本篇文章我们介绍下 Terraform,为后续创建各种云资源做准备,比如Kubernetes 关键词:IaC, Infrastructure as Code, Terra ...

随机推荐

  1. 解决前端开发报错(SyntaxError: missing : after property id)的问题

    当使用对象初始化语法创建对象的时候,需要使用半角冒号 (:) 将属性键与属性值隔开. 1 var obj = { propertyKey: 'value' }; 冒号与等号 下面的代码会运行失败,原因 ...

  2. SDN实验环境安装配置

  3. Kibana:运用索引模式的 formatter 来探索 IP 信息

    文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/107484674

  4. 通过 Docker 部署 Mysql 8.0 主从模式

    文章转载自:http://www.mydlq.club/article/106/ 系统环境: Mysql 版本:8.0.23 Docker 版本:19.03.13 一.为什么需要 Mysql 主从复制 ...

  5. 第六章:Django 综合篇

    前面五章,已经将Django最主要的五大系统介绍完毕,除了这些主要章节,还有很多比较重要的内容,比如开发流程相关.安全.本地化与国际化.常见工具和一些框架核心功能.这些内容的篇幅都不大,但整合起来也是 ...

  6. 用AR Engine手部骨骼跟踪能力实现虚拟手表试戴

    AR技术的落地应用,推动着电商领域的不断升级,通过增强现实为用户带来了虚拟与现实结合的AR购物体验.如AR试衣.AR试鞋.AR试妆等功能的出现让用户在手机上就能体验产品的佩戴效果,可以让用户更直观.更 ...

  7. Python 3.12 目标:还可以更快!

    按照发布计划,Python 3.11.0 将于 2022 年 10 月 24 日发布. 据测试,3.11 相比于 3.10,将会有 10-60% 的性能提升,这个成果主要归功于"Faster ...

  8. ETL工具Datax、sqoop、kettle 的区别

    一.Sqoop主要特点: 1.可以将关系型数据库中的数据导入到hdfs,hive,hbase等hadoop组件中,也可以将hadoop组件中的数据导入到关系型数据库中: 2.sqoop在导入导出数据时 ...

  9. P1600 [NOIP2016 提高组] 天天爱跑步 (树上差分)

    对于一条路径,s-t,位于该路径上的观察员能观察到运动员当且仅当以下两种情况成立:(d[ ]表示节点深度) 1.观察员x在s-lca(s,t)上时,满足d[s]=d[x]+w[x]就能观察到,所以我们 ...

  10. struts.xml 中用OGNL表达式取不到中文文件名的原因

    在struts2中xml配置如下,以execl文件为例: <result name="success" type="stream">    < ...