Code Monkey home page Code Monkey logo

gitreceive's Introduction

gitreceive

Build Status

Creates an ssh+git user that accepts on the fly repository pushes and triggers a hook script.

Push code anywhere. Extend your Git workflow.

gitreceive dynamically creates bare repositories with a special pre-receive hook that triggers your own general gitreceive hook giving you easy access to the code that was pushed while still being able to send output back to the git user.

Requirements

You need a Linux server with git and sshd installed.

Installing

On your server, download https://raw.github.com/progrium/gitreceive/master/gitreceive to a location on your $PATH and make it executable.

Using gitreceive

Set up a git user on the server

This automatically makes a user and home directory if it doesn't exist.

$ sudo gitreceive init
Created receiver script in /home/git for user 'git'.

You use a different user by setting GITUSER=somethingelse in the environment before using gitreceive.

Modify the receiver script

As an example receiver script, it will POST all the data to a RequestBin:

$ cat /home/git/receiver
#!/bin/bash
URL=http://requestb.in/rlh4znrl
echo "----> Posting to $URL ..."
curl \
  -X 'POST' \
  -F "repository=$1" \
  -F "revision=$2" \
  -F "username=$3" \
  -F "fingerprint=$4" \
  -F contents=@- \
  --silent $URL

The username is just a name associated with a public key. The fingerprint of the key is sent so you can authenticate against the public key that you may have for that user.

Commands do not have access to environment variables from the /etc/profile directory, so if you need access to them, you will need to maually source /etc/profile - or any other configuration file - within your receiver script.

The repo contents are streamed into STDIN as an uncompressed archive (tar file). You can extract them into a directory on the server with a line like this in your receiver script:

mkdir -p /some/path && cat | tar -x -C /some/path

Create a user by uploading a public key from your laptop

We just pipe it into the gitreceive upload-key command via SSH:

$ cat ~/.ssh/id_rsa.pub | ssh [email protected] "sudo gitreceive upload-key <username>"

The username argument is just an arbitrary name associated with the key, mostly for use in your system for auth, etc.

Add a remote to a local repository

$ git remote add demo [email protected]:example.git

The repository example.git will be created on the fly when you push.

Push!!

$ git push demo master
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 332 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: ----> Receiving progrium/gitreceive.git ... 
remote: ----> Posting to http://requestb.in/rlh4znrl ...
remote: ok
To git@gittest:progrium/gitreceive.git
   59aa541..6eafb55  master -> master

The receiver script did not attempt to silence the output of curl, so the respones of "ok" from RequestBin is shown. Use this to your advantage! You can even use chunked-transfer encoding to stream back progress in realtime if you wanted to keep using HTTP. Alternatively, you can have the receiver script run any other script on the server.

So what?

You can use gitreceive not only to trigger code on git push, but to provide feedback to the user and affect workflow. Use gitreceive to:

  • Put a git push deploy interface in front of App Engine
  • Run your company build/test system as a separate remote
  • Integrate custom systems into your workflow
  • Build your own Heroku
  • Push code anywhere

I used to work at Twilio. Imagine pushing a repo with a TwiML file to a gitreceive repo with a phone number for a name. And then it runs that TwiML on Twilio and shows you the result, all from the git push.

Another idea: When it's so easy to handle pushed code, how about creating a screen in the office that will display whatever code is pushed to it.

Contribute

This whole system is contained in a single bash script less than 100 lines long. Let's keep it simple, but I'm definitely open to contribution!

Big Thanks

DotCloud

License

MIT

gitreceive's People

Contributors

progrium avatar asm89 avatar ema avatar hkjels avatar josegonzalez avatar surjikal avatar

Watchers

Len Weincier avatar James Cloos avatar

Forkers

rodchyn

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.