Skip to Content
Welcome to yujie-code-blogs build by Nextra 4.0 🎉
Docker 部署CI/CD 部署

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

![image-20260509114905644](/Users/gegepos/Library/Application Support/typora-user-images/image-20260509114905644.png)

  • 添加三个关键信息,如上图所示三个信息

    • 服务器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
  • 使用本地终端测试服务器是否能直接通过ssh免密登录

    # 1. 连接服务器 ssh -i ~/.ssh/git_actions ubuntu@服务器IP地址

    如果能直接登录,说明你的公钥已经添加成功,可以开始配置CI/CD了。


配置CI/CD

  1. 在项目根目录下创建文件.github/workflows/deploy.yml | .github/workflows/docker.yaml,这里使用我的mono项目中的文件作为模板
  2. 这里我用的是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