-
Notifications
You must be signed in to change notification settings - Fork 1
170 lines (154 loc) · 6.22 KB
/
deploy-twilio-functions.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
name: "Deploy Twilio Functions Service"
on:
workflow_call:
inputs:
SERVICE_DIRECTORY:
type: string
required: true
description: The path to the Twilio Functions Service base directory (where package.json is located)
BUILD_WORKFLOW_NAME:
type: string
required: true
description: The name of the workflow that built the artifact.
TWILIO_ACCOUNT_SID:
type: string
required: true
description: The Twilio Account SID
TWILIO_API_KEY:
type: string
required: true
description: The SID of a Twilio API Key
SELECT_VERSION:
type: string
required: false
description: (Optional) Select a specific artifact version to deploy
NODE_VERSION:
type: string
required: false
description: (Optional) Override Node Version (Default to engines.node or 18 if not found)
VERSION_COMPARE_PATH:
type: string
required: false
description: (Optional) The path to a version.txt file to be compared to. Prevents overwriting the current deployed version if set.
secrets:
TWILIO_API_SECRET:
required: true
description: The secret value of TWILIO_API_KEY
outputs:
SERVICE_NAME:
description: The name of the deployed Functions Service
value: ${{ jobs.deploy_twilio_functions.outputs.SERVICE_NAME }}
SERVICE_VERSION:
description: The version of the deployed Functions Service
value: ${{ jobs.deploy_twilio_functions.outputs.SERVICE_VERSION }}
jobs:
deploy_twilio_functions:
runs-on: ubuntu-22.04
env:
NODE_VERSION: ${{ inputs.NODE_VERSION }}
SERVICE_DIR: ${{ inputs.SERVICE_DIRECTORY != '' && inputs.SERVICE_DIRECTORY || '.' }}
outputs:
SERVICE_NAME: ${{ steps.version.outputs.NAME }}
SERVICE_VERSION: ${{ steps.version.outputs.VERSION }}
steps:
- name: Resolve Input Paths
run: |
serviceDir="${{ inputs.SERVICE_DIRECTORY }}"
if [[ "$serviceDir" =~ \./.* ]]; then
echo "SERVICE_DIR=${serviceDir:2}" >> "$GITHUB_ENV"
fi
- name: Checkout ${{ github.repository }}/${{ inputs.SERVICE_DIRECTORY }}/package.json+.twilioserverlessrc@${{ github.ref_name }}
uses: actions/checkout@v4
with:
path: main
sparse-checkout: |
${{ env.SERVICE_DIR }}/package.json
${{ env.SERVICE_DIR }}/.twilioserverlessrc
sparse-checkout-cone-mode: false
- name: Checkout zingdevlimited/actions-helpers@v3
uses: actions/checkout@v4
with:
repository: zingdevlimited/actions-helpers
path: helpers
ref: v3
- name: Resolve Dependencies
run: |
if [ -z "${{ inputs.NODE_VERSION }}" ]; then
nodeVer=$(cat ${{ env.SERVICE_DIR }}/package.json | jq -r '.engines.node // empty')
if [ -z "$nodeVer" ]; then
nodeVer="18.x"
fi
fi
echo "NODE_VERSION=$nodeVer" >> "$GITHUB_ENV"
- name: Set up Node ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Get package.json version
id: version
working-directory: main/${{ env.SERVICE_DIR }}
run: |
name=$(cat package.json | jq -r .name)
version=$(cat package.json | jq -r .version)
echo "NAME=$name" >> "$GITHUB_OUTPUT"
if [ -z "${{ inputs.SELECT_VERSION }}" ]; then
echo "VERSION=$version" >> "$GITHUB_OUTPUT"
else
echo "VERSION=${{ inputs.SELECT_VERSION }}" >> "$GITHUB_OUTPUT"
fi
- name: Get Existing Service
id: existingService
if: inputs.VERSION_COMPARE_PATH != ''
uses: ./helpers/get-twilio-functions-service
with:
SERVICE_NAME: ${{ steps.version.outputs.NAME }}
IGNORE_NOT_FOUND: true
TWILIO_API_KEY: ${{ inputs.TWILIO_API_KEY }}
TWILIO_API_SECRET: ${{ secrets.TWILIO_API_SECRET }}
- name: Check Deployed Service
id: versionCompare
if: steps.existingService.outputs.SERVICE_SID != ''
run: |
response=$(curl -sX GET "$BASE_URL/$URL_PATH")
if [ "$response" == "$VERSION" ]; then
echo "::warning::Service with version $VERSION is already deployed. Skipping deployment"
echo "SKIP=true" >> $GITHUB_OUTPUT
fi
env:
BASE_URL: ${{ steps.existingService.outputs.BASE_URL }}
URL_PATH: ${{ inputs.VERSION_COMPARE_PATH }}
VERSION: ${{ steps.version.outputs.VERSION }}
- name: Download Artifact from ${{ inputs.BUILD_WORKFLOW_NAME }}
if: steps.versionCompare.outputs.SKIP != 'true'
uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2.28.0
with:
name: "${{ steps.version.outputs.NAME }}@${{ steps.version.outputs.VERSION }}"
path: main/${{ env.SERVICE_DIR }}
workflow: ${{ inputs.BUILD_WORKFLOW_NAME }}
workflow_conclusion: success
- name: Unzip Build Artifact
if: steps.versionCompare.outputs.SKIP != 'true'
working-directory: main/${{ env.SERVICE_DIR }}
run: |
unzip -q dist.zip
rm dist.zip
- name: Deploy Functions (${{ inputs.TWILIO_ACCOUNT_SID }})
if: steps.versionCompare.outputs.SKIP != 'true'
working-directory: main/${{ env.SERVICE_DIR }}
run: |
mkdir -p src/functions
deployOutput=$(npx twilio-run@3.5.3 deploy --production \
--username $TWILIO_API_KEY --password $TWILIO_API_SECRET --output-format json | jq '')
if [ "$?" != "0" ] || [ -z "$(echo "$deployOutput" | jq -r '.serviceSid // empty')" ]; then
echo "::error::Functions deployment has failed. Please check the run logs." >&2
echo "$deployOutput" >&2
exit 1
fi
echo "$deployOutput" >&2
echo "## Deployed Twilio Functions ${{ steps.version.outputs.NAME }}@${{ steps.version.outputs.VERSION }}" >> "$GITHUB_STEP_SUMMARY"
echo '```json' >> "$GITHUB_STEP_SUMMARY"
echo "$deployOutput" >> "$GITHUB_STEP_SUMMARY"
echo '```' >> "$GITHUB_STEP_SUMMARY"
env:
TWILIO_API_KEY: ${{ inputs.TWILIO_API_KEY }}
TWILIO_API_SECRET: ${{ secrets.TWILIO_API_SECRET }}