MsTeams based GoCD build notifier - Used ashwanthkumar/gocd-slack-build-notifier as reference.
There is a plant.uml diagram with the Design plugin.png
- The notification plugin implements a GoPlugin.class and are placed in /plugins/external (GoCD server Classpath)
- During server startup the plugin is registerd with the server
- The server then start to send notification to the plugin depending on the plugins' configuration
- The default configuration is done via file, as below
- Configuration can also be changed via the frontend.
- When a notification is received the plugin will fetch more information from the GoCD API (Pipeline History)
- This information is parsed depending on the configuration, (For Example. Trigger)
- The plugin the creates a message to send to MsTeams (Teams and channels are configured)
- The plugin fetch a Bearer Token from MS openID server
- The plugin then send the notification to the teams
Build the jar & place it in /plugins/external & restart Go Server.
Build the docker image. It will place the created jar in the correct folder. Run Docker with
-d -p8153:8153 -p8154:8154It downloads and run GoCD 17.11.0
All configurations are in HOCON format. Plugin searches for the configuration file in the following order
- File defined by the environment variable
GO_NOTIFY_CONF. go_notify.confat the user's home directory. Typically it's thegouser's home directory (/var/go).go_notify.confpresent at theCRUISE_SERVER_DIRenvironment variable location.
You can find the details on where / how to setup environment variables for GoCD at the documentation.
Minimalistic configuration would be something like
gocd.msteams {
# MsTeams API
api-msteams-host = "http://localhost:8153/"
msteams = [{
team = {id}
display-name = "GoCD Build Bot"
icon-url ="http://iconlib.com/brokonbuild"
channel = ["{channelId1}", "{channelId2}", ... ]
pipelines = [{
name = {Regex}
stage = {Regex}
group = {Regex}
statuses = [Broken, Failed...]
}]
}]
# GoCD Server
login = "someuser"
password = "somepassword"
goCdClient-host = "http://localhost:8153/"
# optional fields
api-token = "a-valid-token-from-gocd-goCdClient" Not used currently
display-console-log-links = true
display-material-changes = true
process-all-configuration = true
trancate-change = true
proxy {
hostname = "localhost"
port = "5555"
type = "socks" # acceptable values are http / socks
}
}api-msteams-host- The host URL of the MsTeams APIMS Teams- List. Setup per Team on the MsTeams applicationteam- Team's iddisplay-name- Display name on top of the notificationicon-url- Icon displayed with the notificationchannel- List of channel Idspipelines- List of Pipeline configuration objectsgroup- Regular expression for group namesname- Regular expression for pipeline namesstage- Regular expression for stage namesstatuses- List of pipeline status to display the notification for. Valid values are passed, failed, cancelled, building, fixed, broken or all.
login- Login for a Go user who is authorized to access the REST API.password- Password for the user specified above. You might want to create a less privileged user for this plugin.*api-token- (ignore)Valid GoCD access token. Available starting from v19.2.0 (https://api.gocd.org/current/#bearer-token-authentication). If both login/password and api-token are present, api-token takes precedence.goCdClient-host- FQDN of the Go Server. All links on the slack channel will be relative to this host.
Optional
display-console-log-links- Display console log links in the notification. Defaults to true, set to false if you want to hide.displayMaterialChanges- Display material changes in the notification (git revisions for example). Defaults to true, set to false if you want to hide.process-all-configuration- If true, all matching configuration are applied instead of just the first.truncate-changes- If true, displays only the latest 5 changes for all the materials. (Default: true)proxy- Specify proxy related settings for the plugin.proxy.hostname- Proxy Hostproxy.port- Proxy Portproxy.type-socksorhttpare the only accepted values.
- Create a file that has the config values, for example
go_notify.conf - Then create a Kubernetes secret using this file in the proper namespace
kubectl create secret generic slack-config \
--from-file=go_notify.conf=go_notify.conf \
--namespace=gocd
- In order to add this plugin, you have to use a local values.yaml file that will override the default values.yaml present in the official GoCD helm chart repo.
- Add the .jar file link from the releases section to the
env.extraEnvVarssection as a new environment variable. - The environment variable name must have
GOCD_PLUGIN_INSTALLprefixed to it. - Example
env:
extraEnvVars:
- name: GOCD_PLUGIN_INSTALL_slack-notification-plugin
value: https://github.com/ashwanthkumar/gocd-slack-build-notifier/releases/download/v1.3.1/gocd-slack-notifier-1.3.1.jar
- name: GO_NOTIFY_CONF
value: /tmp/slack/go_notify.conf
- Make sure to add the link of the release you want to use.
- If you want to specify a custom path for the
go_notify.conffile you can use theGO_NOTIFY_CONFenvironment variable as given above.
- Mount the previously secret to a path by adding the following configuration to the local values.yaml
persistence:
extraVolumes:
- name: slack-config
secret:
secretName: slack-config
defaultMode: 0744
extraVolumeMounts:
- name: slack-config
mountPath: /tmp/slack
readOnly: true
- If you want to use a custom config location by specifying
GO_NOTIFY_CONF, then you can use the abovemountPath. If not, change themountPathto/var/goas it is the defaultgouser's home directory. - Then applying the local values.yaml that has these values added to it will result in a new Go Server pod being created that has the plugin installed and running.