JetBrains CI サーバー TeamCity 9.1 を構築する

まず、TeamCity について。
そもそもご存じない方が多いように思うので、ヒトコトで紹介すると、IntelliJ IDEA の開発で有名な JetBrains 製の CI サーバーです。

オンプレミスの CI サーバーとしては、世の中的に Jenkins の方が有名ではありますが、プロジェクトの階層化に対応しており、ビルド構成も非常に見通しやすく、個人的に非常に気に入っています。

JetBrains 製ということでライセンス形態が気になるところですが、20のビルド構成、3つのビルドエージェントまでは、すべての機能が無償で利用することが可能です。
複数のプロダクトを1つのサーバーで横断的に管理したいなどでなければ、無償の範囲で十分に運用できそうです。

さっそく構築してみます。

# 環境

- ConoHa by GMO メモリ 1GB プラン
- Ubuntu 14.04 LTS
- Java 8
- PostgreSQL 9.3
- TeamCity 9.1.6

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.3 LTS"
$ java -version
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)
$ psql --version
psql (PostgreSQL) 9.3.10
```

# ダウンロード - TeamCity

JetBrains の公式ページより。
https://www.jetbrains.com/teamcity/download/#section=linux-version

インスタンスへ直接ダウンロードする場合は、ダウンロード ページにダイレクト リンクがあるので、これを利用する。
展開、配置、起動までおこなっておく。

```
$ cd ~
$ wget https://download.jetbrains.com/teamcity/TeamCity-9.1.6.tar.gz
$ tar -zxvf TeamCity-9.1.6.tar.gz

$ sudo mkdir -p /opt/lib/
$ sudo mv TeamCity /opt/lib/TeamCity-9.1.6
$ sudo ln -s /opt/lib/TeamCity-9.1.6 /opt/lib/teamcity

$ sudo /opt/lib/teamcity/bin/runAll.sh start
```

この時点で、TeamCity は起動している。
`http://{server.address}:8111/` へアクセスすることで、起動は確認できる。
ウィザードを進めることで、セットアップはできるがまだしない。

# セットアップ - データベース

手軽に利用を開始したければ、内部データベースとして HSQLDB も利用することができるので、データベースのセットアップはスキップしてもいい。

ただし、サーバーの負荷状況次第で、万が一 TeamCity が不調に陥ったりして不正に停止してしまったりすると、内部データベースが巻き込まれ、構成情報が破損する場合があるため、可能な限りデータベースは別で構築しておくのがオススメ。
また、データベースのバックアップやスケールなど、可用性を高めたい場合も、別途データベースをセットアップしておく必要がある。

今回は、PostgreSQL をセットアップする。
apt-get でインストールして、TeamCity 用のユーザー、データベースを作成する。

```
$ sudo apt-get install postgresql
$ sudo apt-get install postgresql-client

$ sudo su postgres
[sudo] password for :

postgres@..$ createuser -P -d -l teamcity
Enter password for new role:
Enter it again:

postgres@..$ psql
psql (9.3.10)
Type "help" for help.

postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of
-----------+------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication | {}
 teamcity  | Create DB                                      | {}

postgres=# CREATE DATABASE teamcity;
CREATE DATABASE

postgres=# ALTER USER teamcity SET search_path to teamcity;
ALTER ROLE

postgres=# \connect teamcity;
You are now connected to database "teamcity" as user "postgres".

teamcity=# CREATE SCHEMA teamcity AUTHORIZATION teamcity;
CREATE SCHEMA

teamcity=# \q
postgres@..$ exit
exit

$ cd /
```

# セットアップ - TeamCity

ここまでで、TeamCity を利用するための準備は完了。
今度こそ、`http://{server.address}:8111/` へアクセスして、セットアップを進める。

セットアップ ウィザードでは、はじめにデータ ディレクトリのロケーション指定を求められる。
今回は、`/var/opt/teamcity` にディレクトリを作成して指定する。

```
$ sudo mkdir -p /var/opt/teamcity
```

| Property                | Value                          |
|:------------------------|:-------------------------------|
| Data Directory location | /var/opt/teamcity/.BuildServer |

<img width="900" alt="スクリーンショット 2016-02-07 1.12.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/2140fe65-8b6f-6650-352c-0353e88ff47f.png">

ウィザードを進めて、先ほど おこなったデータベースのセットアップのとおり、接続情報を入力する。

| Property             | Value          |
|:---------------------|:---------------|
| Database host[:port] | localhost:5432 |
| Database name        | teamcity       |
| User name            | teamcity       |
| Password             | ****           |

<img width="1311" alt="スクリーンショット 2016-02-06 23.06.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/8ef65eb3-9c83-7a03-1301-28f7a3c99ba3.png">

ここで、JDBC ドライバーの配置が必要になるため、ダウンロードと配置をおこなう。
PostgreSQL の場合はこちらから。
https://jdbc.postgresql.org/download.html#current

```
$ cd /var/opt/teamcity/.BuildServer/lib/jdbc
$ sudo wget https://jdbc.postgresql.org/download/postgresql-9.4.1207.jre7.jar
```

ダウンロードしたら、セットアップウィザード上の [Reflesh JDBC drivers] ボタンをクリックして、ダウンロードしたドライバーを認識させる。

<img width="1311" alt="スクリーンショット 2016-02-06 23.08.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/e833a1ec-ce28-d7b8-c49d-f46bbee53c07.png">

ドライバーが認識されたら、引き続きウィザードを進めていく。

次に、License Agreement の確認を求められるので、[Accept license agreement] をチェックして [Continue >>] する。

<img width="834" alt="スクリーンショット 2016-02-06 23.11.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/2905bfa4-71ef-cb13-5e44-2db763b60cff.png">

以上でセットアップは完了する。

初回利用時に、管理者アカウントの作成が求められるので、これを作成してログインすることで、利用できるようになる。

<img width="634" alt="スクリーンショット 2016-02-06 23.11.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/e86c5387-0a64-7c83-eb39-7393e0644146.png">

ログイン後。
画面左上の [Projects] から、プロジェクトの作成がおこなえる。

<img width="1423" alt="スクリーンショット 2016-02-06 23.13.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/07dc98f6-6ac5-5abf-ee73-1f24877608af.png">

Github などからプロジェクトの URL を持ってくれば、[+Create project from URL] で、簡単にプロジェクトの作成がおこなえる。

<img width="643" alt="スクリーンショット 2016-02-06 23.14.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/14794ec1-3db9-31a7-f77e-f4db17a1800f.png">