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 平台服务

创建预定义变量

图片

写工作流文件

# tree
├─.github
│  └─workflows
│      └─deploy.yml
├─Dockerfile

Copy

## .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!"            
本作品采用《CC 协议》,转载必须注明作者和本文链接
当神不再是我们的信仰,那么信仰自己吧,努力让自己变好,不辜负自己的信仰!
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

腾讯这个搅屎棍

4小时前 评论
seth-shi (楼主) 3小时前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
44
粉丝
158
喜欢
714
收藏
347
排名:30
访问:22.3 万
私信
所有博文
社区赞助商