netlify:
image: node:12.10.0-alpine
stage: deploy
before_script:
- apk add --no-cache jq curl
- npm i -g netlify-cli
script:
- npm run build
# Deploy site to netlify
- NETLIFY_DEPLOY_OUTPUT=$(netlify deploy --json)
# Get site url
- NETLIFY_DEPLOY_URL=$(echo $NETLIFY_DEPLOY_OUTPUT | jq -r ".deploy_url")
# Set common api variables
- AUTH_HEADER="Private-Token:"" "$PRIVATE_TOKEN
- BASE_URL="https://gitlab.com/api/v4"
# Get current environment id
- ENDPOINT_LIST_ENVIRONMENTS="$BASE_URL/projects/$CI_PROJECT_ID/environments"
- ENVIRONMENTS=$(curl "$ENDPOINT_LIST_ENVIRONMENTS" -H "$AUTH_HEADER")
- CI_ENVIRONMENT_ID=$(echo $ENVIRONMENTS | jq -r '.[] | select(.name | contains("'$CI_ENVIRONMENT_NAME'")) | .id')
# Update environment url
- ENDPOINT_UPDATE_ENVIRONMENT="$BASE_URL/projects/$CI_PROJECT_ID/environments/$CI_ENVIRONMENT_ID"
- curl -X PUT "$ENDPOINT_UPDATE_ENVIRONMENT" -H "$AUTH_HEADER" --data "external_url=$NETLIFY_DEPLOY_URL"
# Get merge request id
- ENDPOINT_LIST_MR="$BASE_URL/projects/$CI_PROJECT_ID/merge_requests"
- MERGE_REQUESTS=$(curl "$ENDPOINT_LIST_MR" -H "$AUTH_HEADER")
- CI_MERGE_REQUEST_IID=$(echo $MERGE_REQUESTS | jq -r '.[] | select(.source_branch | contains("'$CI_BUILD_REF_NAME'")) | select(.state | contains("open")) | .iid')
# Create merge request note
- ENDPOINT_CREATE_MR_NOTE="$BASE_URL/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID/notes"
- NOTE_BODY="Deployed the commit $CI_COMMIT_SHORT_SHA to $NETLIFY_DEPLOY_URL"
- curl -X POST "$ENDPOINT_CREATE_MR_NOTE" -H "$AUTH_HEADER" --data "body=$NOTE_BODY"
environment:
name: review/$CI_BUILD_REF_NAME
only:
- branches
except:
- master
start_review:
image: ruby:2.6.5-alpine3.10
stage: review
before_script:
- apk add --no-cache curl jq git
- gem install dpl --no-doc
script:
# Set review app name
- CI_COMMIT_REF_SLUG_FIX=$(echo $CI_COMMIT_REF_SLUG | sed 's/-//g')
- REVIEW_APP_NAME=$(echo "$CI_PROJECT_NAME-$CI_COMMIT_REF_SLUG_FIX" | cut -c 1-30)
# Create review app
- PAYLOAD='{"name":"'"$REVIEW_APP_NAME"'","region":"us","stack":"heroku-18"}'
- HEROKU_HEADER="accept:"" ""application/vnd.heroku+json; version=3"
- JSON_HEADER="content-type:"" ""application/json"
- HEROKU_AUTH_HEADER="authorization:"" Bearer "$HEROKU_API_KEY
- |
curl -n -X POST https://api.heroku.com/apps \
-d "$PAYLOAD" \
-H "$HEROKU_HEADER" \
-H "$HEROKU_AUTH_HEADER" \
-H "$JSON_HEADER"
# Get config vars from production app
- ENDPOINT_LIST_CONFIG_VARS="https://api.heroku.com/apps/cummins-backend/config-vars"
- PAYLOAD=$(curl "$ENDPOINT_LIST_CONFIG_VARS" -H "$HEROKU_HEADER" -H "$HEROKU_AUTH_HEADER" -H "$JSON_HEADER")
# Set config vars to review app
- |
curl -X PATCH https://api.heroku.com/apps/$REVIEW_APP_NAME/config-vars \
-d "$PAYLOAD" \
-H "$HEROKU_HEADER" \
-H "$HEROKU_AUTH_HEADER" \
-H "$JSON_HEADER"
# Deploy review app
- dpl --provider=heroku --app=$REVIEW_APP_NAME --api-key=$HEROKU_API_KEY
# Set review app url
- REVIEW_APP_URL="https://$REVIEW_APP_NAME.herokuapp.com"
# Set common gitlab api variables
- AUTH_HEADER="Private-Token:"" "$GITLAB_HEROKU_API_KEY
- BASE_URL="https://gitlab.com/api/v4"
# Get current environment id
- ENDPOINT_LIST_ENVIRONMENTS="$BASE_URL/projects/$CI_PROJECT_ID/environments"
- ENVIRONMENTS=$(curl "$ENDPOINT_LIST_ENVIRONMENTS" -H "$AUTH_HEADER")
- CI_ENVIRONMENT_ID=$(echo $ENVIRONMENTS | jq -r '.[] | select(.name | contains("'$CI_ENVIRONMENT_NAME'")) | .id')
# Update environment url
- ENDPOINT_UPDATE_ENVIRONMENT="$BASE_URL/projects/$CI_PROJECT_ID/environments/$CI_ENVIRONMENT_ID"
- curl -X PUT "$ENDPOINT_UPDATE_ENVIRONMENT" -H "$AUTH_HEADER" --data "external_url=$REVIEW_APP_URL"
# Get merge request id
- ENDPOINT_LIST_MR="$BASE_URL/projects/$CI_PROJECT_ID/merge_requests"
- MERGE_REQUESTS=$(curl "$ENDPOINT_LIST_MR" -H "$AUTH_HEADER")
- CI_MERGE_REQUEST_IID=$(echo $MERGE_REQUESTS | jq -r '.[] | select(.source_branch | contains("'$CI_BUILD_REF_NAME'")) | select(.state | contains("open")) | .iid')
# Create merge request note
- ENDPOINT_CREATE_MR_NOTE="$BASE_URL/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID/notes"
- NOTE_BODY="Deployed the commit $CI_COMMIT_SHORT_SHA to $REVIEW_APP_URL"
- curl -X POST "$ENDPOINT_CREATE_MR_NOTE" -H "$AUTH_HEADER" --data "body=$NOTE_BODY"
environment:
name: review/$CI_BUILD_REF_NAME
on_stop: stop_review
only:
- branches
except:
- master
stop_review:
image: alpine:3.10.2
stage: review
variables:
GIT_STRATEGY: none
before_script:
- apk add --no-cache curl
script:
# Set review app name
- CI_COMMIT_REF_SLUG_FIX=$(echo $CI_COMMIT_REF_SLUG | sed 's/-//g')
- REVIEW_APP_NAME=$(echo "$CI_PROJECT_NAME-$CI_COMMIT_REF_SLUG_FIX" | cut -c 1-30)
# Delete heroku review app
- |
curl -X DELETE https://api.heroku.com/apps/$REVIEW_APP_NAME \
-H "Content-Type: application/json" \
-H "Accept: application/vnd.heroku+json; version=3" \
-H "Authorization: Bearer $HEROKU_API_KEY"
when: manual
environment:
name: review/$CI_BUILD_REF_NAME
action: stop
only:
- branches
except:
- master