-
Notifications
You must be signed in to change notification settings - Fork 0
/
action.yaml
182 lines (166 loc) · 6.74 KB
/
action.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
name: Previews
description: Github Action used to deploy preview environments, to Google Cloud Run.
author: "@joggrdocs"
branding:
icon: 'aperture'
color: 'blue'
inputs:
#------------------
# Deployment
#------------------
name:
description: "The name of the service (must be unique) to be deployed. This cannot exceed 24 characters"
required: true
port:
description: "The port that the application will run on in the container."
required: false
default: "8080"
service_account:
description: "The service account to be used for the Cloud Run service."
required: false
env_vars:
description: "List of environment variables that will be injected during runtime, each on a new line."
required: false
secrets:
description: "List of secrets that will be injected during runtime, each on a new line."
required: false
flags:
description: "List of flags that will be injected during runtime."
required: false
gcp_region:
description: "The GCP Region where the service will be deployed."
required: false
default: "us-central1"
gcp_project_id:
description: "The GCP Project ID where the service will be deployed."
required: false
default: "durable-primacy-268722"
gcp_service_account_key:
description: "The Service Account JSON Key used to push images to the GCP Artifact Registry."
required: true
gcp_artifact_repository:
description: "The Artifact Registry name, you can override for custom names (i.e. the 'acme' in us-docker.pkg.dev/able-sailor-21423/acme)"
required: true
gcp_tag:
description: "A tag to be applied to the Cloud Run service, used for ingress or other permissions."
required: false
default: "tagValues/281479867842234"
#------------------
# Pull Request Integration
#------------------
github_token:
description: "Github Token, pass in the `secrets.GITHUB_TOKEN`."
required: true
#------------------
# Docker
#------------------
docker_file_name:
description: "The Dockerfile name, you can override for custom names (i.e. DevDockerfile)"
required: false
default: "Dockerfile"
docker_directory:
description: "Directory where the DockerFile is located."
required: false
default: "."
docker_build_args:
description: "Comma separated list of arguments that will be injected during the build, each on a new line."
required: false
outputs:
url:
description: "The preview URL for the running application"
value: ${{ steps.deploy.outputs.url }}
runs:
using: "composite"
steps:
- name: '💬 Add Deployment in progress to Pull Request'
uses: actions/github-script@v7
with:
github-token: ${{ inputs.github_token }}
script: |
const script = require('${{ github.action_path }}/scripts/pullrequest-comment.js');
await script({ github, context, core, }, 'deploying');
- name: '#️⃣ Extract Pull Request #'
uses: actions/github-script@v7
id: pr-number
with:
result-encoding: string
script: |
if (!context.payload.number) {
core.setFailed('No PR number found, you can only run Previews on Pull Requests.');
}
return context.payload.number;
- name: '☁️ Authenticate to Google Cloud'
uses: 'google-github-actions/auth@v2'
with:
project_id: ${{ inputs.gcp_project_id }}
credentials_json: '${{ inputs.gcp_service_account_key }}'
- name: '☁️ Setup Cloud SDK'
uses: google-github-actions/setup-gcloud@v2
with:
project_id: ${{ inputs.gcp_project_id }}
- name: '🐳 Set up Docker Buildx'
uses: docker/setup-buildx-action@v3
- name: '🐳 Authorize Docker push'
shell: bash
run: gcloud auth configure-docker us-docker.pkg.dev --quiet
- name: '🐳 Build and Push Container'
uses: actions/github-script@v7
env:
DOCKER_BUILD_ARGS: '${{ inputs.docker_build_args }}'
GCP_PROJECT_ID: '${{ inputs.gcp_project_id }}'
GCP_ARTIFACT_REPOSITORY: '${{ inputs.gcp_artifact_repository }}'
NAME: '${{ inputs.name }}'
DOCKER_DIRECTORY: '${{ inputs.docker_directory }}'
DOCKER_FILE_NAME: '${{ inputs.docker_file_name }}'
GITHUB_SHA: '${{ github.sha }}'
with:
github-token: ${{ inputs.github_token }}
script: |
const script = require('${{ github.action_path }}/scripts/docker.js');
const { env } = process;
await script({ github, context, core, exec, env });
- name: '🚀 Deploy to Cloud Run'
id: deploy
uses: google-github-actions/deploy-cloudrun@v2
with:
service: 'pvw-${{ inputs.gcp_artifact_repository }}-${{ inputs.name }}-pr${{ steps.pr-number.outputs.result }}'
image: 'us-docker.pkg.dev/${{ inputs.gcp_project_id }}/${{ inputs.gcp_artifact_repository }}/${{ inputs.name }}:${{ github.sha }}'
region: '${{ inputs.gcp_region }}'
flags: '${{ inputs.flags }} --allow-unauthenticated --port=${{ inputs.port }} --service-account=${{ inputs.service_account || fromJSON(inputs.gcp_service_account_key).client_email }}'
env_vars: ${{ inputs.env_vars }}
secrets: ${{ inputs.secrets }}
labels: |
previews=true
group=${{ inputs.gcp_artifact_repository }}
service=${{ inputs.name }}
pull_request=pr${{ steps.pr-number.outputs.result }}
- name: '🏷️ Tag Cloud Run Service for Ingress'
uses: actions/github-script@v7
env:
SERVICE_NAME: 'pvw-${{ inputs.gcp_artifact_repository }}-${{ inputs.name }}-pr${{ steps.pr-number.outputs.result }}'
GCP_PROJECT_ID: '${{ inputs.gcp_project_id }}'
GCP_REGION: '${{ inputs.gcp_region }}'
GCP_TAG: '${{ inputs.gcp_tag }}'
with:
github-token: ${{ inputs.github_token }}
script: |
const script = require('${{ github.action_path }}/scripts/gcp-resource-tag.js');
await script({ github, context, core, exec, env: process.env });
- name: '💬 Add Deployment URL to Pull Request'
uses: actions/github-script@v7
env:
DEPLOY_URL: '${{ steps.deploy.outputs.url }}'
with:
github-token: ${{ inputs.github_token }}
script: |
const script = require('${{ github.action_path }}/scripts/pullrequest-comment.js');
const { DEPLOY_URL: url } = process.env;
await script({ github, context, core, }, 'success', url);
- name: '❌ Preview Failed'
uses: actions/github-script@v7
if: ${{ failure() }}
with:
github-token: ${{ inputs.github_token }}
script: |
const script = require('${{ github.action_path }}/scripts/pullrequest-comment.js');
await script({ github, context, core, }, 'failed');