In this article, I will demonstrate how to build a Hubot bot on OpenShift. Four key take-away points.
- Create secret for git clone
- Use docker strategy to build if you prefer Dockerfile over S2I
- Inject environment variables from ConfigMap
- If needed, you can replace the FROM or CMD that defined in Dockerfile during deployment.
In my example, I have a Hubot based bot named Dilbert, and the source code is in a private GitHub repository.
First step, setup a secret to save the GitHub credential that will be used for cloning the project
oc secrets new-basicauth openshift-bot-github --username=openshift-bot --password=******
Second step, create a ImageStream in your project. That’s where we are going to push the build image. I just name it dilbert.
apiVersion: v1 kind: ImageStream metadata: annotations: description: Dilbert image name: dilbert
Third step, create the Dockerfile. To avoid the conflict with the Dockerfile in the build image, you can NOT name it as Dockerfile. I just name it as MyDockerfile in this example.
FROM ubuntu RUN apt-get update RUN apt-get -y install expect nodejs npm RUN ln -s /usr/bin/nodejs /usr/bin/node RUN npm install -g coffee-script RUN npm install -g yo generator-hubot RUN useradd -d /dilbert -m -s /bin/bash -U default USER default WORKDIR /dilbert COPY . . RUN yo hubot --owner="DevOps" --name="Dilbert" --description="DevOps Bot" --defaults RUN npm install CMD bin/hubot -a slack
Forth step, setup your BuildConfig. Use the secret that is created in step 1 to check out codes.
apiVersion: v1 kind: BuildConfig metadata: name: dilbert namespace: dilbert labels: app: dilbert annotations: description: DevOps Bot spec: triggers: - type: ConfigChange source: type: Git git: uri: 'https://github.com/jc1518/dilbert.git' sourceSecret: name: openshift-bot-github strategy: type: Docker dockerStrategy: dockerfilePath: MyDockerfile output: to: kind: ImageStreamTag name: 'dilbert:latest' pushSecret: name: builder-dockercfg-w3dn0
Fifth step, create a ConfigMap to save some credentials that the Bot reads from the environment variables.
apiVersion: v1 kind: ConfigMap metadata: name: myenv namespace: dilbert data: aws.profile: 'myaws' aws.region: 'ap-southeast-2' hubot.token: 'xxxx-1234567-890abcdefg'
The last step is the DeploymentConfig. I need to overwrite the command that is defined in the image, otherwise you will get the error like ‘EACCES: permission denied’. This is because OpenShift has very strict security settings of running containers which does not allow the default bin/hubot script to run ‘npm install’.
apiVersion: v1 kind: DeploymentConfig metadata: annotations: description: Defines how to deploy dilbert bot name: dilbert spec: replicas: 1 selector: name: dilbert strategy: recreateParams: null type: Recreate template: metadata: labels: name: dilbert name: dilbert spec: containers: - env: - name: AWS_PROFILE valueFrom: configMapKeyRef: name: myenv key: aws.profile - name: AWS_REGION valueFrom: configMapKeyRef: name: myenv key: aws.region - name: HUBOT_SLACK_TOKEN valueFrom: configMapKeyRef: name: myenv key: hubot.token image: null name: dilbert command: [ '/dilbert/node_modules/.bin/hubot','--adapter','slack' ] ports: - containerPort: 8080 resources: limits: memory: 512Mi triggers: - type: ImageChange imageChangeParams: automatic: true containerNames: - dilbert from: kind: ImageStreamTag name: 'dilbert:latest' - type: ConfigChange
This is how it looks like in my environment: