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就会自动运行,完成整个流程。

参考:

https://maytan.work/ci-cd-kubernetes-github-actions

https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/adding-self-hosted-runners?learn=hosting_your_own_runners&learnProduct=actions

https://thedkpatel.medium.com/dockerizing-react-application-built-with-vite-a-simple-guide-4c41eb09defa

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注