Install Gitolite port first;
$ prt-get depinst gitolite
This setup is based on documentation from Arch Wiki. Mount point;
# mkdir -p /srv/gitolite # mount /srv/gitolite
Create user;
# useradd -U -d /srv/gitolite gitolite # passwd gitolite # chown gitolite:gitolite /srv/gitolite
Password is necessary so the user is not locked and can login via ssh. This password will not be used.
You need to copy a public key, read ssh how to create one.
$ sudo install -o gitolite -g gitolite /home/bob/.ssh/gitolite.pub /srv/gitolite/gitolite.pub
# su - gitolite $ gitolite setup -pk gitolite.pub Initialized empty Git repository in /srv/gitolite/repositories/gitolite-admin.git/ Initialized empty Git repository in /srv/gitolite/repositories/testing.git/ WARNING: /srv/gitolite/.ssh missing; creating a new one (this is normal on a brand new install) WARNING: /srv/gitolite/.ssh/authorized_keys missing; creating a new one (this is normal on a brand new install) $
$ rm gitolite.pub $ exit
$ ssh -v -i ~/.ssh/gitulite_rsa gitolite@localhost -p 2222
Read how to setup ssh identities, gitolite documentation. Start by cloning gitolite-adimin;
$ git clone gitolite:gitolite-admin
First copy the key to remote server, in this example key is on same server;
# install -o gitolite -g gitolite /home/bob/.ssh/gitolite.pub /srv/gitolite/gitolite.pub
Update gitolite key with new key;
# su - gitolite $ gitolite setup -pk gitolite.pub
$ rm gitolite.pub $ exit
Gitolite helps add and remove users from authorized_keys by allowing add or remove keys from keydir directory in clone.
$ mv bob.pub keydir/ $ git add keydir $ git commit -m "Added bob public key" $ git push
$ git rm keydir/bob.pub $ git commit -m "Removed bob public key" $ git push
Add repository atom and user bob to devteam group, edit conf/gitolite.conf;
@dev = alice david @interns = clair @dev = bob @teamleads = mike @staff = @interns @dev @teamleads @proj-repos = sysdoc storm atom repo @floss R = @all repo @proto RW+ = @staff repo @proj-repos RW+ = @teamleads - master = @dev - refs/tags/v[0-9] = @dev RW+ develop/ = @dev RW+ feature/ = @dev RW+ hot-fix/ = @dev RW = @dev R = @managers repo atom sysdoc option hook.post-receive = deployweb repo testing RW+ = @staff repo gitolite-admin RW+ = mike
Commit and push;
$ git add -u $ git push
Rename rep void to sysdoc, on remote host;
# cd /srv/gitolite/repositories/ # mv void.git sysdoc.git
On workstation edit conf/gitolite.conf;
repo sysdoc RW+ = bob
Commit and push;
$ git add -u $ git push
Example from Cookbook how to apply hooks only to certain repos. Uncomment or add this line on /srv/gitolite/.gitolite.rc, within the %RC block;
LOCAL_CODE => "$rc{GL_ADMIN_BASE}/local",
Uncomment the 'repo-specific-hooks' line in the rc file or add it to the ENABLE list if it doesn't exist.
GIT_CONFIG_KEYS => '.*',
# allow repo-specific hooks to be added 'repo-specific-hooks',
Put your hooks into your gitolite-admin clone, as follows:
$ cd ~/gitolite-admin $ mkdir -p local/hooks/repo-specific
Create the same directory on remote as gitolite;
# su - gitolite $ mkdir local/hooks/repo-specific
Now add your hooks to that directory, but instead of using the git "standard" names (pre-receive, post-receive, post-update), you use descriptive names (e.g. "deploy", "RSS-post", etc).
This manual create two users; one gitolite that handle git central server and system www for web servers. To avoid permission problems this example use gitolite hooks and cron. By using cron we have permission to use chown, this way files end up with right www user ownership and permissions.
This hook allows to select wich branch is deployed and if exists, calls a script inside project folder with user www. This allows to do post deploy (checkout) tasks such as composer update.
Create deployweb in gitolite-admin/local/hooks/repo-specific;
$ vim ~/gitolite-admin/local/hooks/repo-specific/deployweb
#!/bin/bash ###################################################################### # # Put this file in your gitolite-admin; # ~/gitolite-admin/local/hooks/repo-specific/deployweb # while read oldrev newrev refname do BRANCH=$(git rev-parse --symbolic --abbrev-ref $refname) echo "Commit was for branch $BRANCH" if [[ "$BRANCH" == "master" ]];then # Get project name from current directory (without .git) PROJECT=$(basename "$PWD") PROJECT=${PROJECT%.git} echo "Project $PROJECT added to deploy list." echo $PWD > /srv/gitolite/deploy/$PROJECT fi done
Create deploy directory on remote;
# su - gitolite $ mkdir deploy
Add scripts to the repos you want them to be active in your conf file. For example:
repo atom @baz option hook.post-receive = deployweb
Add, commit, and push the admin repo;
$ git add -u && git commit -m "deploy hook"
On remote run;
# su - gitolite $ gitolite setup
Create deploy script that cron will call every minute, this script will check inside /srv/gitolite/deploy folder for projects that have been updated.
Create deploy.sh in /usr/share/gitolite;
$ vim /usr/share/gitolite/deploy.sh
#!/bin/sh ###################################################################### # # Put this file in; # /usr/share/gitolite/deploy.sh # DIR_WWW=/srv/www/ DEPLOY_BRANCH=master TARGET_USER=www for DP_FILE in /srv/gitolite/deploy/* do if [ ! -f "$DP_FILE" ]; then # Nothing to do ;) #echo "Deploy: invalid DP_FILE" exit 1; fi # Get project name PROJECT=$(basename "$DP_FILE") echo "Deploy: PROJECT=${PROJECT}" # Get git repository path and verify if exists DIR_GIT=$(head -n 1 $DP_FILE) if [ ! -d "$DIR_GIT" ]; then echo "Deploy: invalid DIR_GIT: ${DIR_GIT}" exit 2; fi echo "Deploy: DIR_GIT=${DIR_GIT}" # Get directory to deploy and verify if exists GIT_WORK_TREE=${DIR_WWW}${PROJECT}/ if [ ! -d "$GIT_WORK_TREE" ]; then echo "Deploy: invalid GIT_WORK_TREE: ${GIT_WORK_TREE}" echo "Deploy: creating directory: $GIT_WORK_TREE}" mkdir -p $GIT_WORK_TREE fi echo "Deploy: GIT_WORK_TREE={$GIT_WORK_TREE}" # Deploy (checkout) echo "Deploy: starting git checkout" git --git-dir=$DIR_GIT \ --work-tree=$GIT_WORK_TREE \ checkout -f $DEPLOY_BRANCH # Fix ownership and permissions echo "Deploy: fixing permissions" echo "Deploy: setting owner: chown -R ${TARGET_USER}" chown -R ${TARGET_USER}:${TARGET_USER} $GIT_WORK_TREE echo "Deploy: setting directory permissions: chmod 755" find $GIT_WORK_TREE -type d -print0 | xargs -0 chmod 755 echo "Deploy: setting file permissions: chmod 644" find $GIT_WORK_TREE -type f -print0 | xargs -0 chmod 644 # Call project script if [ -f "${GIT_WORK_TREE}/deploy.sh" ]; then echo "Deploy: calling ${GIT_WORK_TREE}deploy.sh" cd ${GIT_WORK_TREE} sudo -u ${TARGET_USER} sh ${GIT_WORK_TREE}deploy.sh fi # Done with project echo "Deploy: removing deploy file="$DP_FILE rm $DP_FILE exit 0; done
Add cron job to call deploy script every minute;
# crontab -e
# # /etc/crontab: crond(8) configuration # # this way it will log # * * * * * /usr/share/gitolite/deploy.sh # without log * * * * * /usr/share/gitolite/deploy.sh > /dev/null 2>&1 @hourly ID=sys.hourly /usr/sbin/runjobs /etc/cron/hourly @daily ID=sys.daily /usr/sbin/runjobs /etc/cron/daily @weekly ID=sys.weekly /usr/sbin/runjobs /etc/cron/weekly @monthly ID=sys.monthly /usr/sbin/runjobs /etc/cron/monthly # End of fileTools Index
This is part of the c9-doc Manual. Copyright (C) 2016 Silvino Silva. See the file Gnu Free Documentation License for copying conditions.