Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Git-based website deployment workflow

On my server, I have two users, www-data (which is used by nginx) and git. The git user owns a repository that contains my website's code, and the www-data user owns a clone of that repository (which serves as the webroot for nginx). I want to set up a workflow such that pushing to git's repository causes www-data's repository to update, thus updating my website.

What is the correct way to set up the hooks for these repositories (that also takes into consideration privileges and permissions of these two users)?

like image 758
Chetan Avatar asked Mar 25 '11 23:03

Chetan


People also ask

How does Git deployment work?

With Git it's quite simple. Push your work to the remote repository when you're ready, then login to the server, navigate to the directory that contains your app, and run git pull to update the app with your your latest changes.

Can git be used for deployment?

Git is a very popular version control system used to implement development workflows. The Cloudways Platform allows you to deploy code to your application from your git repositories.

What is git flow workflow?

The Gitflow Workflow defines a strict branching model designed around the project release. This workflow doesn't add any new concepts or commands beyond what's required for the Feature Branch Workflow. Instead, it assigns very specific roles to different branches and defines how and when they should interact.


2 Answers

Remove the repository owned by www-data and follow the solution on this webpage for setting up a post-receive hook in the repository owned by git.

like image 188
Arrowmaster Avatar answered Oct 19 '22 20:10

Arrowmaster


I ended up making the public content owned by the git user, and readable by all. Then, I did the following to set up the hooks:

Assuming the repository is called mysite:

  1. Create a detached work tree that will act as the webroot (as the user git)

    mkdir /var/www/mysite
    cd /path/to/repository/mysite.git
    git config core.worktree /var/www/mysite
    git config core.bare false
    git config receive.denycurrentbranch ignore
    
  2. Add a post-receive hook that will update the website and set correct permissions for it

    touch hooks/post-receive
    chmod +x hooks/post-receive
    vim hooks/post-receive
    

    The post-receive script:

    #!/bin/sh
    git checkout -f
    chmod -R o+rX /var/www/mysite
    

Reference:
http://www.deanoj.co.uk/programming/git/using-git-and-a-post-receive-hook-script-for-auto-deployment/


Update: Here is a better solution.

Note: earlier versions of this howto depended on setting the git config variables core.worktree to the target directory, core.bare to false, and receive.denycurrentbranch to ignore. But these changes are not needed if you use GIT_WORK_TREE (which didn't work when I first wrote the howto), and the remote repository can remain bare.

like image 27
Chetan Avatar answered Oct 19 '22 19:10

Chetan