skip to Main Content

I’m trying to set up a local GoCD CI server using docker for both the base server and agents. I can get everything running fine, but issues spring up when I try make sure the agent containers have everything installed in them that I need to build my projects.

I want to preface this with I’m aware that I might not be using these technologies correctly, but I don’t know much better atm. If there are better ways of doing things, I’d love to learn.

To start, I’m using the official GoCD docker image and that works just fine.
Creating a blank agent also works just fine.
However, one of my projects requires node, yarn and webpack to be build (good ol’ react site).
Of course a standard agent container has nothing but the agent installed on it so I’ve had a shot using a Dockerfile to install all the tech I need to build my projects.

FROM gocd/gocd-agent-ubuntu-18.04:v19.11.0

SHELL ["/bin/bash", "-c"] 
USER root

RUN apt-get update
RUN apt-get install -y git curl wget build-essential ca-certificates libssl-dev htop openjdk-8-jre python python-pip

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && 
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install -y yarn

# This user is created in the base agent image
USER go

ENV NVM_DIR /home/go/.nvm
ENV NODE_VERSION 10.17.0

RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.1/install.sh | bash 
    && . $NVM_DIR/nvm.sh 
    && nvm install $NODE_VERSION 
    && nvm alias default $NODE_VERSION 
    && nvm use default 
    && npm install -g webpack webpack-cli

ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
ENV PATH      $NVM_DIR/v$NODE_VERSION/bin:$PATH

This is the current version of this file, but I’ve been through many many iterations of frustrations where an globally installed npm package is never on the path and thus not conveniently available.

The docker build works fine, its just that in this iteration of the Dockerfile, webpack is not found when the agent tries running a build.

My question is:

  1. Is a Dockerfile the right place to do things like install yarn, node, webpack etc… ?

  2. If so, how can I ensure everything I install through npm is actually available?

  3. If not, what are the current best practices about this?

Any help, thoughts and anecdotes are fully welcomed and appreciated!

Cheers~!

2

Answers


  1. You should separate gocd-server and gocd-agent to various containers.

    Pull images:

    • docker pull gocd/gocd-server:v18.10.0 docker pull
    • gocd/gocd-agent-alpine-3.8:v18.10.0

    Build and run them, check if it’s ok. Then connect into bash in agent container

    docker exec -it gocd-agent bash

    Install the binaries using the alpine package manager.

    apk add –no-cache nodejs yarn

    Then logout and update the container image. Now you have an image with needed packeges. Also read this article.

    Login or Signup to reply.
  2. You have two options with gocd agents.

    The first one is the agent use docker, and create other containers, for any purpose that the pipeline needs. So you can have a lot of agents with this option, and the rules or definitions occurs in the pipeline. The agent only execute.

    The second one, is an agent with al kind of program installed you needed. I use this one. For this case, you use a Dockerfile with all, and generate the image for all the agents.

    For example i have an agent with gcloud, kubectl, sonar scanner and jmeter, who test with sonar before the deploy, then deploy in gcp, and for last step, it test with jmeter after the deploy.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search