もちろんです!
今日あなたが実際に取り組んだ内容を 「時系列」「目的」「問題」「解決方法」「得られた成果」 の構成で、
再利用できる技術メモとして使えるように まとめました。


📘 今日取り組んだ CI/CD 構築とトラブルシューティングまとめ

🏁 目的

GitHub へ push すると、
EC2 上の Spring Boot アプリが自動でデプロイ&自動起動する CI/CD パイプライン を構築すること。


🧩 全体の流れ

  • CodePipeline(Git → Build → Deploy)
  • CodeBuild(jar 作成)
  • CodeDeploy(EC2 へデプロイ)
  • start_server.sh により Spring Boot を自動起動させる

🛠 今日発生した問題と解決の流れ(詳細版)

CodeDeploy は通るが、Spring Boot が起動しない

🔍 原因候補

  • appspec.ymlAfterInstall に start_server.sh を置いていた
  • /home/ec2-user/app の権限が root のまま
  • start_server.sh 実行時に Permission denied が発生していた

✅ 解決

  • ApplicationStart で start_server.sh を実行するよう appspec.yml を修正
  • /home/ec2-user/app の所有者を ec2-user に変更
sudo chown -R ec2-user:ec2-user /home/ec2-user/app

start_server.sh 実行時の Permission denied

🔍 症状

手動実行すると:

scripts/start_server.sh: line 17: app.log: Permission denied

🔍 原因

  • /home/ec2-user/app が root 所有だったため、
    app.log を書き込めずスクリプトが set -e で強制終了していた。

✅ 解決

  • 所有者変更:
sudo chown -R ec2-user:ec2-user /home/ec2-user/app

⭐ 結果

  • nohup によるバックグラウンド起動が成功
  • Spring Boot が手動実行で正常起動できるように

/home/ec2-user/app に scripts がコピーされていない問題

🔍 理解したこと

  • CodeDeploy は成果物(zip)の中の scripts を直接実行する
  • そのため “scripts が EC2 上にコピーされていなくても起動自体はできる”

👉 ただし、手動デバッグのために appspec.yml で scripts をコピーする構成に変更:

files:
  - source: scripts/
    destination: /home/ec2-user/app/scripts

start_server.sh で Spring Boot のバックグラウンド起動を実現

使用したスクリプト:

#!/usr/bin/env bash
set -e

APP_DIR=/home/ec2-user/app
JAR_NAME=demo-0.0.1-SNAPSHOT.jar

cd "$APP_DIR"

PID=$(pgrep -f "$JAR_NAME" || true)
if [ -n "$PID" ]; then
  kill "$PID"
  sleep 5
fi

nohup java -jar "$JAR_NAME" > app.log 2>&1 &

⭐ 結果

  • CodeDeploy → ApplicationStart で自動起動成功
  • 手動実行でも問題なし

デプロイ後に Spring Boot が自動で起動するようになった

最終確認:

curl http://localhost:8080/hello

出力:

Hello from Spring Boot!

⭐ 結果

  • CodePipeline → CodeDeploy → start_server.sh 実行が完全自動化
  • push → 自動ビルド → 自動デプロイ → アプリ起動 の流れが完成

🎉 今日で達成できたこと

✅ CodeDeploy の正しい hooks の理解(ApplicationStart/Stop)

✅ 成果物(deployment-archive)の仕組み理解

✅ EC2 権限問題(root → ec2-user)

✅ start_server.sh / stop_server.sh の実務的スクリプト作成

✅ Spring Boot の自動起動を CI/CD に乗せる

✅ ログの読み方(scripts.log)

✅ インフラとアプリの両側からのトラブルシューティングスキル


🏆 最終まとめ(あなたが作り上げたもの)

Git push  
→ CodePipeline が起動  
→ CodeBuild が jar 作成  
→ CodeDeploy が EC2 へデプロイ  
→ ApplicationStart で start_server.sh 実行  
→ Spring Boot が自動起動  
→ http://EC2:8080/hello が即反映  

これができているということは、
あなたは実務レベルで “CI/CD が組めるエンジニア” になりました。

本当にお疲れ様です👏🔥
このメモは、次の案件の資料やポートフォリオにも使えます。


必要なら 短い要約版LT 資料風PDF などにもまとめ直せますので言ってください!