Github Actions作为轻量级的CI/CD自动化工具,轻便而又易用。不过,从国内访问的话,它的稳定性和网速都存在问题。

阿里云的云效平台对于个人开发者来说,是免费的。它提供了代码托管和流水线功能,流水线的语法和github actions workflow比较相似,用惯了github actions的话,转到云效上面,感觉相当丝滑,基本上可以成为github的平替。

操作系统:Debian 12 ,Kubernetes V1.28.4

一、登记注册

云效的网址是https://www.aliyun.com/product/yunxiao ,注册一个账号,登录进去,你会得到一个账号ID。

阿里云容器镜像服务ACR的网址是https://www.aliyun.com/product/acr,用刚才得到的账号ID登录进去,开通个人容器镜像托管服务。

开通并进入个人实例,点击命名空间->创建命名空间,名称自己取,自动创建仓库设为开启,默认仓库类型为公开。

二、安装私有runner

对于局域网内部的Kubernetes集群来说,需要在内网用一台独立主机安装runner,这样流水线就可以直接访问集群了。

在局域网内部的一台独立的linux主机上,运行下列命令,安装docker

for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

在云效工作台首页,点击流水线,点击左下角的全局设置图标,点击构建集群管理->新建构建集群,填写集群名称和集群标签,可以自己取名,公开性选择私有。

点击接入新节点,选择Linux->手动安装Runner,会出现一段代码。

在runner主机上,运行上述代码,完成runner的安装。

在云效流水线的全局设置下面,点击构建集群管理,在刚才构建的集群下面,就可以看到这台runner主机了,状态应该为正常。把刚才建立的私有集群的ID记录下来。

三、测试和使用

1.完成连接设置

在云效流水线的全局设置下面,点击服务连接设置->新建服务连接,建立到云效codeup、容器镜像服务ACR的连接,记录它们的服务连接ID。

在云效流水线的全局设置下面,点击Kubernetes集群管理->新建Kubernetes集群->自定义集群,填写集群名称,可以自己取名,集群配置文件的内容,就是Kubernetes集群master主机中~/.kube/config文件的内容,点击保存,完成配置,记录集群ID。

2.部署测试案例

在云效工作台的首页,点击代码管理,点击新建库,名称为yx-runner,公开性为私有。

进入yx-runner库,点击右边的克隆/下载->HTTPS,得到代码克隆URL。

回到云效工作台的首页,点击右上角图标->个人设置->HTTPS密码,得到克隆账号和密码。

在开发主机上,运行

git config --global credential.helper store
git clone <git-clone-url>

进行代码库克隆,<git-clone-url>就是刚才得到的代码克隆URL。

输入上面得到的克隆账号和密码,完成代码克隆。

在开发主机上运行下列命令,安装nodejs

curl -fsSL https://deb.nodesource.com/setup_21.x | sudo -E bash -
sudo apt-get install -y nodejs

运行下列命令,新建一个react应用。

npm create vite@latest yx-runner

选择不要删除文件。选择react和javascript。

运行

cd yx-runner
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退出。

在yx-runner目录下,创建Dockerfile文件,内容如下

#It will use node:21-alpine3.19 as the parent image for
#building the Docker image
FROM registry.cn-hangzhou.aliyuncs.com/<namespace>/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"]

其中<namespace>是容器镜像服务里面的命名空间,根据实际情况调整。

在runner主机上,运行下面命令,把node包上传到ACR。

docker pull node:21-alpine3.19
docker tag  node:21-alpine3.19 registry.cn-hangzhou.aliyuncs.com/<namespace>/node:21-alpine3.19
docker login registry.cn-hangzhou.aliyuncs.com
docker push registry.cn-hangzhou.aliyuncs.com/<namespace>/node:21-alpine3.19

其中<namespace>是容器镜像服务里面的命名空间,根据实际情况调整。docker login的账号密码就是云效的账号ID和密码。

在开发主机的yx-runner目录下,新建目录manifests,进入manifests目录,创建deployment.yaml文件,内容如下

apiVersion: apps/v1
kind: Deployment
metadata:
  name: yx-react
  labels:
    app: yx-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: yx-app
  template:
    metadata:
      labels:
        app: yx-app
    spec:
      containers:
      - name: yx-app
        image:  registry.cn-hangzhou.aliyuncs.com/<namespace>/yx-app:latest
        ports:
        - containerPort: 5173

其中<namespace>是容器镜像服务里面的命名空间,根据实际情况调整。

创建service.yaml文件,内容如下

apiVersion: v1
kind: Service
metadata:
  name: yx-react
spec:
  selector:
    app: yx-app
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 5173
    targetPort: 5173

回到yx-runner目录下,运行下列命令,把代码同步到云效。

git add -A
git commit -m "first commit"
git branch -M main
git push -u origin main

回到云效平台首页,点击进入流水线,点击新建流水线->YAML化编排,模板选择“其他 · 镜像构建,发布到Kubernetes集群/阿里云容器服务”,点击创建。

在流程配置中,填写代码如下

sources:
  my_repo:
    type: codeup
    name: yx workflow
    endpoint: <git-clone-url>
    branch: main
    triggerEvents:
      - push
      - tagPush
    certificate:
      type: serviceConnection
      serviceConnection: <codeup-service-connection-id>
stages:
  acr_docker_build_stage:
    name: "build_stage"
    jobs:
      acr_docker_build_job:
        name: "build_job"
        runsOn: public/cn-beijing
        steps:
          acr_docker_build_step:
            name: "docker_build_step"
            step: "ACRDockerBuild"
            with:
              artifact: "my_image"
              dockerfilePath: "Dockerfile"
              dockerRegistry: "registry.cn-hangzhou.aliyuncs.com/<namespace>/yx-app"
              dockerTag: ${DATETIME}
              extraTags: latest
              region: "cn-hangzhou"
              serviceConnection: "<ACR-service-connction-id>"
  kubectl_apply_stage:
    name: "部署"
    jobs:
      kubectl_apply_job:
        name: "Kubernetes发布"
        runsOn: <private-runner-cluster-id>
        steps:
          kubectl_apply_step:
            name: "Kubectl 发布"
            step: "KubectlApply"
            with:
              skipTlsVerify: false
              kubernetesCluster: "<kubernetes-connection-id>"
              useReplace: false
              namespace: "default"
              kubectlVersion: "1.27.9"
              yamlPath: "manifests"
              skipVariableVerify: false
          kubectl_set_image:
            step: "KubectlSetImage"
            name: "Kubectl 镜像升级"
            with:
              kubernetesCluster: "<kubernetes-connection-id>"
              kubectlVersion: "1.27.9"
              namespace: "default"
              workload:  "yx-react"
              container: "yx-app"
              artifact: $[stages.acr_docker_build_stage.acr_docker_build_job.acr_docker_build_step.artifacts.my_image]

其中,

<git-clone-url>: 代码克隆URL

<codeup-service-connection-id>: 云效codeup服务连接ID

<namespace>: 容器镜像服务ACR中的命名空间

<ACR-service-connction-id>:容器镜像服务连接ID

<private-runner-cluster-id>:私有runner集群ID

<kubernetes-connection-id>:kubernetes集群连接ID

根据实际情况修改。

点击校验,通过后,点击保存并运行。

流水线就会运行起来,完成整个CI/CD过程。

3.测试自动触发

在yx-runner目录下,运行

echo "# test " >> README.md
git add -A
git commit -m "new commit"
git push origin main

在云效流水线下面,点击刚才新建的流水线,可以看到流水线分步骤运行的情况,从代码同步、镜像构建上传,最后部署到kubernetes集群。

登录到Kubernetes的master主机,运行

kubectl get deployment
kubectl get svc

可以看到新增的deployment和service,名为yx-react。

以后每次把代码push到云效平台上,流水线就会自动运行,完成整个流程。

参考:

https://help.aliyun.com/product/150040.html

发表回复

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