LoginSignup
8
1

More than 1 year has passed since last update.

GitHubActionsのSelf-hosted runnerで、SpringNativeのビルド時間を短縮する

Last updated at Posted at 2021-09-17

SpringBootで作っているRestAPIアプリケーションを、SpringNativeでNative化しています。
Native化のハードルとして「ビルド時間が長い」ことが結構ストレスだったりします。

ローカルマシンだと、ビルドが30分近くかかったり、メモリ不足でビルド自体がエラーで落ちたりします。
AWSにビルドサーバー作ってビルド時間の短縮とかをしていたんですが、GitにPushしてビルドサーバーの方でPullしてというのがちょっと面倒。
GithubActionsでCIもしているが、どうにもこうにも遅かったり、メモリ不足でエラーになったりする。

その解決策として「Self-hosted runner」を使って強めのインスタンスでビルド時間の短縮を実現しました。

欲しい環境

・SpringNativeでNative-Buildできる環境
・Dockerが使える

AWSで利用したUbuntuのAMI

時期によって更新されていくので日付の部分は探す際には、違う日付になっている場合があります。

ubuntu-focal-20.04-amd64-server-20210430

docker-ceインストール

#docker-ce install
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y docker-ce
sudo systemctl enable docker
sudo systemctl start docker

docker実行時にsudoしなくていいように

sudo gpasswd -a $USER docker

ここで、設定反映のため一度ログアウトして再ログインする

dockerの実行テスト

#docker test
docker run hello-world

SpringNativeのビルド環境を作っていく

必要なライブラリ

以下のライブラリのインストールが必要でした。
※状況によって適宜必要なライブラリは入れてください。

sudo apt-get update && sudo apt-get upgrade
sudo apt install -y zip
sudo apt install -y gcc
sudo apt-get install build-essential

GraalのJava11を入れる

springのドキュメントをもとにセットアップしていきます。

#java11 graal
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install java 21.2.0.r11-grl
sdk use java 21.2.0.r11-grl
gu install native-image

springの参考資料

sdkmanについてはこちら

自分は「maven」使っているのでインストール

#maven
sudo apt install -y maven

Self-Hosted Runnerの設定

ここまで設定したら、GitHubActionsのSelf-hosted runnerとして使う設定をします。
Githubのリポジトリで「Setting > Actions > Runners」から「Add Runner」する。
「OS」と「Archtecture」は、利用したいインスタンスに合わせて設定する。

image.png

こんな感じで設定画面が出るので適宜設定する

image.png

設定完了したら実行

ターミナルを閉じても実行され続けるように、バックグランドで実行させる。

#self hosted runner. for background.
cd ~/actions-runner
nohup ./run.sh &

実行されているかプロセス確認

実行されていますね。

ps -a
   PID TTY          TIME CMD
 18425 pts/0    00:00:00 run.sh
 18429 pts/0    00:00:00 Runner.Listener
 18445 pts/0    00:00:00 ps

終了させたい場合はkill

kill <PID>

ssh接続を切って、githubからSelf-hosted runnerの稼働状況を確認します。

動いてますね
image.png

実際にCIを動かしてみます。

GithubActionsの使い方についてはここでは話しませんので、
公式のドキュメントなど見てみてください!
https://docs.github.com/ja/actions

ビルド時間がどう変わったか

GitHubの標準のRunnerの場合(ubuntu-20.04)

約19分(18分41秒)

ローカルよりは早いけど、メモリが足りないときはどうしようもないです。
大きなプロジェクトになると、メモリエラーでビルド自体できなくなります。
image.png
image.png

Self-hosted runnerの場合(ubuntu-20.04 c5n.4xlarge 16vCpu/32GB)

約6分(5分51秒)

結構早くなりました!このくらいなら我慢できる。
もっとハイスペックなマシンを用意してスレッド設定をもっと増やしたら、もっと早くなるかも。
image.png
image.png

最後に

今回は、「Self-hosted runner」をEC2で作っています。
必要に合わせて起動したり停止したりする予定ですが、Fargateなどで必要な時だけ自動で起動、終わったら終了するようにするのもいいかもしれませんね。

時間ができたらやってみたいと思います。

余談

SpringNative化したRestAPI アプリケーションの起動時間は「0.134s」と爆速。
もともとは20秒程度だったので、爆速になりました。
kubernetesでのPod起動も数秒になりました!ここはProbe設定の調整が必要です。
オートスケールやノード障害時に正常なノードでのPodの起動処理もめちゃくちゃ早くなって、提供サービスの可用性が高くなるので良さそうです!
image.png

あと、「作業マシンのメモリを増強したら?」と言われたんですが、会社のリースのマシンでは箱開けちゃまずいので、それは無理っすw

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1