You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Google Cloud App Engine Golang应用定时自动部署配置咨询

Hey there! Let's clarify a common misconception first: cron.yaml isn't meant for automating deployments—it's used to schedule recurring HTTP requests to your running App Engine app (like triggering a background task inside your app). To set up automatic scheduled deployments, you'll need to use Cloud Build paired with Cloud Scheduler.

But wait, since your app only has a dynamically changing index.html, there's a more efficient alternative that avoids redeploying entirely. Let's cover both options:

Option 1: Schedule Automated Deployments (for code/content changes in your repo)

This is for when your index.html (or other code) is updated in a version control repo, and you want to deploy those changes on a schedule.

Step 1: Prepare Your Code Repository

First, host your code in a supported repo (Cloud Source Repositories, GitHub, or GitLab). If you're not using one already:

  • Create a repo in Cloud Source Repositories
  • Push your local code to this repo

Step 2: Create a Cloud Build Config

Add a cloudbuild.yaml file to your repo's root directory with the deployment step:

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    gcloud app deploy --quiet

This uses Google's official Cloud SDK image to run the gcloud app deploy command (the --quiet flag skips interactive prompts).

Step 3: Set Up a Cloud Build Trigger

  • Go to the Cloud Build Triggers page in the GCP Console
  • Click "Create Trigger"
    • Select your repo as the source
    • Set the trigger type to "Manual" (we'll trigger it via Cloud Scheduler)
    • Under "Build configuration", select "Cloud Build configuration file (yaml or json)" and point to cloudbuild.yaml
  • Save the trigger—note its Trigger ID (you'll need this later)

Step 4: Configure Cloud Scheduler

  • Go to the Cloud Scheduler page in the GCP Console
  • Click "Create Job"
    • Name your job (e.g., daily-app-deploy)
    • Set the schedule using a cron expression (e.g., 0 2 * * * for 2 AM UTC; adjust the timezone if needed)
    • For "Target type", select "HTTP"
    • Enter the trigger URL:
      https://cloudbuild.googleapis.com/v1/projects/[YOUR_PROJECT_ID]/triggers/[YOUR_TRIGGER_ID]:run
      
    • Set "HTTP method" to POST
    • Under "Authentication", select "OAuth token"
      • Service account: Choose a service account with the Cloud Build Trigger Invoker role (you can use the default Cloud Scheduler service account, or create a dedicated one)
      • Audience: Enter https://cloudbuild.googleapis.com/
  • Save the job. Now it will trigger your Cloud Build deployment on the schedule you set.

Permissions Check

Make sure:

  • The Cloud Build service account ([PROJECT_ID]@cloudbuild.gserviceaccount.com) has the App Engine Deployer role
  • The service account used in Cloud Scheduler has the Cloud Build Trigger Invoker role

Option 2: Schedule Content Updates (No Redeployment Needed)

Since your app only needs to update the content of index.html, you don't need to redeploy the entire app every time. Instead, have your app fetch the latest content on a schedule and serve it dynamically.

Step 1: Add a Refresh Endpoint to Your Go App

Add an HTTP handler that fetches the latest content (from a database, Cloud Storage, external API, etc.) and caches it (in memory, Cloud Memorystore, or a file):

package main

import (
	"fmt"
	"net/http"
	"sync"
	"time"
)

var (
	latestContent string
	contentMutex  sync.RWMutex
)

// Handler for your main page
func indexHandler(w http.ResponseWriter, r *http.Request) {
	contentMutex.RLock()
	defer contentMutex.RUnlock()
	fmt.Fprint(w, latestContent)
}

// Handler to refresh content (protected for internal use only)
func refreshContentHandler(w http.ResponseWriter, r *http.Request) {
	// Replace this with your actual content-fetching logic
	// Example: Pull from Cloud Storage, query a database, or call an API
	newContent := "<html><body>Updated content at " + time.Now().String() + "</body></html>"

	contentMutex.Lock()
	defer contentMutex.Unlock()
	latestContent = newContent

	w.WriteHeader(http.StatusOK)
	fmt.Fprint(w, "Content refreshed successfully")
}

func main() {
	// Initialize content on startup
	latestContent = "<html><body>Initial content</body></html>"

	http.HandleFunc("/", indexHandler)
	http.HandleFunc("/admin/refresh-content", refreshContentHandler)
	http.ListenAndServe(":8080", nil)
}

Step 2: Configure cron.yaml

Create a cron.yaml file in your app's root to schedule calls to the refresh endpoint:

cron:
- description: "Daily content refresh"
  url: /admin/refresh-content
  schedule: 0 2 * * *
  timezone: Asia/Shanghai  # Adjust to your local timezone
  target: default  # Your App Engine service name (default if you only have one)

Step 3: Deploy the Cron Job

Run this command to deploy the cron configuration:

gcloud app deploy cron.yaml

Now, every day at 2 AM (your timezone), App Engine will hit the /admin/refresh-content endpoint, update the cached content, and users will see the latest index.html without any redeployment. This is much lighter and faster than redeploying the entire app!


Final Notes

  • If your content changes are infrequent, Option 2 is almost always better—it avoids deployment overhead and potential downtime (even minor with App Engine's rolling deployments).
  • If you do need to deploy code changes on a schedule, Option 1 is the way to go.

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

火山引擎 最新活动