JenkinsにG-Suiteアカウントでログインする

# ターゲット

- G-SuiteアカウントでJenkinsのユーザの管理を出来るようにしたい人

# 設定手順

## EC2 Instance

インスタンス性能

- マシンイメージ: Ubuntu Server 20.04 LTS (HVM), SSD Volume Type
- インスタンスタイプ: t2.micro
- ストレージ: /dev/sda1, 8GiB, gp3

その他

- インスタンスはパブリックサブネット上に構築
- パブリックIPアドレスにはEIPを割り当ててもいいが、今回はデフォルトのパブリックIPアドレスを使用
- パブリックサブネットに構築するので、セキュリティグループは自身の環境に合わせて要検討

## Route 53

- EC2 InstanceのパブリックIPアドレスに対するAレコードを作成（以下、例として登録したドメインは `jenkins.example.com`）
- Route53にIPを指定したAレコードを作成した場合の料金
    - 標準的クエリ
        - 0.20USD 100 万クエリごと – 最初の 10 億クエリ / 月
        - 0.20USD 100 万クエリごと – 10 億クエリ超過 / 月
    - refs: https://aws.amazon.com/jp/route53/pricing/
- EC2インスタンスの前にALBを設置し、AレコードをインスタンスのパブリックIPアドレスではなく、ALBにするとRoute53のクエリへの応答の料金は無料になるが、ALBの料金がかかるのでそこは要検討
    - refs: https://aws.amazon.com/jp/elasticloadbalancing/pricing/

## Install Jenkins

*openjdk*

```sh
sudo apt update
sudo apt install -y openjdk-11-jdk
java -version
  # openjdk version "11.0.11" 2021-04-20
  # OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
  # OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)
```

*jenkins*

```sh
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \
    /etc/apt/sources.list.d/jenkins.list'
sudo apt update
sudo apt install -y jenkins
```

refs: https://www.jenkins.io/doc/book/installing/linux/

*nginx*

```sh
sudo apt install -y nginx
```

Jenkinsへリダイレクトするための設定を追加（`server_name` はRoute53で設定した名称を指定）

```sh
cat << 'EOT' | sudo tee /etc/nginx/conf.d/jenkins.conf
upstream jenkins {
  keepalive 32; # keepalive connections
  server 127.0.0.1:8080; # jenkins ip and port
}

# Required for Jenkins websocket agents
map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

server {
  listen          80;       # Listen on port 80 for IPv4 requests

  server_name     jenkins.example.com;  # replace 'jenkins.example.com' with your server domain name

  # this is the jenkins web root directory
  # (mentioned in the /etc/default/jenkins file)
  root            /var/run/jenkins/war/;

  access_log      /var/log/nginx/access.log;
  error_log       /var/log/nginx/error.log;

  # pass through headers from Jenkins that Nginx considers invalid
  ignore_invalid_headers off;

  location ~ "^/static/[0-9a-fA-F]{8}\/(.*)$" {
    # rewrite all static files into requests to the root
    # E.g /static/12345678/css/something.css will become /css/something.css
    rewrite "^/static/[0-9a-fA-F]{8}\/(.*)" /$1 last;
  }

  location /userContent {
    # have nginx handle all the static requests to userContent folder
    # note : This is the $JENKINS_HOME dir
    root /var/lib/jenkins/;
    if (!-f $request_filename){
      # this file does not exist, might be a directory or a /**view** url
      rewrite (.*) /$1 last;
      break;
    }
    sendfile on;
  }

  location / {
    sendfile off;
    proxy_pass         http://jenkins;
    proxy_redirect     default;
    proxy_http_version 1.1;

    # Required for Jenkins websocket agents
    proxy_set_header   Connection        $connection_upgrade;
    proxy_set_header   Upgrade           $http_upgrade;

    proxy_set_header   Host              $host;
    proxy_set_header   X-Real-IP         $remote_addr;
    proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_max_temp_file_size 0;

    #this is the maximum upload size
    client_max_body_size       10m;
    client_body_buffer_size    128k;

    proxy_connect_timeout      90;
    proxy_send_timeout         90;
    proxy_read_timeout         90;
    proxy_buffering            off;
    proxy_request_buffering    off; # Required for HTTP CLI commands
    proxy_set_header Connection ""; # Clear for keepalive
  }
}
EOT
```

```sh
sudo systemctl restart nginx
```

refs: https://www.jenkins.io/doc/book/system-administration/reverse-proxy-configuration-nginx/

## Getting Started Jenkins

- ブラウザからログイン（ 例の場合なら、http://jenkins.example.com ）
- Unlock Jenkins
    - Administrator passwordをサーバから確認し貼りつけて Continue
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/6ead9593-6c19-fb7a-906e-10a48f3daa12.png)

- Customize Jenkins
    - Install suggested pluginsを選択
    - Pluginについてはセットアップ後に必要な分については設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/48749c31-be5b-4bc8-d7cb-e47d4d0f3bff.png)

- Create First Admin User
    - 初回ログインしG-Suiteでログイン可能にするまでの設定を行うユーザを作成
    - 必要な項目を入力し、Save and Continue
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/0635e5b1-a3e0-86e3-ed08-80551aa52f14.png)

- Instance Configuration
    - Jenkins URLはログインの時のURL（ 例の場合なら、http://jenkins.example.com ）になっていると思うので、そのまま Save and Finish
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/0e846095-07b7-0d64-5455-edc47368cd96.png)

- Jenkins is ready!
    - Start using Jenkins
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/94ba5a9c-1afe-4070-62ba-736b2b209ee4.png)

## GCP

- 新しいプロジェクトを作成します。プロジェクトの一覧画面から「新しいプロジェクト」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/7d7cd7dc-12a3-7038-47c3-2879eba80a61.png)

**新しいプロジェクト**

- プロジェクト名: jenkins-oauth（任意）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/49acf77d-d11b-930f-c3ce-4022f949d086.png)

- プロジェクトが作成されたら、認証情報（APIとサービス > 認証情報）の設定画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/cb0318ab-6d8e-c601-2649-70b4ee502141.png)

- 認証情報の設定を完了させるためにはOAuth同意画面の設定が必要になるため、最初に同意画面を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/73d53743-f3bb-e3fa-f214-2848b1d72831.png)

**OAuth同意画面**

- OAuth同意画面
    - User Type: 外部
- アプリ登録の編集
    - OAuth同意画面（最小限の設定のみ記載）
        - アプリ名: Jenkins（任意）
        - ユーザーサポートメール: （任意）
        - デベロッパーの連絡先情報: （任意）
- スコープ
    - 未設定
- テストユーザー
    - テスト中にログイン可能なアカウントを設定

**認証情報**

- 同意画面を作成したら認証情報を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/19cc23cb-3880-fa13-b19a-2bd9aaac04c3.png)

- OAuthクライアントIDの作成
    - アプリケーションの種類: ウェブアプリケーション
    - 名前: Web Client（任意）
    - 承認済みのJavaScript生成元: http://jenkins.example.com （例の場合の設定）
    - 承認済みのリダイレクトURI: http://jenkins.example.com/securityRealm/finishLogin （例の場合の設定）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/eb64ad36-fc64-0280-02da-9f6732e82c41.png)

- OAuthクライアントを作成すると、クライアントIDとクライアントシークレットが発行されます。これらはJenkinsの設定で利用するので、メモしておいて下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/4d2af9d8-1f56-a29a-cc09-b9974f50cf43.png)

## Setup Jenkins

- Jenkinsに再度ログインし、G-Suiteのアカウントでログイン出来るように設定します。
- プラグインの管理ページを開きます（Jenkinsの管理 > プラグインの管理）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/00be107b-996d-f04b-84df-e1d2e0f989f4.png)
- 利用可能なプラグインから「Google Login」を検索、チェックし、Install without restart
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/de7a6bd5-8c56-1d9a-7cae-df534df9a168.png)
- インストール後、ログインの設定画面を開きます（Jenkinsの管理 > グローバルセキュリティの設定）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/8f33822e-a32b-9856-0e35-f8dc886251c1.png)
- ユーザー情報で「Login with Google」を選択し、GCPで作成したOAuthクライアント情報を入力します。
    - Google Apps Domainには、認証を許可するG-Suiteのドメインを指定します。
    - 例えばG-Suiteのドメインが `example.co.jp` であれば、`example.co.jp`を入力してください。この場合、Jenkinsのサイトのドメインが`example.com`だとして、そのドメインとは関係ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/8b0ec125-5d8b-ab59-8269-b0db4a0929f0.png)

refs: https://github.com/jenkinsci/google-login-plugin

# 最後に

- 設定は以上です。
- お手持ちのG-SuiteアカウントからJenkinsへログイン出来ると思います。
- また、設定の不備等があることを想定し、最初のadminユーザでログインした状態のブラウザは残しておいた方がいいかもしれません。

# 関連記事

- [Jenkinsでaws-cliをつかう](https://qiita.com/ot-nemoto/items/502080184f9705d1f3ba)