たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

【Jenkins】【Go】APIの自動ビルド環境を構築した

Jenkinsを使用して、Goで書いたRESTAPIの実行環境を自動ビルドするCI/CD環境を構築しました。その時のメモを残します。

今回目指す構成図

f:id:c_taquna:20190510001842p:plain:w450

  1. 自分のPCからGitHubへpushをする
  2. それがトリガーとなりJenkinsでジョブが稼働
  3. ジョブによってAPIサーバでビルド実行

環境

GitHub側での設定

  • GitHubリポジトリを作成し、そのリポジトリのSettingsにあるWebhooksの設定でJenkisnサーバを設定しておく。github-webhook/(最後の " / " がないとちゃんと登録できません。)

f:id:c_taquna:20190510002754p:plain:w450

Jenkinsの設定

  • JenkinsでJobを設定しておく

各種設定項目について載せておきます。

f:id:c_taquna:20190510003054p:plain:h300

f:id:c_taquna:20190510003407p:plain:w450

f:id:c_taquna:20190510003613p:plain:w450

f:id:c_taquna:20190510003627p:plain:w450

今回、ビルドは”シェルの実行”を選択しています。Pushを受けたら下記画像内に記載しているシェルスクリプトを実行します。
f:id:c_taquna:20190510003641p:plain:w450

シェルスクリプト全体はこちらです。

ssh jenkins@<APIサーバ>"cd /home/jenkins/go/src/github.com/chittai/<リポジトリ名>; git pull; ps -ef | grep exe/main | grep -v grep | awk '{print \"kill\", \$2}'|sh;bash run.sh > /dev/null 2>&1"

ここで何をやっているかというと、APIサーバのスクリプトを最新化して、前のプロセスをKillして新しいプロセスを稼働しています。

  1. cd /home/jenkins/go/src/github.com/chittai/<リポジトリ名>; git pull; → スクリプト実行ディレクトリに移動してgit pull で最新のコードを取得します。
  2. ps -ef | grep exe/main | grep -v grep | awk '{print \"kill\", \$2}'|sh → すでに実行されているプロセスがあったらそのプロセスをkillします(今回はexe/mainを含むプロセス)というのも、今回は載せませんが、今回実行するプログラミはkillしないとポートが既に使用されておりプログラムが実行できないためです。
  3. bash run.sh > /dev/null 2>&1" → そしてkillが完了したらAPIサーバ上でプログラムを実行します。このシェルスクリプトの内容は下記です。単純にGoで書いたプログラムを実行しています。
/usr/local/go/bin/go run main.go & > /dev/null 2>&1

以上で、Push→ビルドまで自動化できました。テストとか入れてないし、本当にPushトリガでビルドするだけなのですがこれをベースに色々と環境を成長させていこうかなと思います。