Skip to content

Instantly share code, notes, and snippets.

@LucasCalazans
Last active August 2, 2019 16:32
Show Gist options
  • Save LucasCalazans/0b00bf750d5dae65c958bd2ea031d821 to your computer and use it in GitHub Desktop.
Save LucasCalazans/0b00bf750d5dae65c958bd2ea031d821 to your computer and use it in GitHub Desktop.
Create a Magento 2 Project based on Magento Cloud repository
#!/usr/bin/env bash
#####################################################
# #
# SYSTEM VALIDATION #
# #
#####################################################
#####################################################
# vm.max_map_count #
#####################################################
MAX_MAP_COUNT_VALUE=$(sysctl -n vm.max_map_count);
MAX_MAP_COUNT_LIMIT=262144;
if [[ "$MAX_MAP_COUNT_VALUE" -lt "$MAX_MAP_COUNT_LIMIT" ]]
then
echo "[ERROR] vm.max_map_count Should be at least ${MAX_MAP_COUNT_LIMIT}. Execute the following command (Linux users):";
printf "\n sysctl -w vm.max_map_count=262144\n\n"
exit;
fi
#####################################################
# docker #
#####################################################
if ! [ -x "$(command -v docker)" ]; then
echo "[ERROR]: docker is not installed.";
echo "Check installation instructions on: https://docs.docker.com/install";
exit;
fi
#####################################################
# docker-compose #
#####################################################
if ! [ -x "$(command -v docker-compose)" ]; then
echo "[ERROR]: docker-compose is not installed.";
echo "Check installation instructions on: https://docs.docker.com/compose/install";
exit;
fi
#####################################################
# docker-sync #
#####################################################
if ! [ -x "$(command -v docker-sync)" ]; then
echo "[ERROR]: docker-sync is not installed.";
echo "Check installation instructions on: https://docker-sync.readthedocs.io/en/latest/getting-started/installation.html";
exit;
fi
#####################################################
# #
# HELPERS #
# #
#####################################################
q() {
local ANSWER=${2};
[[ -n ${ANSWER} ]] && read -p "${1} [${ANSWER}]: " VALUE;
[[ -z ${ANSWER} ]] && read -p "${1}: " VALUE;
[[ -n "$VALUE" ]] && ANSWER=$VALUE;
echo $ANSWER;
}
EXECUTE_INSIDE_CONTAINER() {
# We're using this function to remove the requirements of having PHP and Composer locally. So this will execute inside a container with PHP
curl -s https://gist.githubusercontent.com/LucasCalazans/dd85d49d5bbb4538f134e8e730af8245/raw/66af88d3a95980fce8c7a0716413a5b568661968/exec.sh | bash -s $*;
}
#####################################################
# #
# PREPARING ARGUMENTS #
# #
#####################################################
for ARGUMENT in "$@"
do
KEY=$(echo $ARGUMENT | cut -f1 -d=)
VALUE=$(echo $ARGUMENT | cut -f2 -d=)
case "$KEY" in
--name|-n) PROJECT_NAME=${VALUE} ;;
--path|-p) PROJECT_PATH=${VALUE} ;;
-v|--version|--magento-version) MAGENTO_VERSION=${VALUE} ;;
--host) PROJECT_HOST=${VALUE} ;;
--admin-user) ADMIN_USER=${VALUE} ;;
--admin-password) ADMIN_PASSWORD=${VALUE} ;;
--public-key) MAGENTO_PUBLIC_KEY=${VALUE} ;;
--private-key) MAGENTO_PRIVATE_KEY=${VALUE} ;;
# --help|-h) show_help; exit ;;
*) # param not used
esac
done
#####################################################
# #
# PROJECT CONFIGS #
# #
#####################################################
[[ -z "$PROJECT_NAME" ]] && PROJECT_NAME=$(q "Project name?" "magento2");
[[ -z "$PROJECT_PATH" ]] && PROJECT_PATH=$(q "Where do you want to use the project?" "./${PROJECT_NAME}");
[[ -z "$MAGENTO_VERSION" ]] && MAGENTO_VERSION=$(q "Magento Version?" "2.3.2");
[[ -z "$PROJECT_HOST" ]] && PROJECT_HOST=$(q "Project host?" "${PROJECT_NAME}.localhost");
[[ -z "$ADMIN_USER" ]] && ADMIN_USER=$(q "Admin User?" "admin");
[[ -z "$ADMIN_PASSWORD" ]] && ADMIN_PASSWORD=$(q "Admin Password?" "123123q");
#####################################################
# #
# MAGENTO KEYS #
# #
#####################################################
[[ -z "$MAGENTO_PUBLIC_KEY" ]] && MAGENTO_PUBLIC_KEY=$(q "Magento public key" "");
[[ -z "$MAGENTO_PUBLIC_KEY" ]] && echo "ERROR: We need a Magento public key" && exit;
[[ -z "$MAGENTO_PRIVATE_KEY" ]] && read -sp "Magento private key: " MAGENTO_PRIVATE_KEY && echo "";
[[ -z "$MAGENTO_PRIVATE_KEY" ]] && echo "ERROR: We need a Magento private key" && exit;
#####################################################
# #
# CLONING CLOUD #
# #
#####################################################
git clone [email protected]:magento/magento-cloud.git ${PROJECT_PATH};
cd ${PROJECT_PATH};
git checkout ${MAGENTO_VERSION};
#####################################################
# #
# GENERATING auth.json #
# #
#####################################################
echo "{
\"http-basic\": {
\"repo.magento.com\": {
\"username\": \"${MAGENTO_PUBLIC_KEY}\",
\"password\": \"${MAGENTO_PRIVATE_KEY}\"
}
}
}" > auth.json;
#####################################################
# #
# DEPLOYING #
# #
#####################################################
EXECUTE_INSIDE_CONTAINER composer install;
cp package.json.sample package.json;
cp Gruntfile.js.sample Gruntfile.js;
EXECUTE_INSIDE_CONTAINER ./vendor/bin/ece-tools docker:build --mode="developer" --es 6.5 --php 7.2;
cp .docker/config.php.dist .docker/config.php;
sed -i -E "s/magento2.docker/${PROJECT_HOST}/" .docker/config.php docker-compose.yml;
sed -i -E "s/(.*ADMIN_URL' => ')admin(')/\1${ADMIN_USER}\2/" .docker/config.php;
sed -i -E "s/(.*ADMIN_PASSWORD' => ')123123q(',)/\1${ADMIN_PASSWORD}\2/" .docker/config.php;
EXECUTE_INSIDE_CONTAINER ./vendor/bin/ece-tools docker:config:convert;
SYNC_NAME="${PROJECT_NAME}-sync"
sed -i -E "s/(.*)magento-sync(.*)/\1${SYNC_NAME}\2/" ./docker-compose.yml ./docker-sync.yml ./vendor/magento/ece-tools/src/Docker/Compose/DeveloperCompose.php
#####################################################
# #
# CHANGING PHP CONTAINER #
# #
#####################################################
mkdir -p .docker/php;
touch ./.docker/php/Dockerfile;
echo "FROM magento/magento-cloud-docker-php:7.2-fpm
RUN apt-get update && \
apt-get upgrade -y && \
curl -sL https://deb.nodesource.com/setup_12.x | bash - && \
apt-get install -y nodejs && \
apt-get clean -y && \
apt-get autoclean -y && \
apt-get autoremove -y && \
apt-get purge -y --auto-remove && \
npm install -g grunt-cli
" > ./.docker/php/Dockerfile
sed -i -E "s/image: 'magento\/magento-cloud-docker-php:7.2-fpm'/\build: '\.\/\.docker\/php'/" docker-compose.yml
#####################################################
# #
# ADDING KIBANA #
# #
#####################################################
KIBANA_CONFIG="\n ports:\n - '9200:9200'\n kibana:\n image: docker.elastic.co\/kibana\/kibana:6.5.0\n volumes:\n - .\/kibana.yml:\/usr\/share\/kibana\/config\/kibana.yml\n ports:\n - '5601:5601'\n depends_on:\n - elasticsearch"
sed -i -E "s/(.*magento-cloud-docker-elasticsearch.*)/\1${KIBANA_CONFIG}/" docker-compose.yml
echo "server.port: 5601
server.host: \"0\"
elasticsearch.url: \"http://elasticsearch:9200\"
" > kibana.yml;
#####################################################
# #
# STARTING PROJECT #
# #
#####################################################
docker-sync start;
docker-compose up -d;
docker-compose run deploy cloud-deploy;
docker-compose run deploy magento-command deploy:mode:set developer;
docker-compose run deploy magento-command cache:clean;
#####################################################
# #
# FINISHED #
# #
#####################################################
echo "";
echo "==========================================";
echo "";
echo "The project \"${PROJECT_NAME}\" has been successfully configured!";
echo "";
echo "Storefront: https://${PROJECT_HOST}";
echo "Admin: https://${PROJECT_HOST}/admin";
echo "";
echo "Admin Username: ${ADMIN_USER}";
echo "";
echo "==========================================";
echo "";
@LucasCalazans
Copy link
Author

LucasCalazans commented Jul 22, 2019

Usage

./create-magento-project

or, you can use passing parameters:

./create-magento-project --name="magento2" --path="~/projects/magento2" --version="2.2.3" --host="magento2.localhost" --admin-user="admin" --admin-password="123123q" --public-key="MAGENTO_PUBLIC_KEY" --private-key="MAGENTO_PRIVATE_KEY"

@LucasCalazans
Copy link
Author

See in action:

asciicast

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment