
Github Actions作为轻量级的自动化工具,尽管没有Jenkins那么强大,也没有那么多插件可用,但是用作一般的CI/CD用途,已经完全够用了。它可以实现从代码同步、镜像构建到容器部署的整个过程,当然也支持github push触发。
搭建部署过程如下。 操作系统Debian 12, Kubernetes 1.28.4。
一、安装Github Actions Self-hosted Runner
裸金属Kunbernetes集群往往没有公网IP地址,所以在局域网内部的主机上运行Github Actions Self Hosted Runner,就可以直接访问集群,较好地解决这个问题。这需要一台独立的linux主机来安装运行,我们把它叫Runner主机。
1.安装kubectl
在Runner主机上运行下列命令,完成kubectl安装。
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
apt-get update
apt install kubectl
2. 复制config文件
把Kubernetes集群的master主机的.kube/config文件复制出来,放到Runner主机的$HOME/.kube目录下,如果使用debian账号,那就是复制到/home/debian/.kube/config。
运行kubectl get node
测试一下,正常的话,就可以看到集群各个节点的运行情况。
3.安装Self-hosted Runner
在github中建立一个公有的Repository,可以自己取一个名字,这里的例子为action-runner-poc。
进入action-runner-poc的settings页面,点击Actions->Runners->New Self-hosted Runner->Linux,Architecture选择x64,按照下面的提示,在Runner主机上运行命令,完成安装过程,并投入运行。
在github上,进入action-runner-poc的settings页面,点击Actions->Runners,可以看到Runner主机已经在线。
二、部署和使用
1.部署测试案例
在开发主机上运行下列命令,安装nodejs
curl -fsSL https://deb.nodesource.com/setup_21.x | sudo -E bash -
sudo apt-get install -y nodejs
运行下列命令,新建一个react应用。
npm create vite@latest action-runner-poc
选择react和javascript。
运行
cd action-runner-poc
npm install
修改vite.config.js如下
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
export default defineConfig({
base: "/",
plugins: [react()],
preview: {
port: 5173,
strictPort: true,
},
server: {
port: 5173,
strictPort: true,
host: true,
origin: "http://0.0.0.0:5173",
},
});
运行
npm run build
npm run preview
可以看到web服务的运行情况,ctrl+c退出。
在action-runner-poc目录下,创建Dockerfile文件,内容如下
#It will use node:21-alpine3.19 as the parent image for
#building the Docker image
FROM node:21-alpine3.19
#It will create a working directory for Docker. The Docker
#image will be created in this working directory.
WORKDIR /app
#Copy the React application dependencies from the
#package.json to the react-app working directory.
COPY package.json .
#install all the React application dependencies
RUN npm i
COPY . .
RUN npm run build
#Expose the React application container on port 5173
EXPOSE 5173
#The command to start the React application container
CMD ["npm", "run", "preview"]
创建deployment.yaml文件,内容如下
apiVersion: apps/v1
kind: Deployment
metadata:
name: act-react
labels:
app: act-react-app
spec:
replicas: 2
selector:
matchLabels:
app: act-react-app
template:
metadata:
labels:
app: act-react-app
spec:
containers:
- name: act-react-app
image: dockerhub-username/act-react-app:latest
ports:
- containerPort: 5173
创建service.yaml文件,内容如下
apiVersion: v1
kind: Service
metadata:
name: act-react
spec:
selector:
app: act-react-app
type: LoadBalancer
ports:
- protocol: TCP
port: 5173
targetPort: 5173
在action-runner-poc目录下,新建目录.github/workflows,进入该目录,新建文件workflow.yaml,内容如下
name: Deploy act-react
on:
push:
branches:
- main
env:
REGISTRY_URL: docker.io/dockerhub-username
SERVICE_NAME: act-react-app
SERVICE_TAG: latest
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Generate docker image name
id: image_tag
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Build and push orchestration service
uses: docker/build-push-action@v4
with:
context: .
tags: |
${{ env.REGISTRY_URL }}/${{ env.SERVICE_NAME }}:${{ steps.image_tag.outputs.sha_short }}
${{ env.REGISTRY_URL }}/${{ env.SERVICE_NAME }}:latest
push: true
deploy:
needs: [ build ]
runs-on: self-hosted
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Deploying
run: |
kubectl apply -f deployment.yaml -f service.yaml
kubectl rollout restart deployment/act-react
其中dockerhub_username是你在dockerhub上的用户名,按照实际情况修改。
在github上,进入action-runner-poc的settings页面,点击Secrets and variables->Actions->New repository secret , 新建两个secret , Name分别为DOCKERHUB_USERNAME和DOCKERHUB_TOKEN, Secret分别为你在dockerhub上的用户名和密码。
回到action-runner-poc目录下,运行下列命令,把代码同步到github
echo "#Kubernetes Deployment." >> README.md
git init
git add -A
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:GITHUB-USERNAME/action-runner-poc.git
git push -u origin main
其中GITHUB-USERNAME是你在github上的账号,按照实际情况修改。
2. 测试自动触发
在action-runner-poc目录下,运行
echo "# test " >> README.md
git add -A
git commit -m "new commit"
git push origin main
在github上,进入action-runner-poc的Actions,可以看到workflow正在运行。点击new commit,可以看到它的运行过程,包括代码检出、docker镜像构建、docker镜像推送,最后把deployment和service部署到kubernetes集群的整个流程。
登录到Kubernetes的master主机,运行
kubectl get deployment
kubectl get svc
可以看到新增的deployment和service,名为act-react。
这样github actions就部署完成了,每次把代码push到github上,workflow就会自动运行,完成整个流程。
参考: