Getting Started with GoCD

GoCD from ThoughtWorks, is an open source build server which puts more emphasis on the continuous delivery process than just continuous integration.

We’ve decided to start using GoCD at work, and I’ve been looking at preparing the infrastructure and installation with Packer and Terraform; More on those later. I initially looked at hosting both the GoCD Server and GoCD Agents within Docker containers, but had an odd issue with SSH that set me back a bit. Until I GoCD back to figure out what I did wrong, I decided to deploy GoCD on CentOS the old fashioned way.

Installation

GoCD has pretty good documentation, which made a nice change from some other documentation that I’ve been reading through recently. I have now scripted the installation on CentOS and installed GoCD manually on Windows. While the documentation is nice, it still lacks a lot of information to improve the initial user experience. Once I have spent more time with GoCD, I’ll make some contributions to help improve things where I can. A lot of my hurdles are likely due to my lack of experience with Linux.

GoCD Server

To help give people a leg up, I’ll share the installation script that I’m using to create my Packer image. Before this script, I sudo yum -y update and disable SE Linux with sudo setenforce permissive as it interferes with GoCD’s installation process. It’ll be back on after a restart.

echo "
[gocd]
name     = GoCD YUM Repository
baseurl  = https://download.go.cd
enabled  = 1
gpgcheck = 1
gpgkey   = https://download.go.cd/GOCD-GPG-KEY.asc
" | sudo tee /etc/yum.repos.d/gocd.repo
sudo yum -y install curl git go-server

# The next steps in my script failed without the below sleep.
sudo sleep 60

Plugins

With the server installed, we now want to grab all of the plugins. I’ll show an example with the Yaml config plugin.

GOCD_PLUGINS_DIR=/var/lib/go-server/plugins/external
VERSION=0.2.0

sudo curl -sL -o $GOCD_PLUGINS_DIR/yaml-config-plugin-$VERSION.jar \
  https://github.com/tomzo/gocd-yaml-config-plugin/releases/download/$VERSION/yaml-config-plugin-$VERSION.jar

Change ownership of the plugins to the go user that was added by the install.

sudo chown -R go:go $GOCD_PLUGINS_DIR

At this point, you may want to copy over some configuration files, such as an initial password file, cruise-config.xml, or additional plugin configuration. I’ll come back to this at a later time once I have refined it.

Prepare Git

Next, we’ll generate an SSH key for the server.

GOCD_SSH_DIR=/var/go/.ssh

sudo mkdir $GOCD_SSH_DIR
echo "
github.com,192.30.253.112 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
" | sudo tee $GOCD_SSH_DIR/known_hosts
sudo ssh-keygen -q -t rsa -b 4096 -C "gocd" -f $GOCD_SSH_DIR/id_rsa -N ''

# Change ownership to go user.
sudo chown -R go:go $GOCD_SSH_DIR

# Output the public key to make your life easier...
sudo cat $GOCD_SSH_DIR/id_rsa.pub

Cleanup

We now need to relabel the filesystem as we disabled SE Linux earlier. The sleep is needed for Packer to maintain a connection after a restart.

sudo touch /.autorelabel
sudo reboot
sudo sleep 60

With all of that done, we now have a basic GoCD installation on CentOS, with plugins installed and Git ready to use. Access the web UI at localhost:8153.