Skip to content

Commit 073eb52

Browse files
authored
Merge pull request #2438 from peter-jozsa/allow-to-config-terraform-state
Allow to configure Terraform State
2 parents 371f087 + 950bb3d commit 073eb52

File tree

4 files changed

+145
-18
lines changed

4 files changed

+145
-18
lines changed

README.md

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1132,7 +1132,7 @@ AWS Endpoint like `http://127.0.0.1:9000`. Defaults to `$AWS_ENDPOINT`
11321132

11331133
##### `GITLAB_LFS_OBJECT_STORE_CONNECTION_AWS_PATH_STYLE`
11341134

1135-
Changes AWS Path Style to 'host/bucket_name/object' instead of 'bucket_name.host/object'. Defaults to `AWS_PATH_STYLE`
1135+
Changes AWS Path Style to 'host/bucket_name/object' instead of 'bucket_name.host/object'. Defaults to `$AWS_PATH_STYLE`
11361136

11371137
##### `GITLAB_LFS_OBJECT_STORE_CONNECTION_AWS_SIGNATURE_VERSION`
11381138

@@ -1218,6 +1218,62 @@ Google service account. Defaults to `$GITLAB_OBJECT_STORE_CONNECTION_GOOGLE_CLIE
12181218

12191219
Default Google key file. Defaults to `$GITLAB_OBJECT_STORE_CONNECTION_GOOGLE_JSON_KEY_LOCATION` (`/gcs/key.json`)
12201220

1221+
##### `GITLAB_TERRAFORM_STATE_ENABLED`
1222+
1223+
Enable/Disable Terraform State support. Defaults to `true`.
1224+
1225+
##### `GITLAB_TERRAFORM_STATE_STORAGE_PATH`
1226+
1227+
Directory to store the terraform state data. Defaults to `$GITLAB_SHARED_DIR/terraform_state`
1228+
1229+
##### `GITLAB_TERRAFORM_STATE_OBJECT_STORE_ENABLED`
1230+
1231+
Enables Object Store for Terraform state that will be remote stored. Defaults to `false`
1232+
1233+
##### `GITLAB_TERRAFORM_STATE_OBJECT_STORE_REMOTE_DIRECTORY`
1234+
1235+
Bucket name to store the Terraform state. Defaults to `terraform_state`
1236+
1237+
##### `GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_PROVIDER`
1238+
1239+
Connection Provider for the Object Store (AWS or Google). Defaults to $GITLAB_OBJECT_STORE_CONNECTION_PROVIDER (i.e. AWS).
1240+
1241+
##### `GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_ACCESS_KEY_ID`
1242+
1243+
AWS Access Key ID for the Bucket. Defaults to `$AWS_ACCESS_KEY_ID`
1244+
1245+
##### `GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_SECRET_ACCESS_KEY`
1246+
1247+
AWS Secret Access Key. Defaults to `$AWS_SECRET_ACCESS_KEY`
1248+
1249+
##### `GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_REGION`
1250+
1251+
AWS Region. Defaults to `$AWS_REGION`
1252+
1253+
##### `GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_HOST`
1254+
1255+
Configure this for an compatible AWS host like minio. Defaults to `$AWS_HOST`
1256+
1257+
##### `GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_ENDPOINT`
1258+
1259+
AWS Endpoint like `http://127.0.0.1:9000`. Defaults to `$AWS_ENDPOINT`
1260+
1261+
##### `GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_PATH_STYLE`
1262+
1263+
Changes AWS Path Style to 'host/bucket_name/object' instead of 'bucket_name.host/object'. Defaults to `AWS_PATH_STYLE`
1264+
1265+
##### `GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_PROJECT`
1266+
1267+
Google project. Defaults to `$GITLAB_OBJECT_STORE_CONNECTION_GOOGLE_PROJECT`
1268+
1269+
##### `GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_CLIENT_EMAIL`
1270+
1271+
Google service account. Defaults to `$GITLAB_OBJECT_STORE_CONNECTION_GOOGLE_CLIENT_EMAIL`
1272+
1273+
##### `GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_JSON_KEY_LOCATION`
1274+
1275+
Default Google key file. Defaults to `$GITLAB_OBJECT_STORE_CONNECTION_GOOGLE_JSON_KEY_LOCATION` (`/gcs/key.json`)
1276+
12211277
##### `GITLAB_UPLOADS_STORAGE_PATH`
12221278

12231279
The location where uploads objects are stored. Defaults to `$GITLAB_SHARED_DIR/public`.

assets/runtime/config/gitlabhq/gitlab.yml

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -371,21 +371,28 @@ production: &base
371371

372372
## Terraform state
373373
terraform_state:
374-
enabled: true
374+
enabled: {{GITLAB_TERRAFORM_STATE_ENABLED}}
375375
# The location where Terraform state files are stored (default: shared/terraform_state).
376-
# storage_path: shared/terraform_state
376+
storage_path: {{GITLAB_TERRAFORM_STATE_STORAGE_PATH}}
377377
object_store:
378-
enabled: false
379-
remote_directory: terraform_state # The bucket name
378+
enabled: {{GITLAB_TERRAFORM_STATE_OBJECT_STORE_ENABLED}}
379+
remote_directory: {{GITLAB_TERRAFORM_STATE_OBJECT_STORE_REMOTE_DIRECTORY}} # The bucket name
380380
connection:
381-
provider: AWS
382-
aws_access_key_id: AWS_ACCESS_KEY_ID
383-
aws_secret_access_key: AWS_SECRET_ACCESS_KEY
384-
region: us-east-1
385-
# host: 'localhost' # default: s3.amazonaws.com
386-
# endpoint: 'http://127.0.0.1:9000' # default: nil
387-
# aws_signature_version: 4 # For creation of signed URLs. Set to 2 if provider does not support v4.
388-
# path_style: true # Use 'host/bucket_name/object' instead of 'bucket_name.host/object'
381+
provider: {{GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_PROVIDER}}
382+
#start-terraform_state-aws
383+
aws_access_key_id: {{GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_ACCESS_KEY_ID}}
384+
aws_secret_access_key: {{GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_SECRET_ACCESS_KEY}}
385+
region: {{GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_REGION}}
386+
host: '{{GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_HOST}}' # default: s3.amazonaws.com
387+
endpoint: '{{GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_ENDPOINT}}' # default: nil
388+
aws_signature_version: {{GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_SIGNATURE_VERSION}} # For creation of signed URLs. Set to 2 if provider does not support v4.
389+
path_style: {{GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_PATH_STYLE}} # Use 'host/bucket_name/object' instead of 'bucket_name.host/object'
390+
#end-terraform_state-aws
391+
#start-terraform_state-gcs
392+
google_project: {{GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_PROJECT}}
393+
google_client_email: {{GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_CLIENT_EMAIL}}
394+
google_json_key_location: {{GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_JSON_KEY_LOCATION}}
395+
#end-terraform_state-gcs
389396

390397
## GitLab Pages
391398
pages:

assets/runtime/env-defaults

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,28 @@ GITLAB_PACKAGES_OBJECT_STORE_CONNECTION_GOOGLE_PROJECT=${GITLAB_PACKAGES_OBJECT_
171171
GITLAB_PACKAGES_OBJECT_STORE_CONNECTION_GOOGLE_CLIENT_EMAIL=${GITLAB_PACKAGES_OBJECT_STORE_CONNECTION_GOOGLE_CLIENT_EMAIL:-$GITLAB_OBJECT_STORE_CONNECTION_GOOGLE_CLIENT_EMAIL}
172172
GITLAB_PACKAGES_OBJECT_STORE_CONNECTION_GOOGLE_JSON_KEY_LOCATION=${GITLAB_PACKAGES_OBJECT_STORE_CONNECTION_GOOGLE_JSON_KEY_LOCATION:-$GITLAB_OBJECT_STORE_CONNECTION_GOOGLE_JSON_KEY_LOCATION}
173173

174+
## TERRAFORM STATE
175+
GITLAB_TERRAFORM_STATE_ENABLED=${GITLAB_TERRAFORM_STATE_ENABLED:-true}
176+
GITLAB_TERRAFORM_STATE_STORAGE_PATH="${GITLAB_TERRAFORM_STATE_STORAGE_PATH:-$GITLAB_SHARED_DIR/terraform_state}"
177+
178+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_ENABLED=${GITLAB_TERRAFORM_STATE_OBJECT_STORE_ENABLED:-false}
179+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_REMOTE_DIRECTORY=${GITLAB_PACKAGES_OBJECT_STORE_REMOTE_DIRECTORY:-terraform_state}
180+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_PROVIDER=${GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_PROVIDER:-$GITLAB_OBJECT_STORE_CONNECTION_PROVIDER}
181+
182+
# TERRAFORM STATE:AWS
183+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_ACCESS_KEY_ID=${GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_ACCESS_KEY_ID:-$AWS_ACCESS_KEY_ID}
184+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_SECRET_ACCESS_KEY=${GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_SECRET_ACCESS_KEY:-$AWS_SECRET_ACCESS_KEY}
185+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_REGION=${GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_REGION:-$AWS_REGION}
186+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_HOST=${GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_HOST:-$AWS_HOST}
187+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_ENDPOINT=${GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_ENDPOINT:-$AWS_ENDPOINT}
188+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_PATH_STYLE=${GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_PATH_STYLE:-$AWS_PATH_STYLE}
189+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_SIGNATURE_VERSION=${GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_SIGNATURE_VERSION:-$AWS_SIGNATURE_VERSION}
190+
191+
# TERRAFORM STATE:Google
192+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_PROJECT=${GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_PROJECT:-$GITLAB_OBJECT_STORE_CONNECTION_GOOGLE_PROJECT}
193+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_CLIENT_EMAIL=${GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_CLIENT_EMAIL:-$GITLAB_OBJECT_STORE_CONNECTION_GOOGLE_CLIENT_EMAIL}
194+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_JSON_KEY_LOCATION=${GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_JSON_KEY_LOCATION:-$GITLAB_OBJECT_STORE_CONNECTION_GOOGLE_JSON_KEY_LOCATION}
195+
174196
## Cron Jobs
175197
GITLAB_PIPELINE_SCHEDULE_WORKER_CRON=${GITLAB_PIPELINE_SCHEDULE_WORKER_CRON:-"19 * * * *"}
176198

assets/runtime/functions

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,6 +1068,47 @@ gitlab_configure_packages() {
10681068
GITLAB_PACKAGES_DIR
10691069
}
10701070

1071+
gitlab_configure_terraform_state() {
1072+
if [[ ${GITLAB_TERRAFORM_STATE_OBJECT_STORE_ENABLED} == true ]]; then
1073+
echo "Configuring gitlab::terraform_state:object_store"
1074+
1075+
if [[ "${GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_PROVIDER}" == "Google" ]]; then
1076+
echo " -> Google TERRAFORM STATE provider selected removing aws config"
1077+
exec_as_git sed -i "/#start-terraform_state-aws/,/#end-terraform_state-aws/d" ${GITLAB_CONFIG}
1078+
exec_as_git sed -i "/#start-terraform_state-gcs/d" ${GITLAB_CONFIG}
1079+
exec_as_git sed -i "/#end-terraform_state-gcs/d" ${GITLAB_CONFIG}
1080+
fi
1081+
if [[ "${GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_PROVIDER}" == "AWS" ]]; then
1082+
echo " -> AWS TERRAFORM STATE provider selected removing Google config"
1083+
exec_as_git sed -i "/#start-terraform_state-gcs/,/#end-terraform_state-gcs/d" ${GITLAB_CONFIG}
1084+
exec_as_git sed -i "/#start-terraform_state-aws/d" ${GITLAB_CONFIG}
1085+
exec_as_git sed -i "/#end-terraform_state-aws/d" ${GITLAB_CONFIG}
1086+
fi
1087+
1088+
update_template ${GITLAB_CONFIG} \
1089+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_ENABLED \
1090+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_REMOTE_DIRECTORY \
1091+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_PROVIDER \
1092+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_ACCESS_KEY_ID \
1093+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_SECRET_ACCESS_KEY \
1094+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_REGION \
1095+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_HOST \
1096+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_ENDPOINT \
1097+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_PATH_STYLE \
1098+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_AWS_SIGNATURE_VERSION \
1099+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_PROJECT \
1100+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_CLIENT_EMAIL \
1101+
GITLAB_TERRAFORM_STATE_OBJECT_STORE_CONNECTION_GOOGLE_JSON_KEY_LOCATION
1102+
else
1103+
exec_as_git sed -i -e "/storage_path: {{GITLAB_TERRAFORM_STATE_STORAGE_PATH}}/{n;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;d;}" ${GITLAB_CONFIG}
1104+
fi
1105+
1106+
echo "Configuring gitlab::terraform_state..."
1107+
update_template ${GITLAB_CONFIG} \
1108+
GITLAB_TERRAFORM_STATE_ENABLED \
1109+
GITLAB_TERRAFORM_STATE_STORAGE_PATH
1110+
}
1111+
10711112
gitlab_configure_lfs() {
10721113
if [[ ${GITLAB_LFS_OBJECT_STORE_ENABLED} == true ]]; then
10731114
echo "Configuring gitlab::lfs:object_store"
@@ -1503,11 +1544,11 @@ initialize_datadir() {
15031544
chown ${GITLAB_USER}: ${GITLAB_LFS_OBJECTS_DIR}
15041545

15051546
# create terraform_state directory
1506-
# TODO : parametarize path and replace with it (e.g. GITLAB_TERRAFORM_STATE_STORAGE_PATH) - see sameersbn/gitlab#2438
1507-
# TODO : wrap with "if [[ _ENABLED == true ]]" condition
1508-
mkdir -p ${GITLAB_SHARED_DIR}/terraform_state
1509-
chmod u+rwX ${GITLAB_SHARED_DIR}/terraform_state
1510-
chown ${GITLAB_USER}: ${GITLAB_SHARED_DIR}/terraform_state
1547+
if [[ ${GITLAB_TERRAFORM_STATE_ENABLED} == true ]]; then
1548+
mkdir -p ${GITLAB_TERRAFORM_STATE_STORAGE_PATH}
1549+
chmod u+rwX ${GITLAB_TERRAFORM_STATE_STORAGE_PATH}
1550+
chown ${GITLAB_USER}: ${GITLAB_TERRAFORM_STATE_STORAGE_PATH}
1551+
fi
15111552

15121553
# create registry dir
15131554
if [[ ${GITLAB_REGISTRY_ENABLED} == true ]]; then
@@ -1801,6 +1842,7 @@ configure_gitlab() {
18011842
gitlab_configure_ci
18021843
gitlab_configure_artifacts
18031844
gitlab_configure_packages
1845+
gitlab_configure_terraform_state
18041846
gitlab_configure_lfs
18051847
gitlab_configure_uploads
18061848
gitlab_configure_mattermost

0 commit comments

Comments
 (0)