-
-
Save pjcdawkins/0b3f7a6da963c129030961f0947746c4 to your computer and use it in GitHub Desktop.
stages: | |
- review | |
- cleanup | |
variables: | |
# The Platform.sh project ID. | |
PF_PROJECT_ID: abcdefg123456 | |
push-platformsh: | |
# This Docker image installs the Platform.sh CLI (and PHP, Git and SSH). | |
# An environment variable PLATFORMSH_CLI_TOKEN (containing an API token) is | |
# the recommended way to authenticate for the CLI. | |
image: pjcdawkins/platformsh-cli | |
stage: review | |
script: | |
# Install an SSH key pair set via GitLab CI environment variables | |
# (SSH_KEY, SSH_KEY_PUB, and SSH_KNOWN_HOSTS). | |
- 'bash setup-ssh.sh' | |
# Push the branch to a Platform.sh Standard environment. | |
- 'bash push-platform.sh' | |
artifacts: | |
reports: | |
dotenv: environment.env | |
environment: | |
name: review/$CI_COMMIT_REF_SLUG | |
# The PRIMARY_URL is set by the push-platform.sh script and the "dotenv" artifact. | |
url: $PRIMARY_URL | |
on_stop: delete-platformsh | |
only: | |
- branches | |
except: | |
# This excludes the master branch from attempted pushes, on the | |
# assumption that one might want to make master pushes manually. | |
- master | |
delete-platformsh: | |
stage: cleanup | |
image: pjcdawkins/platformsh-cli | |
script: | |
- 'bash delete-platform.sh' | |
when: manual | |
environment: | |
name: review/$CI_COMMIT_REF_SLUG | |
action: stop | |
only: | |
- branches | |
except: | |
- master |
#!/usr/bin/env bash | |
set -e | |
# Config. | |
if [ -z "$PF_PROJECT_ID" ]; then | |
echo "PF_PROJECT_ID is required" | |
exit 1 | |
fi | |
PF_BRANCH=${PF_DEST_BRANCH:-$CI_COMMIT_REF_SLUG} | |
if [ -z "$PF_BRANCH" ]; then | |
echo "Branch name (CI_COMMIT_REF_SLUG or PF_DEST_BRANCH) not defined." | |
exit 1 | |
fi | |
# Delete the specified branch. | |
platform environment:delete --yes --no-wait --project="$PF_PROJECT_ID" --environment="$PF_BRANCH" | |
# Clean up inactive environments. | |
platform environment:delete --project="$PF_PROJECT_ID" --inactive --exclude=master --yes --delete-branch --no-wait || true |
#!/usr/bin/env bash | |
set -e | |
# Push Gitlab branches to Platform.sh environments. | |
# ------------------------------------------------- | |
# | |
# This script can be configured by specifying environment variables in your | |
# repository settings or in the .gitlab-ci.yml file: | |
# | |
# variables: | |
# | |
# # The project ID (required). | |
# PF_PROJECT_ID: abcdefg123456 | |
# | |
# # The parent environment of new branches. | |
# PF_PARENT_ENV: master | |
# Config. | |
if [ -z "$PF_PROJECT_ID" ]; then | |
echo "PF_PROJECT_ID is required" | |
exit 1 | |
fi | |
PF_PARENT_ENV=${PF_PARENT_ENV:-master} | |
ALLOW_MASTER=${ALLOW_MASTER:-0} | |
export PLATFORMSH_CLI_NO_INTERACTION=1 | |
if [ -z "$CI_COMMIT_REF_SLUG" ]; then | |
echo "Source branch (CI_COMMIT_REF_SLUG) not defined." | |
exit 1 | |
fi | |
BRANCH=$CI_COMMIT_REF_SLUG | |
# This script is not for production deployments. | |
if [ "$BRANCH" = "master" ] && [ "$ALLOW_MASTER" != 1 ]; then | |
echo "Not pushing master branch." | |
exit | |
fi | |
# Set the project for further CLI commands. | |
platform project:set-remote "$PF_PROJECT_ID" | |
# Get a URL to the web UI for this environment, before pushing. | |
pf_ui=$(platform web --environment="$BRANCH" --pipe) | |
echo "" | |
echo "Web UI: ${pf_ui}" | |
echo "" | |
# Build the push command. | |
push_command="platform push --force --target=${BRANCH}" | |
if [ "$PF_PARENT_ENV" != "$BRANCH" ]; then | |
push_command="$push_command --activate --parent=${PF_PARENT_ENV}" | |
fi | |
# Run the push command. | |
$push_command | |
# Write the environment's primary URL to a dotenv file. | |
# This can be used by a GitLab job via the "dotenv" artifact type. | |
echo "PRIMARY_URL=$(platform url --primary --pipe --yes --environment=${BRANCH})" > environment.env | |
# Clean up already merged and inactive environments. | |
platform environment:delete --inactive --merged --environment="$PF_PARENT_ENV" --exclude=master --exclude=development --exclude="$BRANCH" --yes --delete-branch --no-wait || true |
#!/usr/bin/env bash | |
set -e | |
# Set up SSH credentials for pushing to external Git repositories, via GitLab CI | |
# environment variables. You should add this public key to a Platform user for | |
# the push to be successful. | |
if [ -n "$SSH_KEY" ]; then | |
mkdir -p $HOME/.ssh | |
echo "$SSH_KEY" > $HOME/.ssh/id_rsa | |
echo "$SSH_KEY_PUB" > $HOME/.ssh/id_rsa.pub | |
# Some vague semblance of security for the private key. | |
chmod go-r $HOME/.ssh/id_rsa | |
unset SSH_KEY | |
echo "Created SSH key: .ssh/id_rsa" | |
fi | |
# Set up SSH known hosts file. | |
if [ -n "$SSH_KNOWN_HOSTS" ]; then | |
mkdir -p $HOME/.ssh | |
echo "$SSH_KNOWN_HOSTS" > $HOME/.ssh/known_hosts | |
fi |
@pjcdawkins does your recent PR on Platform.sh CLI mean that using the CLI tool would make these workflow steps even easier?
@rvanlaak yes, see https://github.com/platformsh/platformsh-docs/pull/701/files (to be merged soon) - the new GitLab integration, now available on nearly any project, adds Platform.sh as an "external pipeline" to a GitLab repo
Thanks. By the way, one of my main problems in GitLab is using review apps/environments: we are not able to set the environment URL based on the result of a CI stage / script (the GitLab environment URLs can only include the ref name variable and maybe one or two other things, but are otherwise static). But Platform.sh environment URLs are very dynamic.
@pjcdawkins would it be possible to set the URL of the environment in the MR through the Gitlab API? I think this would work in theory, but I'm not sure how the setup of this would look like
Sadly I don't think GitLab provides that API.
GitLab allows the URL to contain variables (other than those defined in the script itself), so on most projects I've been using:
environment:
url: https://console.platform.sh/projects/$PF_PROJECT_ID/$CI_COMMIT_REF_SLUG
That will get you (via a redirect) to the Console page for that environment, and then you can access the other URLs.
I'll update the scripts above with that.
@pjcdawkins, thanks! that's actually a pretty nice solution since you can have more than 1 url, especially for multi-app projects.
As for the Gitlab API, I think it's possible (although not very pretty), as discussed here https://gitlab.com/gitlab-org/gitlab-foss/issues/27424
Ah, that issue was moved to https://gitlab.com/gitlab-org/gitlab/issues/17066 and it looks like they're willing to work on a simpler solution
That's now available in GitLab (since version 12.9), so I've updated the gist to set the environment URL dynamically.
Thanks for sharing this, I will test it tomorrow