Merge pull request #55 from gnosis/feature/test-autodeploy
Feature: AWS autodeploy with staging links per PR
This commit is contained in:
commit
d8b7d171c6
50
.travis.yml
50
.travis.yml
|
@ -1,13 +1,19 @@
|
||||||
|
if: (branch = development) OR (branch = master) OR (type = pull_request) OR (tag IS present)
|
||||||
language: node_js
|
language: node_js
|
||||||
node_js:
|
node_js:
|
||||||
- "8"
|
- "8"
|
||||||
os:
|
os:
|
||||||
- linux
|
- linux
|
||||||
|
before_install:
|
||||||
|
# Needed to deploy pull request and releases
|
||||||
|
- sudo apt-get -y install python-pip python-dev
|
||||||
|
- pip install awscli --upgrade --user
|
||||||
before_script:
|
before_script:
|
||||||
- yarn global add surge
|
# Used in the tests of the project
|
||||||
- export NODE_ENV=testing
|
- export NODE_ENV=testing
|
||||||
after_success:
|
after_success:
|
||||||
- |
|
- |
|
||||||
|
|
||||||
if [ ${TRAVIS_BRANCH} = "master" ]; then
|
if [ ${TRAVIS_BRANCH} = "master" ]; then
|
||||||
export NODE_ENV=production;
|
export NODE_ENV=production;
|
||||||
else
|
else
|
||||||
|
@ -15,6 +21,42 @@ after_success:
|
||||||
fi
|
fi
|
||||||
- yarn build-storybook
|
- yarn build-storybook
|
||||||
- yarn build
|
- yarn build
|
||||||
- cd build_webpack/ && cp index.html 200.html && cd ..
|
# Pull Request - Deploy it to a review environment
|
||||||
- chmod ugo+x ./config/deploy/deploy.sh
|
# Travis doesn't do deploy step with pull requests builds
|
||||||
- ./config/deploy/deploy.sh
|
- ./config/travis/deploy_pull_request.sh
|
||||||
|
# Releases (tagged commits) - Deploy it to a release environment
|
||||||
|
- ./config/travis/deploy_release.sh
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
# Development environment
|
||||||
|
- provider: s3
|
||||||
|
bucket: $DEV_BUCKET_NAME
|
||||||
|
access_key_id: $AWS_ACCESS_KEY_ID
|
||||||
|
secret_access_key: $AWS_SECRET_ACCESS_KEY
|
||||||
|
skip_cleanup: true
|
||||||
|
local_dir: build_webpack
|
||||||
|
upload-dir: app
|
||||||
|
on:
|
||||||
|
branch: development
|
||||||
|
|
||||||
|
# Development environment - Storybook
|
||||||
|
- provider: s3
|
||||||
|
bucket: $DEV_BUCKET_NAME
|
||||||
|
access_key_id: $AWS_ACCESS_KEY_ID
|
||||||
|
secret_access_key: $AWS_SECRET_ACCESS_KEY
|
||||||
|
skip_cleanup: true
|
||||||
|
local_dir: build_storybook
|
||||||
|
upload-dir: storybook
|
||||||
|
on:
|
||||||
|
branch: development
|
||||||
|
|
||||||
|
# Staging environment
|
||||||
|
- provider: s3
|
||||||
|
bucket: $STAGING_BUCKET_NAME
|
||||||
|
access_key_id: $AWS_ACCESS_KEY_ID
|
||||||
|
secret_access_key: $AWS_SECRET_ACCESS_KEY
|
||||||
|
skip_cleanup: true
|
||||||
|
local_dir: build_webpack
|
||||||
|
upload-dir: current
|
||||||
|
on:
|
||||||
|
branch: master
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
|
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
echo "Deployment script for gnosis-safe-team"
|
|
||||||
|
|
||||||
RANGE=500
|
|
||||||
|
|
||||||
number=$RANDOM
|
|
||||||
let "number %= $RANGE"
|
|
||||||
|
|
||||||
# Split on "/", ref: http://stackoverflow.com/a/5257398/689223
|
|
||||||
REPO_SLUG_ARRAY=(${TRAVIS_REPO_SLUG//\// })
|
|
||||||
REPO_OWNER=${REPO_SLUG_ARRAY[0]}
|
|
||||||
REPO_NAME=${REPO_SLUG_ARRAY[1]}
|
|
||||||
|
|
||||||
DEPLOY_PATH=./build_webpack
|
|
||||||
DEPLOY_PATH_STORYBOOK=./build_storybook
|
|
||||||
|
|
||||||
DEPLOY_SUBDOMAIN_UNFORMATTED_LIST=()
|
|
||||||
|
|
||||||
if [ "$TRAVIS_PULL_REQUEST" != "false" ]
|
|
||||||
then
|
|
||||||
if [ "$NODE_ENV" == "production" ]
|
|
||||||
then
|
|
||||||
DEPLOY_SUBDOMAIN_UNFORMATTED_LIST+=(release-${TRAVIS_PULL_REQUEST}-pr-${number})
|
|
||||||
else
|
|
||||||
DEPLOY_SUBDOMAIN_UNFORMATTED_LIST+=(staging-${TRAVIS_PULL_REQUEST}-pr-${number})
|
|
||||||
fi
|
|
||||||
elif [ -n "${TRAVIS_TAG// }" ] #TAG is not empty
|
|
||||||
then
|
|
||||||
if [ "$NODE_ENV" == "production" ]
|
|
||||||
then
|
|
||||||
|
|
||||||
#sorts the tags and picks the latest
|
|
||||||
#sort -V does not work on the travis machine
|
|
||||||
#sort -V ref: http://stackoverflow.com/a/14273595/689223
|
|
||||||
#sort -t ... ref: http://stackoverflow.com/a/4495368/689223
|
|
||||||
#reverse with sed ref: http://stackoverflow.com/a/744093/689223
|
|
||||||
#git tags | ignore release candidates | sort versions | reverse | pick first line
|
|
||||||
LATEST_TAG=`git tag | grep -v rc | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n | sed '1!G;h;$!d' | sed -n 1p`
|
|
||||||
echo $LATEST_TAG
|
|
||||||
|
|
||||||
if [ "$TRAVIS_TAG" == "$LATEST_TAG" ]
|
|
||||||
then
|
|
||||||
DEPLOY_SUBDOMAIN_UNFORMATTED_LIST+=(latest)
|
|
||||||
fi
|
|
||||||
|
|
||||||
DEPLOY_SUBDOMAIN_UNFORMATTED_LIST+=(${TRAVIS_TAG}-tag)
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
DEPLOY_SUBDOMAIN_UNFORMATTED_LIST+=(${TRAVIS_BRANCH}-branch)
|
|
||||||
fi
|
|
||||||
|
|
||||||
for DEPLOY_SUBDOMAIN_UNFORMATTED in "${DEPLOY_SUBDOMAIN_UNFORMATTED_LIST[@]}"
|
|
||||||
do
|
|
||||||
echo $DEPLOY_SUBDOMAIN_UNFORMATTED
|
|
||||||
|
|
||||||
# replaces non alphanumeric symbols with "-"
|
|
||||||
# sed -r is only supported in linux, ref http://stackoverflow.com/a/2871217/689223
|
|
||||||
# Domain names follow the RFC1123 spec [a-Z] [0-9] [-]
|
|
||||||
# The length is limited to 253 characters
|
|
||||||
# https://en.wikipedia.org/wiki/Domain_Name_System#Domain_name_syntax
|
|
||||||
DEPLOY_SUBDOMAIN=`echo "$DEPLOY_SUBDOMAIN_UNFORMATTED" | sed -r 's/[^A-Za-z0-9]+/\-/g'`
|
|
||||||
echo $DEPLOY_SUBDOMAIN
|
|
||||||
|
|
||||||
DEPLOY_DOMAIN=https://${DEPLOY_SUBDOMAIN}-${REPO_NAME}-${REPO_OWNER}.surge.sh
|
|
||||||
DEPLOY_STORYBOOK=https://storybook-${DEPLOY_SUBDOMAIN}-${REPO_NAME}-${REPO_OWNER}.surge.sh
|
|
||||||
|
|
||||||
surge --project ${DEPLOY_PATH} --domain $DEPLOY_DOMAIN;
|
|
||||||
surge --project ${DEPLOY_PATH_STORYBOOK} --domain $DEPLOY_STORYBOOK
|
|
||||||
|
|
||||||
if [ "$TRAVIS_PULL_REQUEST" != "false" ]
|
|
||||||
then
|
|
||||||
# Using the Issues api instead of the PR api
|
|
||||||
# Done so because every PR is an issue, and the issues api allows to post general comments,
|
|
||||||
# while the PR api requires that comments are made to specific files and specific commits
|
|
||||||
GITHUB_PR_COMMENTS=https://api.github.com/repos/${TRAVIS_REPO_SLUG}/issues/${TRAVIS_PULL_REQUEST}/comments
|
|
||||||
curl -H "Authorization: token ${GITHUB_API_TOKEN}" --request POST ${GITHUB_PR_COMMENTS} --data '{"body":"Travis automatic deployment:\r\n '${DEPLOY_DOMAIN}' \r\n \r\n Storybook book automatic deployment: \r\n '${DEPLOY_STORYBOOK}'"}'
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "Deploy domain: ${DEPLOY_DOMAIN}"
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function deploy_pull_request {
|
||||||
|
REVIEW_ENVIRONMENT_DOMAIN='review.gnosisdev.com'
|
||||||
|
|
||||||
|
# Pull request name with "pr" prefix
|
||||||
|
PULL_REQUEST_NAME="pr$TRAVIS_PULL_REQUEST"
|
||||||
|
|
||||||
|
# Feature name without all path. Example gnosis/pm-trading-ui -> pm-trading-ui
|
||||||
|
REPO_NAME=$(basename $TRAVIS_REPO_SLUG)
|
||||||
|
# Only alphanumeric characters. Example pm-trading-ui -> pmtradingui
|
||||||
|
REPO_NAME_ALPHANUMERIC=$(echo $REPO_NAME | sed 's/[^a-zA-Z0-9]//g')
|
||||||
|
|
||||||
|
# TRAVIS_PULL_REQUEST contains pull request number
|
||||||
|
REVIEW_FEATURE_FOLDER="$REPO_NAME_ALPHANUMERIC/$PULL_REQUEST_NAME"
|
||||||
|
# Specific for this project only
|
||||||
|
REVIEW_FEATURE_STORYBOOK_FOLDER="${REPO_NAME_ALPHANUMERIC}storybook/$PULL_REQUEST_NAME"
|
||||||
|
|
||||||
|
# Deploy safe-team project
|
||||||
|
aws s3 sync build_webpack s3://${REVIEW_BUCKET_NAME}/${REVIEW_FEATURE_FOLDER} --delete
|
||||||
|
# Deploy safe-team storybook project
|
||||||
|
aws s3 sync build_storybook s3://${REVIEW_BUCKET_NAME}/${REVIEW_FEATURE_STORYBOOK_FOLDER} --delete
|
||||||
|
}
|
||||||
|
|
||||||
|
function publish_pull_request_urls_in_github {
|
||||||
|
REVIEW_FEATURE_URL="https://$PULL_REQUEST_NAME--$REPO_NAME_ALPHANUMERIC.$REVIEW_ENVIRONMENT_DOMAIN"
|
||||||
|
# Specific for this project only
|
||||||
|
REVIEW_FEATURE_STORYBOOK_URL="https://$PULL_REQUEST_NAME--${REPO_NAME_ALPHANUMERIC}storybook.$REVIEW_ENVIRONMENT_DOMAIN"
|
||||||
|
|
||||||
|
# Using the Issues api instead of the PR api
|
||||||
|
# Done so because every PR is an issue, and the issues api allows to post general comments,
|
||||||
|
# while the PR api requires that comments are made to specific files and specific commits
|
||||||
|
GITHUB_PR_COMMENTS=https://api.github.com/repos/${TRAVIS_REPO_SLUG}/issues/${TRAVIS_PULL_REQUEST}/comments
|
||||||
|
curl -H "Authorization: token ${GITHUB_API_TOKEN}" --request POST ${GITHUB_PR_COMMENTS} --data '{"body":"Travis automatic deployment:\r\n '${REVIEW_FEATURE_URL}' \r\n \r\n Storybook book automatic deployment: \r\n '${REVIEW_FEATURE_STORYBOOK_URL}'"}'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Only:
|
||||||
|
# - Pull requests
|
||||||
|
# - Security env variables are available. PR from forks don't have them.
|
||||||
|
if [ "$TRAVIS_PULL_REQUEST" != "false" ] && [ -n "$AWS_ACCESS_KEY_ID" ]
|
||||||
|
then
|
||||||
|
deploy_pull_request
|
||||||
|
publish_pull_request_urls_in_github
|
||||||
|
fi
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Only:
|
||||||
|
# - Tagged commits
|
||||||
|
# - Security env variables are available.
|
||||||
|
if [ -n "$TRAVIS_TAG" ] && [ -n "$AWS_ACCESS_KEY_ID" ]
|
||||||
|
then
|
||||||
|
REVIEW_ENVIRONMENT_DOMAIN='review.gnosisdev.com'
|
||||||
|
|
||||||
|
# Feature name without all path. Example gnosis/pm-trading-ui -> pm-trading-ui
|
||||||
|
REPO_NAME=$(basename $TRAVIS_REPO_SLUG)
|
||||||
|
# Only alphanumeric characters. Example pm-trading-ui -> pmtradingui
|
||||||
|
REPO_NAME_ALPHANUMERIC=$(echo $REPO_NAME | sed 's/[^a-zA-Z0-9]//g')
|
||||||
|
|
||||||
|
# Only alphanumeric characters. Example v1.0.0 -> v100
|
||||||
|
TRAVIS_TAG_ALPHANUMERIC=$(echo $TRAVIS_TAG | sed 's/[^a-zA-Z0-9]//g')
|
||||||
|
|
||||||
|
REVIEW_RELEASE_FOLDER="$REPO_NAME_ALPHANUMERIC/$TRAVIS_TAG_ALPHANUMERIC"
|
||||||
|
|
||||||
|
# Deploy safe-team release project
|
||||||
|
aws s3 sync build_webpack s3://${REVIEW_BUCKET_NAME}/${REVIEW_RELEASE_FOLDER} --delete
|
||||||
|
fi
|
Loading…
Reference in New Issue