These are my notes basically. At first i created this gist just as a reminder for myself. But feel free to use this for your project as a starting point. If you have questions you can find me on twitter @thomasf https://twitter.com/thomasf This is how i used it on a Debian Wheezy testing (https://www.debian.org/releases/testing/)
Discuss, ask questions, etc. here https://news.ycombinator.com/item?id=7445545
- Create a user on
example.com
, as which we (the git client) connect (push) toexmaple.com
. We setgit-shell
as the login shell, so it is not possible to interactively login as this user.
sudo useradd -m -s /usr/bin/git-shell git
- Add your ssh public key to the
authorized_keys
file of the created user:
## Because user git can not interactively login, we have to use sudo to get git temporarily
sudo -u git bash
cd ~
## cd /home/git
mkdir -p .ssh
vim .ssh/authorized_keys
## Paste your public key and save
- Create a
git bare
repo for your project:
mkdir testapp
cd testapp
## /home/git/testapp
git init --bare
- Copy the
post-receive
script from this gist to thehooks
dir of the created bare repo.
vim testapp/hooks/post-receive
## Paste the post-receive script from this gist and save
## If you do not need to execute a 'build' and/or 'restart' command,
## just delete or comment the lines 'UPDATE_CMD' and 'RESTART_CMD'
chmod +x testapp/hooks/post-receive
- Set ownership and permissions of the
DEPLOY_ROOT
directory:
sudo chown root:git -R /var/www
sudo chmod 775 /var/www
- (Optional) Add a systemd service file for your app.
If you are using
systemd
, you can use thetestapp.service
file from this gist. Make sure you name it like your repository. The post-receive hook can automatically restart your app. You will also have to allow user git to make thesudo
call. Be very careful and restrictive with this!
- Create a git repo and add our newly created
remote
:
mkdir testapp
cd testapp
git init
git remote add production [email protected]:~/testapp
- Commit and push to production:
$ vim Makefile
## Paste contents of Makefile from this gist (as an example)
$ git add .
$ git commit -am "test commit"
$ git push production master
Counting objects: 12, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 432 bytes | 0 bytes/s, done.
Total 4 (delta 2), reused 0 (delta 0)
remote: +++++++++++++++++++++++ Welcome to 'example.com' (1.2.3.4) ++++++++++++++++++++++++
remote:
remote: githook: I will deploy 'master' branch of the 'testapp' project to '/var/www/testapp'
remote:
remote: githook: UPDATE (CMD: 'cd "${DEPLOY_TO}" && make "update"'):
remote: Makefile: Doing UPDATE stuff like grunt, gulp, rake,...
remote: git
remote: /var/www/testapp
remote:
remote: githook: RESTART (CMD: 'sudo systemctl restart "${PROJECT_NAME}.service" && sudo systemctl status "${PROJECT_NAME}.service"'):
remote: testapp.service - node.js testapp
remote: Loaded: loaded (/etc/systemd/system/testapp.service; disabled)
remote: Active: inactive (dead) since Fri 2014-03-21 22:10:23 UTC; 10ms ago
remote: Process: 9265 ExecStart=/bin/bash -c sleep 3;echo "I am starting";echo "$(whoami)"; (code=exited, status=0/SUCCESS)
remote:
remote: Mar 21 22:10:20 image systemd[1]: Starting nodejs testapp...
remote: Mar 21 22:10:23 image testapp[9265]: I am starting
remote: Mar 21 22:10:23 image testapp[9265]: www-data
remote: Mar 21 22:10:23 image systemd[1]: Started node.js testapp.
remote:
remote: ++++++++++++++++++++ See you soon at 'example.com' (1.2.3.4) ++++++++++++++++++++++
To [email protected]:~/testapp
08babc4..95cabcc master -> master
- Repeat: Develop, test, commit and push :)
make deploy
Congratulations, you just setup git push deployment with automated build and service restart
Here are some more configuration files as a starting point:
thank you for this great script! Can you help me to add a working submodule update to this?
using
git submodule update --init --recursive
produces this error:
remote: fatal: /usr/lib/git-core/git-submodule cannot be used without a working tree.