GitLab CIでオブジェクトストレージにアーティファクトをアップロードする（Azureの場合）

# はじめに

GitLab（セルフマネージド版）でオブジェクトストレージにアーティファクトをアップロードする手順のメモです。

## 環境
- GitLab（セルフマネージド版）
    - Dockerコンテナで起動
- Azure
    - Azure Blob ストレージアカウント


## オブジェクトストレージの設定
今回はAzureストレージアカウントを使います。

### 1. ストレージアカウントの作成
はじめにストレージアカウントを作成します。
任意のアカウント名で作成します。今回はネットワーク周りは考慮しません。

### 2. 接続情報の取得
以下の情報をメモしておきます。
- アカウント名
- アクセスキー
- ドメイン名（設定していれば）
    - デフォルトは`blob.core.windows.net`

### 3. コンテナの作成
保存先のコンテナを作成しておく必要があります。
作成したストレージアカウントに任意の名前のコンテナを作成してください。
今回は`gitlab-artifacts`にします。

Azure側の準備は以上です。

### 4. gitlab.rbの設定更新
gitlabにオブジェクトストレージ設定を追加します。
`gitrab.rb`に下記を記載します。デフォルトでコメントアウトされているはずです。

```rb
gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['proxy_download'] = true
gitlab_rails['object_store']['connection'] = {
    'provider' => 'AzureRM',
    'azure_storage_account_name' => '<AZURE STORAGE ACCOUNT NAME>',
    'azure_storage_access_key' => '<AZURE STORAGE ACCESS KEY>',
    'azure_storage_domain' => 'blob.core.windows.net'
}
# アーティファクト以外を無効化
gitlab_rails['object_store']['objects']['artifacts']['bucket'] = 'gitlab-artifacts'
gitlab_rails['object_store']['objects']['external_diffs']['enabled'] = false
gitlab_rails['object_store']['objects']['lfs']['enabled'] = false
gitlab_rails['object_store']['objects']['uploads']['enabled'] = false
gitlab_rails['object_store']['objects']['packages']['enabled'] = false
gitlab_rails['object_store']['objects']['dependency_proxy']['enabled'] = false
gitlab_rails['object_store']['objects']['terraform_state']['enabled'] = false
gitlab_rails['object_store']['objects']['ci_secure_files']['enabled'] = false
gitlab_rails['object_store']['objects']['pages']['enabled'] = false
```

#### 細かい説明
`gitlab_rails['object_store']`セクション下の設定を変更します。

https://gitlab-docs.creationline.com/ee/administration/object_storage.html

`enabled`は`ture`にしましょう。
`proxy_download`はプロキシ設定が必須なら`true`にしましょう。

```rb
gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['proxy_download'] = true
```

`connection`に下記設定を行います。

```rb
gitlab_rails['object_store']['connection'] = {
    'provider' => 'AzureRM',
    'azure_storage_account_name' => '<AZURE STORAGE ACCOUNT NAME>',
    'azure_storage_access_key' => '<AZURE STORAGE ACCESS KEY>',
    'azure_storage_domain' => 'blob.core.windows.net'
}
```
- `provider`：`AzureRM`にします。
- `azure_storage_account_name`：作成した**ストレージアカウント名**
- `azure_storage_access_key`：取得した**アクセスキー**
- `azure_storage_domain`：カスタムドメイン名、何も設定してなければデフォルト値
    - デフォルト値は`blob.core.windows.net`です。

`objects`でファイルの種類に応じてオブジェクトストレージに保存するか設定できます。
デフォルトではすべてのファイルが保存される設定になっています。
今回はアーティファクトのみ保存したいので、アーティファクトだけ有効に、それ以外は無効にする設定にします。

```rb
# Blobストレージのコンテナ名をbucketに指定
gitlab_rails['object_store']['objects']['artifacts']['bucket'] = 'gitlab-artifacts'
# アーティファクト以外は無効化
gitlab_rails['object_store']['objects']['external_diffs']['enabled'] = false
gitlab_rails['object_store']['objects']['lfs']['enabled'] = false
gitlab_rails['object_store']['objects']['uploads']['enabled'] = false
gitlab_rails['object_store']['objects']['packages']['enabled'] = false
gitlab_rails['object_store']['objects']['dependency_proxy']['enabled'] = false
gitlab_rails['object_store']['objects']['terraform_state']['enabled'] = false
gitlab_rails['object_store']['objects']['ci_secure_files']['enabled'] = false
gitlab_rails['object_store']['objects']['pages']['enabled'] = false
```

コンテナでGitLabを動かしてる場合は、`docker-compose.yml`に追記する形でもOKです。
下記のように`environment`の`GITLAB_OMNIBUS_CONFIG`下に同様の記載をします。

```yml
version: '3.6'
services:  
  gitlab:    
    environment:         
      GITLAB_OMNIBUS_CONFIG: |    
        gitlab_rails['object_store']['enabled'] = true
        ## 以下にgitlab.rbと同様の記載を行う
```

最後にgitlabを再起動します。

```bash
docker compose up -d
```

## おまけ：Blobストレージに保存されているのを確認する

ちゃんとオブジェクトストレージ設定が正しく設定されているか確認するために、Blobストレージ側でも保存されているか確認します。

ストレージブラウザーで保存先のコンテナを見るとディレクトリが作成されています。このどこかにアーティファクトが保存されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535910/bdb0c3b3-7e7b-b291-6863-58e3deb34ab0.png)

自分の場合は`@final`下に存在することを確認しました。ここでアーティファクトを管理することはないと思いますが、保存や削除が正しくできていることを確認したいときは`@final`下を探してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535910/f9b325f2-c15a-cf8a-4607-3006598e228e.png)