Bitbucket Pipelines を使って、レポジトリが更新されたら、S3経由してHTML更新



# 構成要素

- Bitbucket レポジトリ (git or hg)
- Sphinxのドキュメンテーション
- AWS S3 バケット (データ保存用)
- Webサーバ(nginx) (Basic認証を行う)
- Bitbucket Pipelines (レポジトリのPushをキーにSphinx build & S3にPush)
- Dockerコンテナ Pipelineで使用するコンテナ

# 補足

## Web静的ホスト・認証

AWS S3 には、静的Webホスティングの仕組みがありますが、Basic認証が掛けられないため、別途Webサーバを準備し、S3の静的ホスティングにリバースプロキシする。

S3の閲覧権限をIPアドレスで制限する。

つまり、IP制限のみならWebサーバを別途準備する必要はない。

## Pipelines と Dockerコンテナ

Bitbucket Pipelinesは、最近正式にサービスが始まった、Bitbucket内のCI(継続インテグレーションサービス)です。

Pipelinesでは、Dockerコンテナを指定して、テストやディプロイなどを行います。

SphinxのHTMLビルドを実行し、S3にアップロードを行う都合の良いDockerコンテナが見つからなかったので作成しました。
[terapyon/sphinx-s3](https://hub.docker.com/r/terapyon/sphinx-s3/)

# 設定手順

## AWS設定

- IAMで新規ユーザ作成(アクセスキーなどを取得)
- S3バケットを作る
- 上記バケットに静的ホスティングを有効にする
- 上記バケットのアクセス権限(IAMユーザのアップロード許可及び指定IPからの静的ホスティング閲覧許可) *1

*1: バケットのアクセス権限()

```
{
	"Version": "2012-10-17",
	"Id": "S3PolicyId1",
	"Statement": [
		{
			"Sid": "IPAllow",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:*",
			"Resource": "arn:aws:s3:::BUCKET-NAME/*", # <- BUCKET-NAME変更
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": "0.0.0.0/32" # <- WebサーバのIPアドレス
				}
			}
		},
		{
			"Sid": "statement1",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::5260xxxxxxxxx:user/IAM-USER" # <- IAM-USER変更
			},
			"Action": [
				"s3:GetBucketLocation",
				"s3:ListBucket"
			],
			"Resource": "arn:aws:s3:::BUCKET-NAME" # <- BUCKET-NAME変更
		},
		{
			"Sid": "statement2",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::5260xxxxxxxxx:user/IAM-USER" # <- IAM-USER変更
			},
			"Action": "s3:*",
			"Resource": "arn:aws:s3:::BUCKET-NAME/*" # <- BUCKET-NAME変更
		}
	]
}
```

## Webサーバ

- nginxでプロキシーパスの設定
- Basic認証の設定

nginx設定

```
server {
    listen 80;
    server_name SERVER-NAME; # <- SERVER-NAME変更

    charset utf-8;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    index index.html index.htm;

    location / {
        #Basic auth
        auth_basic  "Restricted Area.";
        auth_basic_user_file "/etc/nginx/.htpasswd";
        proxy_pass http://BUCKET-NAME.s3-website-ap-northeast-1.amazonaws.com/doc/; # <- BUCKET-NAME変更
    }
}
```


## Bitbucket

- レポジトリの設定で `Pipelines` を有効にする
- `bitbucket-pipelines.yml` をレポジトリrootに設置
- `s3_website.yml` をレポジトリrootに設置。これは今回の仕組み上必要な設定を入れるもので、Pipelinesに必須のものではありません。
- Pipelines の `Environment variables` に `S3_ID` と `S3_SECRET` を保存。(S3にアクセするための物)

Pipelines を有効化

![Pipelinesを有効化.png](https://qiita-image-store.s3.amazonaws.com/0/47908/0f107cb0-893e-4cdb-b8f5-5954aef8e9e9.png "Pipelinesを有効化.png")



bitbucket-pipelines.yml

```
image: terapyon/sphinx-s3

pipelines:
  branches:
    master:
      - step:
          script:
            - pip install -r requirements.txt
            - make html
            - s3_website push
```

s3_website.yml

```
s3_id: <%= ENV['S3_ID'] %>
s3_secret: <%= ENV['S3_SECRET'] %>
s3_bucket: BUCKET-NAME # <- S3バケット名を指定

s3_endpoint: ap-northeast-1
s3_key_prefix: doc # <- S3フォルダ名を指定
site: build/html # <- レポジトリ上 or ビルド後の転送対象のフォルダを指定 
```

Environment variables

![Environment_variables.png](https://qiita-image-store.s3.amazonaws.com/0/47908/06e9277d-752c-a98a-6a0d-20cab527bd43.png "Environment_variables.png")



# 自動ディプロイ

設定が完了すると、push時に自動的にS3にHTMLが転送され、Webサーバで閲覧可能


# 最後に

このエントリーは、Bitbucketの自動ディプロイ方法を解説をしました。

部分的に記載ミスが残っている可能性があります。ミスについてはご指摘いただけたら幸いです。

著者関連Blog記事とあわせてお読みください。

[Bitbucket Pipeline で Sphinxドキュメント自動更新](https://www.cmscom.jp/blog/vtlfhk)