基于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项目IDGCP_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"
关键部分说明
- 镜像仓库区域:将
us.gcr.io替换为你GCP项目所在的区域镜像仓库(比如asia.gcr.io、eu.gcr.io) - 端口映射:
-p 80:3000表示将VM的80端口映射到容器的3000端口,可根据你的Node项目实际端口修改 - 容器名称:
my-node-app-container是自定义的容器名称,可按需调整 - 触发条件:当前配置是推送到
main分支时触发,可修改on.push.branches调整触发分支
额外提示
- 如果VM需要防火墙规则允许外部访问容器端口,需在GCP控制台配置防火墙规则,允许对应端口的入站流量
- 若要简化镜像标签管理,可将
${{ github.sha }}替换为latest,但建议保留提交哈希便于版本回溯
内容的提问来源于stack exchange,提问作者Enrico
相关产品推荐
相关产品推荐

