forked from specklesystems/speckle-server
-
Notifications
You must be signed in to change notification settings - Fork 2
145 lines (130 loc) · 5.41 KB
/
push-docker-image.yml
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
name: AWS Deploy
on:
workflow_dispatch:
inputs:
isStagingDeployment:
description: 'Whether this is a staging env deployment'
type: boolean
default: true
push:
branches:
- main
jobs:
matrix_prep:
name: Generate matrix
runs-on: ubuntu-latest
outputs:
environment: ${{ steps.set-matrix.outputs.MATRIX_ENV }}
include: ${{ steps.set-matrix.outputs.MATRIX_INCLUDE }}
steps:
- uses: actions/checkout@v2
- id: set-matrix
run: |
if [[ ${{ github.event.inputs.isStagingDeployment == 'true' }} == true ]]; then
echo 'MATRIX_ENV<<EOF' >> $GITHUB_OUTPUT
cat .github/workflows/matrix_environment_staging.json >> $GITHUB_OUTPUT
echo 'EOF' >> $GITHUB_OUTPUT
echo 'MATRIX_INCLUDE<<EOF' >> $GITHUB_OUTPUT
cat .github/workflows/matrix_include_staging.json >> $GITHUB_OUTPUT
echo 'EOF' >> $GITHUB_OUTPUT
else
echo 'MATRIX_ENV<<EOF' >> $GITHUB_OUTPUT
cat .github/workflows/matrix_environment.json >> $GITHUB_OUTPUT
echo 'EOF' >> $GITHUB_OUTPUT
echo 'MATRIX_INCLUDE<<EOF' >> $GITHUB_OUTPUT
cat .github/workflows/matrix_include.json >> $GITHUB_OUTPUT
echo 'EOF' >> $GITHUB_OUTPUT
fi
buildDockerImage:
needs: [matrix_prep]
name: Build Docker Image
runs-on: ubuntu-latest
strategy:
matrix:
package: ['server','frontend', 'preview-service','webhook-service', 'fileimport-service']
include: ${{ fromJSON(needs.matrix_prep.outputs.include) }}
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Build Docker Image
run: |
DOCKER_BUILDKIT=1 docker build --secret id=posthog_api_key,env=POSTHOG_API_KEY -build-arg DISABLE_POSTHOG_TRACKING=${{ matrix.disablePosthogTracking }} -build-arg SPECKLE_SERVER_VERSION=v${GITHUB_SHA::7} -t ${{ matrix.package }}:latest -f packages/${{ matrix.package }}/Dockerfile .
docker save ${{ matrix.package }}:latest -o ${{ matrix.package }}.tar
echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
env:
POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
- name: Upload Build Assets
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.package }}
path: ${{ matrix.package }}.tar
mime-type: application/octet-stream
deploy:
needs: [buildDockerImage, matrix_prep]
name: Deploy to ${{ matrix.environment }} for ${{ matrix.package }}
runs-on: ubuntu-latest
environment:
name: ${{ matrix.environment }}
url: ${{ matrix.url }}
strategy:
matrix:
environment: ${{ fromJson(needs.matrix_prep.outputs.environment) }}
package:
[
'server',
'frontend',
'preview-service',
'webhook-service',
'fileimport-service'
]
include: ${{ fromJSON(needs.matrix_prep.outputs.include) }}
steps:
# Download the Docker image tar
- name: Download Build Artifacts
uses: actions/download-artifact@v2
with:
name: ${{ matrix.package }}
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets[matrix.accessKey] }}
aws-secret-access-key: ${{ secrets[matrix.secretAccessKey] }}
aws-region: ${{ matrix.region }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Download task definition
run: |
aws ecs describe-task-definition --task-definition specklev2-${{ matrix.package }}-${{ matrix.environment }} --query taskDefinition > task-definition.json
- name: Load Docker Image and push to AWS
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: ${{ matrix.cxName }}
IMAGE_TAG: v${{ github.sha }}
id: build-image
run: |
docker load -i ${{ matrix.package }}.tar
docker tag ${{ matrix.package }}:latest $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
docker tag ${{ matrix.package }}:latest $ECR_REGISTRY/$ECR_REPOSITORY:latest
docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
- name: Fill in the new image ID in the Amazon ECS task definition
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: task-definition.json
container-name: specklev2-${{ matrix.package }}-${{ matrix.environment }}
image: ${{ steps.build-image.outputs.image }}
- name: Deploy Amazon ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: ${{ steps.task-def.outputs.task-definition }}
service: ${{ matrix.serviceName }}-${{ matrix.environment }}
cluster: specklev2-server-${{ matrix.environment }}
wait-for-service-stability: true
wait-for-minutes: 25
- name: Download logs if Deploy Failed
if: failure()
run: |
aws logs tail /ecs/specklev2/${{ matrix.serviceName }}/${{ matrix.environment }}