Travis CIのビルド結果をサーバにPOST通信で送信する方法メモ


概要

GitHubのリポジトリにPushもしくはPull Requestをした時に自動でテストを走らせる為のツールに、Travis CIがあります。

Travis CIでのテスト結果をSlackなどに通知させる方法はインターネット上にたくさん記事が挙げられていますが(こちらこちらなど)、Webhookを用いてサーバにテスト結果をPOSTする方法に関しては、Slackほど情報が手に入らず、且つハマりどころが多かった為、ここにメモを残します。

やりたかったこと

Travis CIのテスト結果を、AWSのAPI GatewayにPOSTして、その情報を基にLambdaでゴニョゴニョしたかったです。

失敗例

Webhooksを用いてPOST通信を行おうとしました。その時の.travis.ymlが以下です。

.travis.yml
language: go
os: osx
osx_image: xcode10.2
go:
- 1.11
install:
- export GO111MODULE=off
- go get -u github.com/golang/lint/golint
script:
- golint ./...
- go test game.go
notifications:
  webhooks: $API_GATEWAY
env:
  global:
    secure: NexCzvXM0+zYrXfKRzUL6/xpg ~省略~

上では、環境変数API_GATEWAYに送信先のurlを保持させ、暗号化させています(暗号化の方法は、こちらこちらに載っています)。

そして、この環境変数を用いて、Webhookで通知を送ろうとしました。以下の部分です。

notifications:
  webhooks: $API_GATEWAY

しかし、この方法ではテスト終了時にリクエストが送信されることはありませんでした。

こちらに書いてあるように、notificationsの設定はビルド前に行われるのに対し、環境変数の設定はビルド中に行われる為、notifications内の項目には環境変数の設定が反映されない為です。

解決法

環境変数を用いずに、urlを.travis.ymlに直に書き込んだらうまくいくようになるのですが、それをGitHubに挙げてしまうのはなんかいい気分がしません。そこで、以下の方法で迂回しました。

curlで送信

notificationsではなく、'after_success'とafter_failureの中でcurlコマンドを叩いて、リクエストを送信するようにしました。

まず、以下のようなbashファイルを用意します。

message.sh
#! /bin/bash

curl -X POST -H "Content-Type: application/json" $API_GATEWAY

このファイルをビルド完了後に実行することで、正常に通知が送られるようになります。

.travis.yml
language: go
os: osx
osx_image: xcode10.2
go:
- 1.11
install:
- export GO111MODULE=off
- go get -u github.com/golang/lint/golint
script:
- golint ./...
- go test game.go
after_success:
- ./message.sh
after_failure:
- ./message.sh
env:
  global:
    secure: NexCzvXM0+zYrXfKRzUL6/xpg ~省略~

環境変数の取得

上に示したbashファイルでは、リクエストボディ部が空のリクエストが送られてしまいます。リクエスト内容にTravis CIのビルドのurlやコミットメッセージ内容などを組み入れたいときは、Travis CIのデフォルトの環境変数を利用します。

こちらのドキュメントにデフォルトの環境変数の一覧が載っていますが、これらを基にbashファイルを書き換えます。

message.sh
#! /bin/bash

curl -X POST -H "Content-Type: application/json" -d '{"status":0,"url":"'"$TRAVIS_JOB_WEB_URL"'","message":"'"$TRAVIS_COMMIT_MESSAGE"'"}' $API_GATEWAY

上の例では、コミットメッセージとビルドのurlを送信しています。