You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Docker实现GitHub Action至Google Cloud VM的持续部署

将Docker镜像部署到Google Cloud虚拟机的GitHub Actions配置方案

前置准备

  • 在GCP控制台创建虚拟机实例,确保实例已安装Docker(可通过VM启动脚本自动安装,或手动执行sudo apt update && sudo apt install docker.io -y)
  • 创建GCP服务账号,授予以下权限:
    • Compute Instance Admin(v1):用于操作VM实例
    • Storage Object Admin:用于推送/拉取容器镜像
  • 下载服务账号的JSON密钥文件,在GitHub仓库的「Settings -> Secrets and variables -> Actions」中添加以下Secrets:
    • GCP_SERVICE_ACCOUNT_KEY:粘贴JSON密钥的完整内容
    • GCP_PROJECT_ID:你的GCP项目ID
    • GCP_VM_INSTANCE_NAME:目标VM实例的名称
    • GCP_VM_ZONE:VM所在的区域(比如us-central1-a)

完整GitHub Actions配置文件

创建.github/workflows/cd-to-gcp-vm.yml,内容如下:

name: CD to GCP VM

on:
  push:
    branches: [ main ]  # 触发分支可根据需求修改

jobs:
  build-and-push-image:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'  # 匹配你的项目Node版本
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Authenticate to GCP
        uses: google-github-actions/auth@v2
        with:
          credentials_json: ${{ secrets.GCP_SERVICE_ACCOUNT_KEY }}

      - name: Configure Docker for GCR
        run: |
          gcloud auth configure-docker us.gcr.io  # 替换为你的镜像仓库区域,比如asia.gcr.io
          gcloud config set project ${{ secrets.GCP_PROJECT_ID }}

      - name: Build and push Docker image
        run: |
          IMAGE_TAG=us.gcr.io/${{ secrets.GCP_PROJECT_ID }}/my-node-app:${{ github.sha }}
          docker build -t $IMAGE_TAG .
          docker push $IMAGE_TAG

  deploy-to-vm:
    needs: build-and-push-image
    runs-on: ubuntu-latest
    steps:
      - name: Authenticate to GCP
        uses: google-github-actions/auth@v2
        with:
          credentials_json: ${{ secrets.GCP_SERVICE_ACCOUNT_KEY }}

      - name: Set up gcloud CLI
        uses: google-github-actions/setup-gcloud@v2

      - name: Deploy new image to VM
        run: |
          # 生成要在VM上执行的脚本
          DEPLOY_SCRIPT=$(cat << 'EOF'
          # 拉取最新镜像
          docker pull us.gcr.io/${{ secrets.GCP_PROJECT_ID }}/my-node-app:${{ github.sha }}
          # 停止并删除旧容器(如果存在)
          docker stop my-node-app-container || true
          docker rm my-node-app-container || true
          # 启动新容器,映射端口(这里假设项目用3000端口,可修改)
          docker run -d --name my-node-app-container -p 80:3000 us.gcr.io/${{ secrets.GCP_PROJECT_ID }}/my-node-app:${{ github.sha }}
          EOF
          )
          # 向VM发送执行命令
          gcloud compute ssh ${{ secrets.GCP_VM_INSTANCE_NAME }} \
            --zone ${{ secrets.GCP_VM_ZONE }} \
            --command "$DEPLOY_SCRIPT"

关键部分说明

  1. 镜像仓库区域:将us.gcr.io替换为你GCP项目所在的区域镜像仓库(比如asia.gcr.io、eu.gcr.io)
  2. 端口映射:-p 80:3000表示将VM的80端口映射到容器的3000端口,可根据你的Node项目实际端口修改
  3. 容器名称:my-node-app-container是自定义的容器名称,可按需调整
  4. 触发条件:当前配置是推送到main分支时触发,可修改on.push.branches调整触发分支

额外提示

  • 如果VM需要防火墙规则允许外部访问容器端口,需在GCP控制台配置防火墙规则,允许对应端口的入站流量
  • 若要简化镜像标签管理,可将${{ github.sha }}替换为latest,但建议保留提交哈希便于版本回溯

内容的提问来源于stack exchange,提问作者Enrico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:10:07