GitHub
AWS
S3
Jenkins
github-pages

privateリポジトリでもJenkinsとS3を使ってGithubPagesみたいなことしてみた

目的

Githubprivateリポジトリで管理している静的コンテンツをmasterブランチにマージしたタイミングでJenkinsで自動的にAWSのS3バケットに転送し、特定のIPからのみ閲覧出来るようにする

背景

Githubprivateリポジトリでも、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を許可する必要があります。

ip
①192.30.252.0/22
②185.199.108.0/22

※詳しくはコチラ

SSHキーの発行

次にJenkinsサーバーにて、JenkinsユーザーのSSHキーを発行します。
今回はとりあえず以下のコマンドでサクッと作成しちゃいます。

command
ssh-keygen -t rsa

ここで出来た公開鍵は後ほどGithub側に登録するので、控えておきましょう。

Github接続用の認証情報の作成

次に上記で作成した秘密鍵を使ってGithubと接続するための認証情報をJenkinsにて登録します。

screencapture- 2018-03-18 19.37.15.png

Jobの作成

次にGithubからのWebhookを受けた際に実行するJobを作ってみましょう。

screencapture- 2018-03-18 19.40.06.png

ここで押さえるべきポイントは

  • 認証情報に先ほど作成したものを選択する
  • 通知を受けたいブランチ名を指定する
  • ブランチをチェックアウトするディレクトリを指定する(必要があれば)

なお、先ほど登録していた認証情報が間違っていると、選択した際に以下のような認証エラーが出るので設定をもう一度見直しましょう。

screencapture- 2018-03-18 19.35.33.png

次にJobで実行するシェルを定義します。
今回はAWS-cliで転送するので以下のようになります。

command
aws --profile {対象プロフィール} s3 cp {チェックアウトディレクトリ} s3://{対象バケット名}  --recursive --acl public-read

上記コマンドは、再帰的(--recursive)公開設定(public-read)チェックアウトしたファイル全てを転送する、という設定になっています。
特定のファイルは転送したくない!等があれば、各自お好みで調整してください。

これでJenkins側の設定は完了です。

Github

SSHの設定

先ほど作成したJenkinsの公開鍵を登録しましょう。
コピペして保存!!

screencapture- 2018-03-18 19.53.31.png

Webhookの設定

次に、Jenkinsに通知を実行したいリポジトリにWebhookの設定をします。

screencapture- 2018-03-18 19.26.48.png

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での通信を許可する必要があるので忘れないように設定しましょう。

screencapture- 2018-03-18 19.59.19.png

確認

これで準備は整いました。
試しにmasterブランチへマージをしてみてください。

JenkinsにてJobが走り

screencapture- 2018-03-18 20.15.45.png

S3にコンテンツが転送され

screencapture- 2018-03-18 20.18.34.png

ブラウザにて表示がされています。

screencapture- 2018-03-18 20.21.07.png

許可していないIPだと403エラーが出ています。

screencapture- 2018-03-18 20.24.07.png

終わりに

なんちゃってGithubPagesの完成☆