CI/CD
CI:指的是持续集成
CD:指的是持续部署
1.CI/CD使用
- 个人博客项目
- 项目在本地开发,然后发布在我个人云服务器上
- 项目使用github仓库存储代码、Git Action 跑 CI/CD
- CI/CD能自动部署到服务器
准备:
- 确保项目在github上有仓库
- 生成公私钥🔑:
ssh-keygen -t ed25519 -C "git_actions" -f ~/.ssh/git_actions- 将私钥添加到你的github仓库的settings > Security and quality > Secrets and variables > Actions

-
添加三个关键信息,如上图所示三个信息
- 服务器IP地址
- 你的私钥,整段复制
- 服务器登录用户名
-
登录你的服务器
- 复制公钥(你需要把上面第 1 步命令中
""里的内容替换成你的公钥(就是ssh-rsa AAAAB3...或ssh-ed25519 AAAAC3...开头的那串字符)。替换后整条命令看起来像这样:echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIn...... user@MacBook-Pro" >> ~/.ssh/authorized_keys)
# 1. 将你刚才复制的公钥内容粘贴并追加到 authorized_keys 文件,保留"", echo "这里直接粘贴你的公钥内容" >> ~/.ssh/authorized_keys # 2. 设置.ssh 和 authorized_keys 的权限(极其重要,权限不对会导致登录失败) chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys - 复制公钥(你需要把上面第 1 步命令中
-
使用本地终端测试服务器是否能直接通过ssh免密登录
# 1. 连接服务器 ssh -i ~/.ssh/git_actions ubuntu@服务器IP地址如果能直接登录,说明你的公钥已经添加成功,可以开始配置CI/CD了。
配置CI/CD
- 在项目根目录下创建文件
.github/workflows/deploy.yml | .github/workflows/docker.yaml,这里使用我的mono项目中的文件作为模板 - 这里我用的是docker部署,所以我用的是docker.yaml文件,内容如下:
name: Docker CICD
on:
push:
branches: [main]
paths:
- "apps/docs/**"
permissions:
contents: read
packages: write
env:
REGISTRY: ghcr.io
IMAGE_NAME: gegepos/yujie-mono/docs
IMAGE_TAG: ${{ github.sha }}
DOCKER_NAME: yujie-docs
REPO: yujie-mono
jobs:
build-and-push:
name: Build and Push Docker Image to ghcr
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to ghcr.io
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Push Docker Image
uses: docker/build-push-action@v6
with:
context: .
file: apps/docs/Dockerfile
platforms: linux/amd64
tags: |
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
push: true
cache-from: type=gha
cache-to: type=gha,mode=max
deploy-to-ubuntu:
name: Deploy on Ubuntu Server
needs: build-and-push
runs-on: ubuntu-latest
steps:
- name: Deploy to Server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.DOCSHOSTIP }}
username: ${{ secrets.DOCSHOSTUSER }}
key: ${{ secrets.CLOUDYUJIE }}
script: |
# 停止nginx服务防止占用端口80
sudo systemctl stop nginx || true
sudo docker stop ${{ env.DOCKER_NAME }} || true
sudo docker run -d --name ${{ env.DOCKER_NAME }} -e KEY:Value -p 80:3000 ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} || true
# 重启nginx服务
sudo systemctl start nginx || true