Last active
August 2, 2016 12:58
-
-
Save GregoireHebert/c2192ef32f14d4de1b25 to your computer and use it in GitHub Desktop.
Script to create a virtualhost + directory + gitlab project + capistrano deployement + webhook
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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