
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到云效平台上,流水线就会自动运行,完成整个流程。
参考: