-
Notifications
You must be signed in to change notification settings - Fork 0
192 lines (165 loc) · 6.76 KB
/
opentofu-template.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
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
183
184
185
186
187
188
189
190
191
192
name: Déploiement Terraform
# Le déploiement s'éxecute en 4 temps :
# - un "plan" sur la recette lors d'un push sur une pull_request
# - un "apply" lors du push sur main (hors commit de release)
# - un "plan" sur la production lors d'un push sur une pull_request de release (startsWith(github.head_ref, 'release-please--'))
# - un "apply" lors du push sur main avec un commit de release (github.event.type == 'PushEvent')
on:
workflow_call:
inputs:
lint:
default: true
type: boolean
validate:
default: true
type: boolean
plan:
default: true
type: boolean
apply:
default: false
type: boolean
environnement_name:
required: true
type: string
environnement_url:
required: true
type: string
env_vars_file_path:
required: false
type: string
default: ".env.scalingo"
jobs:
terraform:
name: Terraform
runs-on: ubuntu-latest
environment:
name: ${{ inputs.environnement_name }}
url: ${{ inputs.environnement_url }}
steps:
- name: Télécharger le code source
uses: actions/checkout@v4
- name: Installation de OpenTofu
uses: opentofu/[email protected]
with:
tofu_version: "1.7.2"
- name: Exposer tous les secrets comme des variables d'environnement
if: ${{ (inputs.validate == true) || (inputs.plan == true) || (inputs.apply == true) }}
uses: Firenza/[email protected]
with:
secrets: ${{ toJSON(secrets) }}
env_var_name_lower_case_regex: (?<=TF_VAR_).*
- name: Exposer toutes les variables comme des variables d'environnement
if: ${{ (inputs.validate == true) || (inputs.plan == true) || (inputs.apply == true) }}
uses: Firenza/[email protected]
with:
secrets: ${{ toJSON(vars) }}
env_var_name_lower_case_regex: (?<=TF_VAR_).*
- uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Ecrire les variables d'environnement dans un fichier .env
if: ${{ (inputs.plan == true) || (inputs.apply == true) }}
run: |
npm install -g envsub
envsub --syntax dollar-curly --protect ${ENV_VARS_FILE_PATH} .env
env:
ENV_VARS_FILE_PATH: ${{ inputs.env_vars_file_path }}
- name: Vérifier que toutes les variables d'environnement sont définies
run: |
NUMBER=0
ENV_FILE=".env"
REGEX='^([a-zA-Z_]+[a-zA-Z0-9_]*)=\$\{(.*)\}$'
while read line
do
if [[ "$line" =~ $REGEX ]]; then
echo "ERROR: value is missing for the env ${BASH_REMATCH[2]}"
((NUMBER++))
fi
done < "$ENV_FILE"
if [[ $NUMBER -gt 0 ]]; then
echo "Il y a $NUMBER variables d'environnement non définies, nous ne pouvons pas continuer le déploiement"
exit 1
fi
- name: Vérifier le format et le style du code Terraform
if: ${{ inputs.lint == true }}
id: fmt
run: tofu fmt -check -diff -recursive ./terraform
continue-on-error: true
- name: Terraform Init
if: ${{ (inputs.validate == true) || (inputs.plan == true) || (inputs.apply == true) }}
id: init
working-directory: terraform
run: tofu init -input=false
- name: Terraform Validate
if: ${{ inputs.validate == true }}
id: validate
working-directory: terraform
run: tofu validate -no-color
- name: Terraform Plan
if: ${{ inputs.plan == true }}
id: plan
working-directory: terraform
run: tofu plan -detailed-exitcode -input=false -no-color
env:
TF_VAR_fichier_env_secret: "../.env"
continue-on-error: true
- name: Ajouter un commentaire avec le résultat de terraform plan
if: ${{ (github.event_name == 'pull_request') && (steps.plan.outputs.exitcode == '2') }}
uses: actions/github-script@v7
env:
PLAN: "terraform\n${{ steps.plan.outputs.stdout }}"
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
// 1. Retrieve existing bot comments for the PR
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
})
const botComment = comments.find(comment => {
return comment.user.type === 'Bot' && comment.body.includes('Simulation des changements d\'infrastruture Terraform sur ${{ inputs.environnement_name }}')
})
// 2. Prepare format of the comment
const output = `### Simulation des changements d'infrastruture Terraform sur ${{ inputs.environnement_name }}
#### Format et Style du code Terraform 🖌 : ${{ (steps.fmt.outcome == 'success') && '✅' || '❌' }}
#### Validation de la configuration de Terraform (\`validate\`) 🤖 : ${{ (steps.validate.outcome == 'success') && '✅' || '❌' }}
<details><summary>Montrer le résultat de la validation</summary>
\`\`\`\n
${{ steps.validate.outputs.stdout }}
\`\`\`
</details>
#### Terraform Plan 📖 : ${{ (steps.plan.outputs.exitcode == '2') && '✅' || '❌' }}
<details><summary>Montrer les modifications prévues par Terraform</summary>
\`\`\`\n
${process.env.PLAN}
\`\`\`
</details>
Pour appliquer les changements proposés par ce plan :
- en recette : il suffit de merger cette PR
- en production : il faut merger la PR de release (créée par release-please)
*Environnement: \`${{ inputs.environnement_name }}\`, Auteur: @${{ github.actor }}, Répertoire: \`./terraform\`*`;
// 3. If we have a comment, update it, otherwise create a new one
if (botComment) {
github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: botComment.id,
body: output
})
} else {
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: output
})
}
- name: Deploiement réel des changements
if: ${{ inputs.apply == true }}
id: apply
working-directory: terraform
run: tofu apply -input=false -no-color -auto-approve
env:
TF_VAR_fichier_env_secret: "../.env"