Git Product home page Git Product logo

gerrit-workflow-demo's Introduction

gerrit-workflow-demo

Demo of Dockerized gerrit/jenkins workflow functionality

What?

  • Dockerized demonstration of an integrated Jenkins/Gerrit environment, using Jenkins workflow to construct a build/test pipeline that is triggered when patchsets are submitted for review
  • Mimics the work environment of a real world user doing mobile development

Why?

  • To demonstrate how Jenkins workflow facilitates complex build/testing schemes
  • Show how one can construct a Dockerized code review/automation environment with full integration
  • Demonstrate an integrated, containerized setup of Jenkins + Gerrit

This comprises 3 parts:

  • Jenkins server using workflow and the gerrit trigger plugin to work with gerrit patchsets
  • Gerrit server: acts as a central git repository and provides code review
  • Installation of git-repo tool (in both Jenkins and Gerrit), to support projects spanning multiple repositories
  • Code repos in gerrit for repo (umbrella manifest) and two sample Java projects

In fitting with Docker best practices, this is split into two Docker containers:

  • jenkins-gerrit-wfdemo-jenkins - the jenkins host, complete with its own home directory (runs on port 8081)
  • jenkins-gerrit-wfdemo-gerrit - gerrit server on port 8080, with local git repos and repo running in server mode

Setup

  • Prerequisite: Linux or Mac with a working Docker installation (Boot2Docker or Docker machine will work), and optionally Docker Compose
  • Prerequisite for use of repo tool: installation
    • Linux: sudo curl https://storage.googleapis.com/git-repo-downloads/repo > /bin/repo && sudo chmod a+x /bin/repo
    • Mac: curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo && chmod a+x ~/bin/repo
  • Create Host Mappings (optional for linux, required on Mac for Docker Machine / Boot2Docker ):
    • Find your Docker host's IP and write it down
      • In linux on native docker, use 127.0.0.1
      • For boot2docker, run boot2docker ip
      • For Docker Machine, run docker-machine ls and finding the matching host
    • In your favorite text editor (in sudo mode) open /etc/hosts for editing, ex sudo vi /etc/hosts
    • Add two new lines mapping this IP to hostname 'jenkins' and 'gerrit' and save the file, ex:
192.168.99.100     gerrit
192.168.99.100     jenkins

To run:

  • Using Docker Compose: simply run 'docker-compose up'
  • Vanilla Docker:
    • To build: run build.sh (using sudo if needed) - it will need a couple minutes
    • To run: run start.sh

Using it:

  • Jenkins is available at localhost:8081 (Linux) or jenkins:8081 (Mac or with hosts entry)
  • Gerrit is available at localhost:8080 (Linux) or gerrit:8080 (Mac or with hosts entry)
  • To set up the local user with push permissions for gerrit:
    • Linux: sh config-gerrit.sh
    • Mac or with hosts entry: sh config-gerrit-mac.sh

By default, this will use your git name & email, set the gerrit username as local username, and your HTTP gerrit password as 'goober' (and add your local SSH public RSA key). You can always set this up manually and change it from the gerrit interface.

Sample project

  • By default, there are three repositories, each with a gerrit project
    • 'umbrella' - this contains a manifest for repo
    • 'primary' - Java command line tool to generate random text, after a delay. Mimics an API provider, built with maven.
    • 'secondary' - Very basic java program to generate arguments to the program in 'primary.' Mimics an API consumer, also built in maven

Creating commits and pushing to gerrit directly

  1. You must have a gerrit user configured (see "using it")
  2. Git clone repositories (replace 'gerrit' with localhost if using native Docker)
  1. Go into each repository and do the following to install Gerrit hooks:
  • Linux: curl -Lo .git/hooks/commit-msg http://localhost:8080/tools/hooks/commit-msg && chmod u+x .git/hooks/commit-msg
  • Mac: curl -Lo .git/hooks/commit-msg http://gerrit:8080/tools/hooks/commit-msg && chmod u+x .git/hooks/commit-msg
  1. Create a test commit
  • echo 'blahblahblah' > newfile.txt && git add newfile.txt
  • git commit -a -m "Test"
  1. Push by SSH
  • Linux: git push ssh://$USER@localhost:29418/primary HEAD:refs/for/master
  • Mac: git push ssh://$USER@gerrit:29418/primary HEAD:refs/for/master
  1. You should see new changes for review in Gerrit... and responses back from Jenkins after running 'wf-build'

Creating and uploading changes by repo

  1. You must have a gerrit user configured (see "using it") and repo installed
  2. Pull down the project structure via repo (must be installed, see prerequisites)
  • Linux, native docker: repo init -u http://localhost:8080/umbrella && repo sync
  • Mac or linux with hosts entry: repo init -u http://gerrit:8080/umbrella -m jenkins.xml && repo sync
  1. Start a new working branch in repo
  • repo start feature-testing --all
  1. Push back changes for review:
  • repo upload
  1. You should see changes ready for review, and Jenkins test results from 'wf-build'
  2. Feel free to go back to the master branch:
  • repo sync -d

To stop:

  • Using Docker Compose: 'docker-compose kill && docker-compose rm'
  • Vanilla Docker: 'docker rm -f gerrit && docker rm -f jenkins'

Troubleshooting

  1. Verifying Gerrit access by SSH for jenkins
  • go to the gerrit-workflow-demo/jenkins
  • run the following:
    • Linux: ssh -i demo_key_rsa -p 29418 demouser@localhost
    • Mac: ssh -i demo_key_rsa -p 29418 demouser@gerrit
  • you should see the following:
Enter passphrase for key 'demo_key_rsa': 

  ****    Welcome to Gerrit Code Review    ****

  Hi demouser, you have successfully connected over SSH.

  Unfortunately, interactive shells are disabled.
  To clone a hosted Git repository, use:

  git clone ssh://demouser@gerrit:29418/REPOSITORY_NAME.git

Connection to localhost closed.

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.