Github action to simplify deploys to Google Compute Engine.
This action will...
- Clone an existing instance template (using it as a base).
- Update metadata config of the newly created instance template to run a startup script.
- Tell the instance group manager to perform a rolling update with the new instance template.
Set up the following resources manually in the Cloud Console or use a tool like Terraform.
- Create a base instance template to be cloned by this action.
- Create a managed instance group. Please note that currently only regional instance groups are supported.
- Create Service Account with Roles Compute AdminandService Account Userand export a new JSON key.
By default this action expects a deploy.yml in the root directory of the repository.
Here is an example:
common:
  labels:
    gitsha: ${{GITHUB_SHA}}
deploys:
  - name: my-app-deploy
    region: us-central1
    instance_group: my-app-instance-group
    instance_template_base: my-app-instance-template-base
    instance_template: my-app-${{GITHUB_RUN_NUMBER}}-${{GITHUB_SHA}}
    cloud_init: cloud-init.yml # see example dir
    labels: # will also have gitsha from common section
      version: ${{APP_VERSION}}
    tags:
      - my-tag123
    update_policy:
      min_ready_sec: 30
delete_instance_templates_after: false| Variable | Description | 
|---|---|
| deploys.*.name | Required Name of the deploy | 
| deploys.*.project | Name of the Google Cloud project. Defaults to Project from Credentials. | 
| deploys.*.creds | Either a path or the contents of a Service Account JSON Key. Required, if not specified in Github action. | 
| deploys.*.region | Required Region of the instance group. | 
| deploys.*.instance_group | Required Name of the instance group. | 
| deploys.*.instance_template_base | Required Instance template to be used as base. | 
| deploys.*.instance_template | Required Name of the newly created instance template. | 
| deploys.*.startup_script | Path or URL to script to run when VM boots. Read more | 
| deploys.*.shutdown_script | Path or URL to script to run when VM shuts down. Read more | 
| deploys.*.cloud_init | Path or URL to cloud-init file. Read more | 
| deploys.*.labels | A set of key/value label pairs to assign to instances. Keys override common.*.labels. | 
| deploys.*.metadata | A set of key/value metadata pairs to make available from within instances. Keys override common.*.metadata. | 
| deploys.*.tags | A list of tags to assign to instances. Tags are merged with common.*.tags. | 
| deploys.*.vars | A set of additional key/value variables which will be available in either startup_script, shutdown_script or cloud_init. Keys override existing ENV vars and common.*.vars. | 
| deploys.*.update_policy.type=PROACTIVE | The type of update process, must be either PROACTIVE(default) orOPPORTUNISTIC. Read more | 
| deploys.*.update_policy.replacement_method=SUBSTITUTE | What action should be used to replace instances, must be either SUBSTITUTE(default) orRECREATE. Read more | 
| deploys.*.update_policy.minimal_action=REPLACE | Minimal action to be taken on an instance, possible values are NONE,REFRESH,REPLACE(default) orRESTART. Read more | 
| deploys.*.update_policy.min_ready_sec=10 | Time to wait between consecutive instance updates, default is 10 seconds. Read more | 
| deploys.*.update_policy.max_surge=3 | Maximum number (or percentage, i.e. 15%) of temporary instances to add while updating. Default is 3. Read more | 
| deploys.*.update_policy.max_unavailable=0 | Maximum number (or percentage, i.e. 100%) of instances that can be offline at the same time while updating. Default is 0. Read more | 
| common.project | Set default for deploys.*.project | 
| common.region | Set default for deploys.*.region | 
| common.startup_script | Set default for deploys.*.startup_script | 
| common.shutdown_script | Set default for deploys.*.shutdown_script | 
| common.cloud_init | Set default for deploys.*.cloud_init | 
| common.labels | Set default for deploys.*.labels | 
| common.metadata | Set default for deploys.*.metadata | 
| common.tags | Set default for deploys.*.tags | 
| common.vars | Set default for deploys.*.vars | 
| common.update_policy.type | Set default for deploys.*.update_policy.type | 
| common.update_policy.replacement_method | Set default for deploys.*.update_policy.replacement_method | 
| common.update_policy.minimal_action | Set default for deploys.*.update_policy.minimal_action | 
| common.update_policy.min_ready_sec | Set default for deploys.*.update_policy.min_ready_sec | 
| common.update_policy.max_surge | Set default for deploys.*.update_policy.max_surge | 
| common.update_policy.max_unavailable | Set default for deploys.*.update_policy.max_unavailable | 
| delete_instance_templates_after=336h | Delete old instance templates after duration, defaults to 336h(14 days). Set tofalseto disable. | 
Environment variables can be used in deploy.yml, startup_script, shutdown_script and cloud_init files.
The syntax is ${{FOO}} and supports substring extraction, i.e. ${{GITHUB_SHA:0:7}}:
${{VAR:position}}        - Extracts substring from $VAR at "position"
${{VAR:position:length}} - Extracts "length" characters of substring from $VAR at "position"
Github sets a bunch of default environment variables.
uses: mattes/gce-deploy-action@v5
with:
  creds: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}
| Variable | Description | 
|---|---|
| creds | Required Either a path or the contents of a Service Account JSON Key. | 
| config | Path to config file. Default deploy.ymlordeploy.yaml. |