Skip to content

Instantly share code, notes, and snippets.

@GregoireHebert
Last active August 2, 2016 12:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save GregoireHebert/c2192ef32f14d4de1b25 to your computer and use it in GitHub Desktop.
Save GregoireHebert/c2192ef32f14d4de1b25 to your computer and use it in GitHub Desktop.
Script to create a virtualhost + directory + gitlab project + capistrano deployement + webhook
#!/bin/bash
# create_gitlab_project.sh
# create_gitlab_project.sh: shell script that create a virtualhost + directory + gitlab project + capistrano deployement + webhook.
# The MIT License (MIT)
# Copyright (C) 2015 Grégoire Hébert http://www.gheb.fr
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
DIALOG_TITLE="Création de projet GITLAB"
####################
# Force using root #
####################
if [ $EUID != 0 ] ; then
dialog --title "$DIALOG_TITLE" --ok-label "Terminer" --msgbox "Impossible de créer de projet sans les droits root." 8 50
clear
exit 1
fi
######################################
# Clear terminal when leaving script #
######################################
trap "clear" HUP INT ABRT QUIT SEGV TERM EXIT
######################
# Defining constants #
######################
REMOTE_WWW_PATH="/home/var/www/"
REMOTE_DOMAIN="ope-opo.com"
REMOTE_SSH_URL="root@dev.ope-opo.com"
LOCAL_WWW_PATH="/var/www/"
LOCAL_DOMAIN="preprod.ope-opo.com"
BASE_CI_PATH="/var/www/ci/"
GITLAB_URL="git@preprod.ope-opo.com:dev/"
APACHE_SITES_AVAILABLE="/etc/apache2/sites-available/"
SERVER_ADMIN="ovh@opo.fr"
#########
# START #
#########
dialog --title "$DIALOG_TITLE" --clear --ok-label "Commencer" --msgbox "Bienvenue sur la création de projet GITLAB. Tapez <Enter> pour commencer ou <Esc> pour annuler" 12 50
if [ "$?" != "0" ]; then
dialog --title "$DIALOG_TITLE" --ok-label "Terminer" --msgbox "Création de projet annulée." 8 50
exit 1
else
exec 3>&1
PROJECT_NAME=$(dialog --title "$DIALOG_TITLE" --inputbox "Veuillez nommer le projet (monSuperProjet)" 12 50 2>&1 1>&3);
exec 3>&-
VIRTUAL_HOST_FILE=$PROJECT_NAME.conf
PROJECT_WWW_PATH=$LOCAL_WWW_PATH$PROJECT_NAME
REMOTE_PROJECT_WWW_PATH=$REMOTE_WWW_PATH$PROJECT_NAME
#################################
# Creation of Vhost / Directory #
#################################
dialog --title "$DIALOG_TITLE" --exit-label "Ok" --textbox ./recap.txt 15 50
dialog --title "$DIALOG_TITLE" --ok-label "Oui" --yesno "Souhaitez vous vraiment créer le projet $PROJECT_NAME ?" 8 50
if [ "$?" = "0" ]; then
(echo 8;echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Création du répertoire $PROJECT_WWW_PATH..." 8 50; sleep 1
if [ -d $PROJECT_WWW_PATH ]; then
(echo 6; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Le répertoire existe déjà..." 8 50; sleep 1
else
mkdir $PROJECT_WWW_PATH &>/dev/null
fi
(echo 16; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Création du virtualhost..." 8 50; sleep 1
echo "
<VirtualHost *:80>
ServerAdmin $SERVER_ADMIN
ServerName $PROJECT_NAME.$LOCAL_DOMAIN
ServerAlias $PROJECT_NAME.$LOCAL_DOMAIN
DocumentRoot $PROJECT_WWW_PATH/current/site/web
<Directory $PROJECT_WWW_PATH/current/site/web>
Options -Indexes +FollowSymLinks +MultiViews
Order allow,deny
Allowoverride All
allow from all
</Directory>
<Location "/">
AuthType Basic
AuthName Private
AuthUserFile /var/www/webusers
AuthGroupFile /var/www/groupusers
Require group DEV $PROJECT_NAME
# configuration pour la lecture des videos sur android qui n'aime pas le blocage par passwd
# a decommenter si besoin
#SetEnvIf Request_URI "path/to/videos" allow
#Order allow,deny
#Allow from env=allow
#Satisfy any
</Location>
ErrorLog /var/log/apache2/$PROJECT_NAME-error.log
LogLevel warn
CustomLog /var/log/apache2/$PROJECT_NAME-access.log combined
</VirtualHost>" > $APACHE_SITES_AVAILABLE/$VIRTUAL_HOST_FILE
echo "
<VirtualHost *:80>
ServerAdmin $SERVER_ADMIN
ServerName dev-$PROJECT_NAME.$REMOTE_DOMAIN
ServerAlias dev-$PROJECT_NAME.$REMOTE_DOMAIN
DocumentRoot $REMOTE_PROJECT_WWW_PATH/current/site/web
<Directory $REMOTE_PROJECT_WWW_PATH/current/site/web>
Options -Indexes +FollowSymLinks +MultiViews
Order allow,deny
Allowoverride All
allow from all
</Directory>
<Location "/">
AuthType Basic
AuthName Private
AuthUserFile /home/var/www/webusers
AuthGroupFile /home/var/www/groupusers
Require group DEV $PROJECT_NAME
# configuration pour la lecture des videos sur android qui n'aime pas le blocage par passwd
# a decommenter si besoin
#SetEnvIf Request_URI "path/to/videos" allow
#Order allow,deny
#Allow from env=allow
#Satisfy any
</Location>
ErrorLog /var/log/apache2/$PROJECT_NAME-error.log
LogLevel warn
CustomLog /var/log/apache2/$PROJECT_NAME-access.log combined
</VirtualHost>" > /tmp/$VIRTUAL_HOST_FILE
dialog --title "$DIALOG_TITLE" --ok-label "Oui" --cancel-label "Non" --defaultno --yesno "Souhaitez-vous consulter le virtualhost de développement ?" 8 50
if [ "$?" = "0" ]; then
dialog --title "$DIALOG_TITLE" --exit-label "Fermer le fichier" --textbox /tmp/$VIRTUAL_HOST_FILE 30 80
fi
(echo 20; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Activation du virtualhost de développement..." 8 50; sleep 1
rsync -e "ssh -i /root/.ssh/id_dev" -av /tmp/$VIRTUAL_HOST_FILE $REMOTE_SSH_URL:$APACHE_SITES_AVAILABLE/$VIRTUAL_HOST_FILE &>/dev/null
ssh $REMOTE_SSH_URL -i /root/.ssh/id_dev "a2ensite $VIRTUAL_HOST_FILE" &>/dev/null
ssh $REMOTE_SSH_URL -i /root/.ssh/id_dev "service apache2 reload" &>/dev/null
ssh $REMOTE_SSH_URL -i /root/.ssh/id_dev "mkdir $REMOTE_PROJECT_WWW_PATH" &>/dev/null
ssh $REMOTE_SSH_URL -i /root/.ssh/id_dev "chown -R www-data:www-data $REMOTE_PROJECT_WWW_PATH" &>/dev/null
dialog --title "$DIALOG_TITLE" --ok-label "Oui" --cancel-label "Non" --defaultno --yesno "Souhaitez-vous consulter le virtualhost de préproduction ?" 8 50
if [ "$?" = "0" ]; then
dialog --title "$DIALOG_TITLE" --exit-label "Fermer le fichier" --textbox $APACHE_SITES_AVAILABLE/$VIRTUAL_HOST_FILE 30 80
fi
(echo 24; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Activation du virtualhost de préproduction..." 8 50; sleep 1
##################################################################################################################
# ADD htaccess USER #
# the project will be accessible for any user of DEV group + this particular user to communicate to the customer #
##################################################################################################################
exec 3>&1
PASSWORD=$(dialog --title "$DIALOG_TITLE" --passwordbox "Entrez un mot de passe pour l'accès web au projet en PREPROD. C'est ce mot de passe que vous communiquerez au client. Vous pouvez également accéder au projet avec vos identifiants." 12 50 2>&1 1>&3);
exec 3>&-
(echo 32; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Ajout du mot de passe web preprod..." 8 50; sleep 1
htpasswd -mb /var/www/webusers $PROJECT_NAME $PASSWORD &>/dev/null
GROUP_EXIST=$(grep -Fx "$PROJECT_NAME : $PROJECT_NAME" /var/www/groupusers);
if [ -z "$GROUP_EXIST" ]; then
(echo 30; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Ajout du groupe web de preprod..." 8 50; sleep 1
echo "$PROJECT_NAME : $PROJECT_NAME" >> /var/www/groupusers
else
(echo 30; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Le groupe web de preprod existe déjà..." 8 50; sleep 1
fi
a2ensite $VIRTUAL_HOST_FILE &>/dev/null
service apache2 reload &>/dev/null
(echo 40; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Définition des permissions sur $PROJECT_WWW_PATH..." 8 50; sleep 1
chown -R www-data:www-data $PROJECT_WWW_PATH &>/dev/null
#####################################################################
# ADD the project to gitlab DEV group THE initialise the repository #
#####################################################################
(echo 48; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Création d'un projet dans le groupe DEV..." 8 50; sleep 1
GROUP_ID=$(gitlab --gitlab local group get --id=dev | grep -om1 '[0-9]\+');
if [ -n "$GROUP_ID" ]; then
(echo 56; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Création d'un projet dans le groupe DEV... (Groupe OK)" 8 50; sleep 1
PROJECT_EXIST=$(gitlab --gitlab local project list | grep -om1 '$PROJECT_NAME\+');
if [ -n "$PROJECT_EXIST" ]; then
(echo 64: echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Création d'un projet dans le groupe DEV... (Le projet existe déjà)" 8 50; sleep 1
else
PROJECT_ID=$(gitlab --gitlab local project create --name=$PROJECT_NAME --namespace-id=$GROUP_ID | grep -om1 '[0-9]\+');
(echo 64; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Création d'un projet dans le groupe DEV... (Projet OK)" 8 50; sleep 1
(echo 72; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Initialisation du dépôt..." 8 50; sleep 1
cd $PROJECT_WWW_PATH
git clone $GITLAB_URL$PROJECT_NAME.git . &>/dev/null
touch README.md
cp -a /root/site site
chmod 755 ./* -R
chown www-data:www-data ./* -R
git add -A &>/dev/null
git commit -m "Initial Commit" &>/dev/null
git push -u origin master &>/dev/null
git checkout -b "dev" master &>/dev/null
git push origin dev &>/dev/null
cd /root
rm -rf $PROJECT_WWW_PATH/* &>/dev/null
fi
else
(echo 56; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Création d'un projet dans le groupe DEV... (Impossible de créer le projet, le groupe n'existe pas !)" 8 50; sleep 1
dialog --title "$DIALOG_TITLE" --ok-label "Terminer" --msgbox "Création de projet intérompue, créez le projet dev dans gitlab et recommencez !" 8 50
exit 1;
fi
#############################
# Add Capistrano deployment #
#############################
(echo 80; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Création des fichiers d'intégration continue" 8 50; sleep 1
mkdir $BASE_CI_PATH$PROJECT_NAME
cd $BASE_CI_PATH$PROJECT_NAME
cap install &>/dev/null
rm -rf $BASE_CI_PATH$PROJECT_NAME/config/deploy/*
echo "
# config valid only for current version of Capistrano
lock '3.4.0'
# name
set :application, 'remote'
set :use_sudo, true
# url to the repository
set :repo_url, 'git@preprod.ope-opo.com:dev/$PROJECT_NAME.git'
# source control management
set :scm, :git
# how is it executed
# format pretty for beautiful display
# log_level debug for testing, error otherwise
set :format, :pretty
set :log_level, :error
# max release kept
set :keep_releases, 3
# composer / symfony / zend configuration
#set :linked_dirs, %w{library/Zend/Session vendor}
#set :linked_files, %w{app/config/parameters.yml}
#namespace :opo do
# desc 'Force chmod update'
# task :permissions do
# on roles(:app) do
# within release_path do
# execute 'cd #{release_path}/site && chown -R www-data:www-data web'
# execute 'cd #{release_path}/site && mkdir app/cache && chown -R www-data:www-data app/cache'
# execute 'cd #{release_path}/site && mkdir app/logs && chown -R www-data:www-data app/logs'
# execute 'cd #{release_path}/site && curl -sS https://getcomposer.org/composer.phar > composer.phar'
# execute 'cd #{release_path}/site && php composer.phar self-update'
# execute 'cd #{release_path}/site && php composer.phar install'
# info 'Group permission of www modified to www-data'
# end
# end
# end
#
# after 'deploy:updated', 'opo:permissions'
#end
" > $BASE_CI_PATH$PROJECT_NAME/config/deploy.rb
echo "
set :stage, :development
set :branch, 'dev'
server 'dev.ope-opo.com',
user: 'root',
roles: %w{web app},
ssh_options: {
user: 'root',
keys: %w(/var/www/.ssh/id_dsa),
forward_agent: false
}
set :deploy_to, '$REMOTE_PROJECT_WWW_PATH'
" > $BASE_CI_PATH$PROJECT_NAME/config/deploy/development.rb
echo "
set :stage, :preprod
set :branch, 'master'
server 'localhost',
user: 'www-data',
roles: %w{web app},
ssh_options: {
user: 'www-data',
keys: %w(/var/www/.ssh/id_rsa),
forward_agent: false
}
set :deploy_to, '$PROJECT_WWW_PATH'
" > $BASE_CI_PATH$PROJECT_NAME/config/deploy/preprod.rb
(echo 88; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Initialisation du déploiement..." 8 50; sleep 1
sudo -u www-data cap development deploy &>/dev/null
sudo -u www-data cap preprod deploy &>/dev/null
echo "<?php \$output = shell_exec('sudo -u www-data cap development deploy 2>&1'); echo '<pre>'.\$output.'</pre>'; echo 'Déploiement terminé.';" > development.deploy.php
echo "<?php \$request = json_decode(file_get_contents('php://input')); if (\$request->ref == 'refs/heads/master' ) { \$output = shell_exec('sudo -u www-data cap preprod deploy 2>&1'); echo '<pre>'.\$output.'</pre>'; echo 'Déploiement terminé.';}" > preprod.deploy.php
(echo 96; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Premier déploiement terminé (dev et preprod)" 8 50; sleep 1
gitlab --gitlab local project-hook create --project-id=$PROJECT_ID --url=http://$LOCAL_DOMAIN/ci/$PROJECT_NAME/development.deploy.php --push-events=1 &>/dev/null
gitlab --gitlab local project-hook create --project-id=$PROJECT_ID --url=http://$LOCAL_DOMAIN/ci/$PROJECT_NAME/preprod.deploy.php --push-events=1 &>/dev/null
(echo 100; echo EOF) | dialog --title "$DIALOG_TITLE" --gauge "Déploiement automatisé enclenché" 8 50; sleep 1
dialog --title "$DIALOG_TITLE" --ok-label "Terminer" --msgbox "Votre projet a été correctement créé ! il est accessible à l'adresse http://dev-$PROJECT_NAME.$REMOTE_DOMAIN et http://$PROJECT_NAME.$LOCAL_DOMAIN. Vous pourrez vous connecter avec l'utilisateur $PROJECT_NAME et le mot de passe que vous avez défini en préprod, ou votre utilisateur personnel en préprod et dev. Pour récupérer le projet -> git clone $GITLAB_URL$PROJECT_NAME.git" 20 50
exit 1
else
dialog --title "$DIALOG_TITLE" --ok-label "Terminer" --msgbox "Création de projet annulée !" 8 50
fi
fi
exit 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment