概要
2024年Qiitaアドベントカレンダー2回目の投稿になりますので、よろしくお願いします。
CodeDeployの情報はデプロイ先がLinuxのものが多く、Windowsサーバの情報がほとんどなかったので、備忘録の意味も含めて皆様に共有できればと思ってこの記事を投稿します。
CodeBuildやCodePipeline、ECRでのCI/CDを構築したことはありましたが、CodeDeployを使うことがなく、対応した案件内ではWindowsサーバへのデプロイが求めらたこともあったので、色々と調べることになりました。
インフラ構成図
今回想定するCI/CD構成は下記の通りになります。ただ構成手順を全て記載すると膨大な量になるので、ポイントとなる部分をかいつまんで記載させていただきます。
この投稿ではWindows Serverへのデプロイに必要な箇所を記載していますので、基本的なAWSでCI/CDの構築方法は他の情報を参考にしていただければと思います。
前提
今回は.Netのサンプル用のAPIサーバーをデプロイするようCI/CDを回します。
デプロイ先はEC2のWindows Server2022です。
インフラ構成図ではCodeCommitを使っていますが、現在は場合によって新規リポジトリは作成できないので、GitHub等の代替ホスティングサービスを使用してください。
構築
ディレクトリ構成
今回の記事では下記のディレクトリ構成でCI/CDを回していくことを想定しています。
project/
├── src/
│ ├── SimpleServer
│ ├── Program.cs
│ └── SimpleServer.csproj
├── Script
│ ├── StartService.ps1
│ └── StopService.ps1
├── appspec.yml
└── buildspec.yml
src配下のコードはサンプルAPIサーバーとして下記リンク先のコードを使わせてもらっています。
Script配下はCodeDeployの起動時にサーバ上で実行されるファイルが格納されています。
appspec.yml
はCodeDeployの定義ファイルで、buildspec.yml
はCodeBuildの定義ファイルになります。
buildspec.yml
まずCodeBuild用の定義ファイルになります。
.Netのアプリをビルドし、実行ファイルとして公開できるようにしてから、Zip化してS3バケットに配置するという流れになります。
version: 0.2
phases:
install:
runtime-versions:
dotnet: 8.0
commands:
- echo Install Package
- dotnet restore
build:
commands:
- echo Build Code
- dotnet build --configuration Release --no-restore
post_build:
commands:
- echo Publish Application
- dotnet publish --configuration Release -r win-x64 --self-contained true -f net8.0 --artifacts-path ./output
artifacts:
files:
- '../output/publish/**/*'
- '../appspec.yaml'
- '../Script/*'
discard-paths: yes
base-directory: ./src
appspec.yaml
CodeDeployの定義署になりますが、Windowsの事例は本当に少ないので、参考にしてもらえればと思います。
分かる方はすぐにできると思いますが、調べながら対応したので、結構時間がかかりましたね〜
version: 0.0
os: windows
files:
- source: /
destination: C:¥Users¥Administrator¥Desktop¥test
hooks:
BeforeInstall:
- location: .¥Script¥StopService.ps1
timeout: 300
AfterInstall:
- location: .¥Script¥StartService.ps1
上記のファイルで、S3に配置したアプリをWindowsのtest
ディレクトリに配置をすることを定義しています。
フックでは、インストール前にStopService.ps1
ファイルを実行して、アプリを停止して、インストール後にStartService.ps1
ファイルを実行してアプリを起動するという定義になります。
ちなみにStopService.ps1
ファイルが、
Stop-Process -Name "SimpleServer" -Force
StartService.ps1`ファイルが、
Start-Process -FilePath "C:¥Users¥Administrator¥Desktop¥test¥SimpleServer.exe"
となります。
構築
CodeCommitにリポジトリを構築し上記のディレクトリでコードを配置します。
CodeBuildやCodeDeploy、CodePipelineも特に変わった設定なくシンプルに構築します。
アプリを配置するS3バケットを構築し、デプロイ先のEC2を起動しておきます。
実行
CodeCommitにコードをプッシュするとPipelineが実行され、最終的にEC2にアプリがデプロイされます。
最後に
Windows Serverに関するCodeDeployの情報が少ないことでこの記事を投稿してみましたが、なぜ少ないんでしょうかね〜デプロイ先としてWindows Serverは選択肢として少ないんでしょうかね〜と思っていますが、実際はどうですかね。
一応、Windows ServerへのCodeDeployを使った自動デプロイ方法としてみなさんの参考になればと思っています。
もしご指摘等ありましたらコメントいただければと思いますので、よろしくお願いいたします。