coding 要停服了, 把所有 CI 迁移到 Github 上 (服务器无需翻墙)

由于网络问题, 在服务器上直接docker pull ghcr.io会有问题, 所以以下的方式我们采用打包镜像然后同步到服务器的方式来解决这个问题.

核心功能定位

概念 技术本质 核心作用 归属
Tag Git 的轻量标签(Lightweight Tag) 标记仓库中的特定提交 (如 git tag v1.0.0) Git 原生功能
Release GitHub 的增强型发布管理 基于 Tag 封装可分发版本(含说明 / 二进制文件等) GitHub 平台功能
Actions GitHub 的 CI / CD 引擎 通过工作流(Workflow)自动化构建、测试、部署 GitHub 平台服务

创建预定义变量

写工作流文件

arduino 复制代码
# tree
├─.github
│  └─workflows
│      └─deploy.yml
├─Dockerfile

Copy

bash 复制代码
## .github/workflows/deploy.yml
name: deploy

on:
  push:
    branches: ['main']

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}
  IMAGE_TAG: ${{ github.run_id }}
  IMAGE_FULL_NAME: ghcr.io/${{ github.repository }}:${{ github.run_id }}
  # !!! 容器名字
  CONTAINER_NAME: test-ci
  # 镜像保存名字
  IMAGE_FILE: ${{ github.run_id }}.tar

jobs:
  build:

    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
      # This is used to complete the identity challenge
      # with sigstore/fulcio when running outside of PRs.
      id-token: write

    steps:

      - name: 检出仓库
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3.0.0

      - name: 登录
        uses: docker/login-action@v3.0.0
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: 提取镜像名
        id: meta
        uses: docker/metadata-action@v5.0.0
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

      - name: 构建镜像并推送
        id: build-and-push
        uses: docker/build-push-action@v5.0.0
        with:
          context: .
          ## 因为网络不好, 所以不能直接 docker pull, 需要打包然后同步到服务器
          push: false
          load: true
          tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
      - name: 打包镜像为 tar 文件
        run: |
          docker save -o ${{ env.IMAGE_FILE }} ${{ env.IMAGE_FULL_NAME }}
          du -sh ${{ env.IMAGE_FILE }}

      - name: 同步镜像到服务器
        uses: appleboy/scp-action@v1
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USERNAME }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: ${{ secrets.SSH_PORT }}
          source: ${{ env.IMAGE_FILE }}
          target: /tmp/

      - name: ssh 部署
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USERNAME }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: ${{ secrets.SSH_PORT }}
          script: |
            # 加载 Docker 镜像
            echo ${{ env.CONTAINER_NAME }}
            echo ${{ env.IMAGE_FULL_NAME }}
            docker load -i /tmp/${{ env.IMAGE_FILE }}
            # 清理旧容器
            docker stop ${{ env.CONTAINER_NAME }} &>/dev/null || true
            docker rm -f ${{ env.CONTAINER_NAME }} &>/dev/null || true
            ## 启动容器
            docker run --name ${{ env.CONTAINER_NAME }} --restart=always ${{ env.IMAGE_FULL_NAME }}
            # 清理临时文件
            rm /tmp/${{ env.IMAGE_FILE }}
            echo "Deployment completed successfully!"            
相关推荐
工业一体机老司机6 小时前
Docker部署工控机采集服务 Compose编排与开机自启
运维·docker·容器
GoGeekBaird10 小时前
别再给每个 AI 做自我介绍了:我做了一个「个人上下文」管理系统
后端·github·agent
莫晓燚11 小时前
Ansible 13 个常用模块---企业实战
git·github
miaobinfei12 小时前
docker拉取dify镜像,执行docker compose up -d 报错
运维·docker·容器
kobe_OKOK_13 小时前
docker compose命名卷 映射到宿主机的路径
运维·docker·容器
程序员柒叔13 小时前
Diagram Design 解构:45 种图型如何用语义路由与 SVG 质量门交付
人工智能·github·agent·skills
逛逛GitHub13 小时前
9 个神级 GitHub 项目助你蹭上抖音、小红书 Vibe 知识大赏热点。
github
m4Rk_13 小时前
【论文阅读】Agent 记忆机制(119):EvoLife——让具身 Agent 把主动问到的答案沉淀为可复用的空间经验
论文阅读·人工智能·学习·开源·github
后台模板学习16 小时前
GitHub Actions 与 Jenkins 在日志监
运维·github·jenkins
miofly16 小时前
GitHub 今日推荐|auto-ontology:给 Agent 装上企业数据的语义索引
python·开源·github