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!"            
相关推荐
Molesidy9 小时前
【Git】对于github的本地ssh客户端的配置与分支的使用
git·ssh·github
playStudy9 小时前
从0到1玩转 Google SEO
python·搜索引擎·github·全文检索·中文分词·solr·lucene
坐吃山猪9 小时前
Docker03-知识点整理
docker
zml_201512 小时前
docker 1分钟 快速搭建 redis 哨兵集群
linux·redis·docker·docker-compose
草履虫建模13 小时前
若依微服务一键部署(RuoYi-Cloud):Nacos/Redis/MySQL + Gateway + Robot 接入(踩坑与修复全记录)
redis·mysql·docker·微服务·云原生·nacos·持续部署
阿鹿.16 小时前
docker-相关笔记
java·笔记·docker
007php00717 小时前
Go 语言常用命令使用与总结
java·linux·服务器·前端·数据库·docker·容器
北城笑笑17 小时前
Git 9 ,.git/index.lock 文件冲突问题( .git/index.lock‘: File exists. )
前端·git·gitee·gitlab·github
小先生0010118 小时前
GraphRAG 知识图谱核心升级:集成 langextract 与 Gemini ----实现高精度实体与关系抽取
人工智能·python·开源·prompt·github·bert·知识图谱
你是我的日月星河18 小时前
Docker部署单节点使用KRaft存储数据的Kafka与可视化界面Kafka-Map
docker·容器·kafka