sgykfjsm.github.com

Jenkins上でgolangのプロジェクトをCIするときに気をつけなければならないこと

JenkinsでgolangプロジェクトをCIするときに少しハマったので、同じミスをしないで済むようにここにメモする。

Jenkinsでgolangを使えるようにする。

何はともあれ、これをしないことには始まらない。特に理由が無ければ、Jenkinsのプラグインを使うのが良い。

“Jenkinsの管理” > “プラグインの管理” > “利用可能”タブ へ進み、フィルターで”golang”と入力すれば、Go pluginが見つかる。チェックを入れた後、”ダウンロードして再起動後にインストール”を押下する。

再起動後、”Jenkinsの管理” > “システムの設定”へ進むと、”Go”のセクションが追加されていることが確認できるはず。

  • もしシステムの管理で”ロード中”から復帰しない場合、”Jenkinsの管理” > “プラグインの管理” > “高度な設定”タブ へ進み、画面右下の”更新”ボタンを押すと回復する場合がある。
  • それでもダメならいくつかプラグインをアップデートしてから、再度”更新”ボタンを押すと回復することがある。
  • FYI: Global config page is broken when loaded before the tool installer data has been fetched

その後、使いたいバージョンを設定して”適用”ボタンを押下後に”保存”ボタンを押下すれば良い。

Jobでgolangを使うようにする。

Jenkinsのプラグインを入れたあと、ジョブの設定画面の”ビルド環境”に”Set up Go programming language tools”が表示されていることを確認する。ここで使いたいバージョンを選択すれば、あとはPluginが指定したところからバイナリをダウンロードしてして、${JENKINS_HOME}/tools/org.jenkinsci.plugins.golang.GolangInstallation/以下にバイナリを設置する。

Go Pluginを使うと、環境変数にGOROOTが設定されて、PATHにgolangのバイナリが追加されていることが確認できる。

1
2
3
4
5
6
7
8
9
10
11
# Jenkinsのジョブで`env`を実行した出力結果の一部
BUILD_DISPLAY_NAME=#1
BUILD_ID=1
...
EXECUTOR_NUMBER=1
GOROOT=/var/lib/jenkins/tools/org.jenkinsci.plugins.golang.GolangInstallation/v1.5
HOME=/var/lib/jenkins
...
PATH=/var/lib/jenkins/tools/org.jenkinsci.plugins.golang.GolangInstallation/v1.5/bin:/sbin:/usr/sbin:/bin:/usr/bin
...
Finished: SUCCESS

しかし、GOPATHが設定されていない。これに気をつけなければハマることになる。

カスタムワークスペースを設定する

おそらく、通常のgolang開発では、GOPATH以下にソースを置いて開発しているのではないかと思う(少なくとも自分の場合はそうしている)。

例えば、github.com/sgykfjsm/hello-golangというプロジェクトの開発をしている場合、コーディングしている端末でのパスは${GOPATH}/src/github.com/sgykfjsm/hello-golangというパスになっているはず。

よって、Jenkinsのジョブ実行時にもこのパスを再現しなければならない。そうしないと、Git Pluginなどでソースを取得すると、普通に${JENKINS_HOME}/workspace/${JOB_NAME}直下にソースが配置されてしまい、go getgo installなどに失敗するからだ。

というわけで、Jenkins上でも同じパス構成を再現するためにはカスタムワークスペースを使って、ワークスペースの設定を修正しなければならない。

カスタムワークスペースの設定箇所は、非常にわかりづらいが、ジョブの設定画面の”プロジェクトの高度なオプション”に隠れており、”高度な設定…“を押下して表示しなければならない。押下後、”カスタムワークスペースを使用”にチェックを入れて、”ディレクトリ”のテキストボックスを表示させる。このテキストボックスに入力すべき設定値は${JENKINS_HOME}から下のパスにすれば良い。例えば、workspace/${JOB_NAME}/src/github.com/sgykfjsm/hello-golangのようにすれば良い。

GOPATHを設定する

その後、ビルドで”シェルの実行”を選択し、export GOPATH=${JENKINS_HOME}/workspace/${JOB_NAME}を実行してから諸々の処理を行うようにしてあげれば良い。また、export PATH=${PATH}:${GOPATH}/binも追加しておくと良い。

まとめ

要はGOPATHをちゃんと設定しようねっていうだけ。