今回は、DockerコンテナのGitLabとRedmineをQNAPのNAS上に構築します。GitLabとRedmineは、Gitリポジトリおよびチケットを連携させて運用できるようにし、データは名前付きボリュームに格納します。
はじめに
ソースコードを簡単に管理できる場所が欲しいので、QNAP NAS TS-253BEのContainer Station機能を使って、コンテナでGitLab 13.6.1とRedmine 4.1.1を構築します。GitLabとRedmineは連携設定して、Gitリポジトリの共有とコミット時のチケット履歴を可能にします。今回の手順では、ローカルフォルダ等は使用していないためどの環境にでも構築できます。
コンテナ
YAML
Container Station標準でもGitLab・Redmineのアプリは存在しますが、これを使うと連携設定は出来ません。なので、Container Stationの管理画面上からDocker-Composeを実行して、Dockerコンテナを作成します。そのYAMLが下記です。
ポイントは、以下の通りです。
- 名前付きボリュームでデータを永続化
 - GitLabのデータをRedmineと共有(参考:External Issue Trackers)
 - GitLabのHOST名gitlabを、ホストマシンから利用時名前解決要
 - 今はHTTPなのでいつかHTTPS化
 
version: '2.3'
services:
  redis:
    restart: always
    image: redis:5.0.9
    command:
    - --loglevel warning
    volumes:
    - redis-data:/var/lib/redis:Z
  gitlab-postgresql:
    restart: always
    image: sameersbn/postgresql:11-20200524
    volumes:
    - gitlab-postgres-data:/var/lib/postgresql:Z
    environment:
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production
    - DB_EXTENSION=pg_trgm,btree_gist
  gitlab:
    restart: always
    image: sameersbn/gitlab:13.6.1
    depends_on:
    - redis
    - gitlab-postgresql
    ports:
    - "10080:80"
    - "10022:22"
    volumes:
    - gitlab-data:/home/git/data:z
    environment:
    - DB_ADAPTER=postgresql
    - DB_HOST=gitlab-postgresql
    - DB_PORT=5432
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production
    - REDIS_HOST=redis
    - REDIS_PORT=6379
    - TZ=Asia/Tokyo
    - GITLAB_TIMEZONE=Tokyo
    - GITLAB_HTTPS=false
    - SSL_SELF_SIGNED=false
    - GITLAB_HOST=gitlab
    - GITLAB_PORT=10080
    - GITLAB_SSH_PORT=10022
    - GITLAB_RELATIVE_URL_ROOT=
    - GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string
    - GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string
    - GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string
  redmine-postgresql:
    restart: always
    image: sameersbn/postgresql:11-20200524
    environment:
    - DB_USER=redmine
    - DB_PASS=password
    - DB_NAME=redmine_production
    volumes:
    - redmine-postgres-data:/var/lib/postgresql:Z
  redmine:
    restart: always
    image: sameersbn/redmine:4.1.1-8
    depends_on:
    - redmine-postgresql
    - gitlab
    environment:
    - TZ=Asia/Tokyo
    - DB_ADAPTER=postgresql
    - DB_HOST=redmine-postgresql
    - DB_PORT=5432
    - DB_USER=redmine
    - DB_PASS=password
    - DB_NAME=redmine_production
    - REDMINE_PORT=10083
    - REDMINE_HTTPS=false
    ports:
    - "10083:80"
    volumes:
    - redmine-data:/home/redmine/data:Z
    - redmine-data:/var/log/redmine:Z
    volumes_from:
    - gitlab
volumes:
  redis-data:
  redmine-postgres-data:
  gitlab-postgres-data:
  redmine-data:
  gitlab-data:作成
コンテナを作成する手順は、下記です。
- Container Stationを起動し、[作成] > [アプリケーションの作成]をクリックします。
 - アプリケーション作成画面で、アプリケーション名gitlab(任意)と入力し、上記YAMLを貼り付けて、検証後、[作成]ボタンをクリックします。
 - 全部で5つのコンテナが起動していれば成功です。
 - 各アプリケーションのアクセス先は以下の通りです。
- GitLab
http://{NASのIPアドレス}:10080/
初期アカウント:root / {初回ログイン指定時のパスワード} - Redmine
http://{NASのIPアドレス}:10083/
初期アカウント:admin / admin 
 - GitLab
 
プロジェクト作成
GitLabにrootアカウント、Redmineにadminアカウントでログインし、それぞれプロジェクトを新規作成します。GitLabプロジェクト作成時、Readmeを初期設定で追加する方が後の確認が楽です。
ここでは、手順の詳細は割愛します。
リポジトリ連携
GitLabの設定
GitLabにログインし、[Admin Area] > [Projects] > [{連携対象となるプロジェクト名}] をクリックします。画面中央にあるGitaly relative pathを確認します。後で、Redmineにこのリポジトリパスを登録します。
以前は、Legacyフォルダの様なフォルダ形式でしたが、GitLabバージョン13.0以降はデフォルトでHashed Storage形式が採用される様になっています。以前のLegacyフォルダ形式は、バージョン14から廃止予定の模様です。詳しくは、公式ドキュメントRepository storage typesを参照ください。
- Hashed Storageリポジトリフォルダ形式
@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git - Legacyリポジトリフォルダ形式
(namespace)/(projectname).git 
Redmineの設定
Redmineにログインし、[プロジェクト] > [{連携対象となるプロジェクト名}] > [設定] > [リポジトリ] > [新しいリポジトリ]をクリックします。以下のパラメーターを設定し、[作成]ボタンをクリックします。
- バージョン管理システム:Git
 - リポジトリのパス:/home/git/data/repositories/{先ほど確認したリポジトリパス}
ex. /home/git/data/repositories/@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git - 最新コミットを表示する:チェックする
 
動作確認
ファイルがコミットされている場合、リポジトリタブもしくは設定のリポジトリ一覧から識別子をクリックすると、ファイルのリポジトリ状態が確認できます。コミットされたファイルが0の場合、404エラーとなります。
チケット連携
Redmineの設定
Redmineにログインし、[管理(プロジェクトではなくホームにある方)] > [設定] > [リポジトリ]をクリックします。下記を設定し、[保存]ボタンをクリックします。ここで生成したAPIキーは、後でGitLabに登録します。
- Git:チェックする
 - コミットを自動取得する:チェックする
 - リポジトリ管理用のWebサービスを有効にする:チェックする
 - APIキー:[キーの生成]ボタンをクリックする
 
また、動作確認用に連携対象プロジェクトにチケットを作成しておきます。
GitLabの設定
GitLabにログインし、[Admin Area] > [Settings] > [Network] > [Outbound requests]をクリックします。Allow requests to the local network from web hooks and servicesにチェックして、[Save changes]ボタンをクリックします。
次に、[{連携対象プロジェクト}] > [Settings] > [Webhooks]をクリックします。下記を設定し、[Add webhook]ボタンをクリックします。URLに設定する”Redmine”は、コンテナ内部で名前解決します。登録後、[Test]ボタンクリックでPush eventsを指定し200が返ればOKです。
- URL:http://redmine/sys/fetch_changesets?key={RedmineのAPIキー}
ex. http://redmine/sys/fetch_changesets?key=boF0mdvGEhGrjjekNS7r - Push events:チェックする
 - Enable SSL verification:チェックしない
 
動作確認
GitLabからプロジェクトをCloneし、何か編集してコミットします。この際、コミットメッセージに”refs #1″の様にチケット番号を追加してください。その後、リモートリポジトリにPUSHして、Redmineのチケット#1を確認すると、コミットメッセージが紐づけられていることが分かります。
まとめ
GitLabとRedmineを連携させることで、快適なソース管理環境が作成できました。コンテナなので、再構築等メンテが簡単です。また、NAS上に構築することで、ランニングコストの低い24時間稼働サーバーにすることができました。
以上、RedmineとGitLabの連携手順紹介でした。













コメント