目的
Githubのprivateリポジトリで管理している静的コンテンツをmasterブランチにマージしたタイミングでJenkinsで自動的にAWSのS3バケットに転送し、特定のIPからのみ閲覧出来るようにする
背景
Githubのprivateリポジトリでも、GithubPagesのような機能を実現する必要があった。
かつ、特定IPからのみの閲覧制限をかける必要があった。
要点
Jenkins
- GithubからのWebhookで実行されるJobの定義
- JenkinsのJob内でAWS-cliを利用してS3バケットに転送
Github
- privateリポジトリで静的コンテンツ管理
- Webhook機能を使ってGithubのマージをJenkinsに通知
S3
- S3バケットをWebサイトホスティング化
- S3のバケットポリシーを利用して、特定のIPのみホワイトリストに追加
参考にさせて頂いた記事
作業
Jenkins
GithubからのWebhook用IP許可
GithubからWebhook通知を受ける際には、以下のIPから通信があるらしいので、セキュリティグループなりconfファイルなりで、IPを許可する必要があります。
①192.30.252.0/22
②185.199.108.0/22
※詳しくはコチラ
SSHキーの発行
次にJenkinsサーバーにて、JenkinsユーザーのSSHキーを発行します。
今回はとりあえず以下のコマンドでサクッと作成しちゃいます。
ssh-keygen -t rsa
ここで出来た公開鍵は後ほどGithub側に登録するので、控えておきましょう。
Github接続用の認証情報の作成
次に上記で作成した秘密鍵を使ってGithubと接続するための認証情報をJenkinsにて登録します。
Jobの作成
次にGithubからのWebhookを受けた際に実行するJobを作ってみましょう。
ここで押さえるべきポイントは
- 認証情報に先ほど作成したものを選択する
- 通知を受けたいブランチ名を指定する
- ブランチをチェックアウトするディレクトリを指定する(必要があれば)
なお、先ほど登録していた認証情報が間違っていると、選択した際に**以下のような認証エラー**が出るので設定をもう一度見直しましょう。
次にJobで実行するシェルを定義します。
今回はAWS-cliで転送するので以下のようになります。
aws --profile {対象プロフィール} s3 cp {チェックアウトディレクトリ} s3://{対象バケット名} --recursive --acl public-read
上記コマンドは、再帰的(--recursive)に公開設定(public-read)でチェックアウトしたファイル全てを転送する、という設定になっています。
**特定のファイルは転送したくない!**等があれば、各自お好みで調整してください。
これでJenkins側の設定は完了です。
Github
SSHの設定
先ほど作成したJenkinsの公開鍵を登録しましょう。
コピペして保存!!
Webhookの設定
次に、Jenkinsに通知を実行したいリポジトリにWebhookの設定をします。
S3
バケットポリシーの設定
以下のようにバケットポリシーを設定してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::{転送先バケット名}",
"arn:aws:s3:::{転送先バケット名}/*"
],
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"{許可するIP}",
"{JenkinsサーバーのIP}"
]
}
}
}
]
}
※JenkinsサーバーからAWS-cliでの通信を許可する必要があるので忘れないように設定しましょう。
確認
これで準備は整いました。
試しにmasterブランチへマージをしてみてください。
JenkinsにてJobが走り、
S3にコンテンツが転送され、
ブラウザにて表示がされています。
許可していないIPだと**403エラー**が出ています。
終わりに
なんちゃってGithubPagesの完成☆