GitLab on Docker

GitLab のバージョンアップしてみたところ、スクリプトエラーになってしまうので、作り直そうかと。
せっかくなので、GitLab は Docker でも動作させることができるようなので、Docker やってみよう。
OS もサポートが終わりそうなので CentOS Stream にしますか。

インストールの参考は、GitLab Docker images (docs.gitlab.com)

Docker

$ sudo dnf install -y yum-utils
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
$ sudo dnf install -y docker-ce docker-ce-cli containerd.io
$ sudo systemctl start docker
$ sudo systemctl enable docker

Install Docker Compose (docs.docker.com)

$ sudo curl -L https://github.com/docker/compose/releases/download/1.28.2/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
$ sudo source /etc/bash_completion.d/docker-compose

GitLab

$ mkdir -p /var/opt/docker/gitlab
環境変数 GITLAB_OMNIBUS_CONFIG に、gitlab.rb の設定を書く。
SSHのポート変更しないと、dockerのホストのSSHと被り、起動しないので、変更する。
また、HTTPS でなく、HTTPの設定を入れる。
web:
  image: 'gitlab/gitlab-ce:latest'
  restart: always
  hostname: 'gitlab.lab.local'
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'http://gitlab.lab.local'
      # HTTP setting
      nginx['listen_https'] = false
      nginx['listen_port'] = 80
      nginx['redirect_http_to_https'] = false
      letsencrypt['enable'] = false
      # SSH port
      gitlab_rails['gitlab_shell_ssh_port'] = 2224
      # Time Zone
      gitlab_rails['time_zone'] = 'Asia/Tokyo'
      # LDAP setting
      gitlab_rails['ldap_enabled'] = true
      gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
        main: # 'main' is the GitLab 'provider ID' of this LDAP server
          label: 'Active Directory'
          host: 'lab.local'
          port: 636
          uid: 'sAMAccountName'
          bind_dn: 'CN=GitLab,CN=Users,DC=lab,DC=local'
          password: 'gitlabuser'
          encryption: 'simple_tls' # "start_tls" or "simple_tls" or "plain"
          verify_certificates: false
          smartcard_auth: false
          active_directory: true
          allow_username_or_email_login: true
          lowercase_usernames: true
          block_auto_created_users: false
          base: 'DC=lab,DC=local'
          user_filter: ''
        EOS
  ports:
    - '80:80'
    - '443:443'
    - '2224:22'
  volumes:
    - '/var/opt/docker/gitlab/config:/etc/gitlab:Z'
    - '/var/opt/docker/gitlab/logs:/var/log/gitlab:Z'
    - '/var/opt/docker/gitlab/data:/var/opt/gitlab:Z'
$ docker-compose up -d
$ sudo firewall-cmd --add-port=2224/tcp --permanent
$ sudo firewall-cmd --add-service={http,https} --permanent
$ sudo firewall-cmd --reload

以上で、ブラウザからアクセスできるようになる。

Exment 構築(LDAP連携設定)

Exment のログインをADを使ってログインできるように設定する。

  1. 管理者でログインする
  2. 左のメニューの「システム設定」をクリック
  3. 右上の「システム設定」ボタンをクリック
  4. 「ログイン設定」をクリック
  5. 右上の「+新規」ボタンをクリック
  6. 設定する
    記載したもの以外は任意で設定すればOK
項目名 設定値 備考
ログイン設定表示名 任意
ログイン種類 LDAP認証
LDAP名(英数字) lab ドメイン
ホスト名  192.168.200.1 DC のアドレス
ポート番号 636
基本DN(識別名) dc=lab,dc=local ドメインのDN
ユーザー検索属性 userPrincipalName
ログインコード接頭辞
ログインコード接尾辞 @lab.local ドメイン
SSL使用 YES
TLS使用 YES
ユーザーコード sAMAccountName
ユーザー名 cn
メールアドレス mail
アカウント検索列 ユーザーコード
ユーザー新規作成 YES YES にしない場合、事前にIDを作成しておく必要がある
  1. 「保存」ボタンをクリック
  2. ログインテスト
    1. 「ログインテスト」ボタンをクリック
    2. ログインできるか確認する。
    3. 確認ができたら「閉じる」ボタンをクリックする。
  3. 「有効化する」ボタンをクリック

ログアウトすると、ログインボタンが増え、ドメインのID、パスワードを入力し、ADのログインボタンでログインできるようになります。

Exment 構築

Exment という Web データベースを構築してみようと思います。 また、ログイン認証を DC でできるように設定も行おうと思います。

参考にする手順は下記。

インストール-概要 (exment.net)
Linuxによる環境構築 (exment.net)

OS 準備

動作 OS は CentOS 8 だと手順でエラーになるようなので、CentOS 7 で構築します。

項目
ホスト名 exment.lab.local
IPアドレス 192.168.200.20

SELinux 無効化

# vi /etc/selinux/config
# grep -v -e '^\s*#' -e '^\s*$' /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
# reboot

パッケージインストール

# yum install -y epel-release
# yum install -y wget unzip redis
# yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# yum install -y http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
# yum install -y --enablerepo=remi-php72 httpd openssl mod_ssl mysql php72 php72-php php-mbstring php-mysqli php-dom php-gd.x86_64 php-zip php-ldap
# yum install -y mysql-community-server

redis 設定

# vi /etc/redis.conf
# grep -v -e '^\s*#' -e '^\s*$' /etc/redis.conf
bind 0.0.0.0                                  ★変更
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
~(省略)~
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
# systemctl enable redis
# systemctl start redis.service

Firewall 設定

# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --add-service=https --zone=public --permanent
# firewall-cmd --reload
# firewall-cmd --permanent --new-zone=from_webserver
# firewall-cmd --reload
# firewall-cmd --permanent --zone=from_webserver --add-source="192.168.200.0/24"
# firewall-cmd --permanent --zone=from_webserver --add-port=3306/tcp
# firewall-cmd --zone=from_webserver --add-service=mysql
# firewall-cmd --reload
# firewall-cmd --permanent --zone=from_webserver --add-port=6379/tcp
# firewall-cmd --zone=from_webserver --add-service=redis
# firewall-cmd --reload

PHP 準備

PHP のパス設定

# ln -s /usr/bin/php72 /usr/bin/php
# php --version
PHP 7.2.34 (cli) (built: Jan  4 2021 14:34:52) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

利用モジュールのインストール

# cd ~/
# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
# php composer-setup.php
# php -r "unlink('composer-setup.php');"
# mv composer.phar /usr/local/bin/composer
# vi /etc/opt/remi/php72/php.ini
# grep -v -e '^\s*;' -e '^\s*$' /etc/opt/remi/php72/php.ini
[PHP]
engine = On
short_open_tag = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
~(省略)~
[curl]
[openssl]
extension=mbstring.so                     ★追加
extension=dom.so                          ★追加
extension=xml.so                          ★追加
extension=gd.so                           ★追加
extension=simplexml.so                    ★追加
extension=xmlreader.so                    ★追加
extension=xmlwriter.so                    ★追加
extension=zip.so                          ★追加
extension=mysqlnd.so                      ★追加
extension=mysqli.so                       ★追加
extension=pdo.so                          ★追加
extension=pdo_mysql.so                    ★追加
extension_dir=/usr/lib64/php/modules/     ★追加
extension=ldap.so                         ★追加

HTTP 設定

# vi /etc/httpd/conf/httpd.conf
# grep -v -e '^\s*#' -e '^\s*$' /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
~(省略)~
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf
<VirtualHost *:80>                      ★追加
  DocumentRoot /var/www/exment/public   ★追加
  <Directory /var/www/exment/public>    ★追加
    Allow from all                      ★追加
    AllowOverride All                   ★追加
    Require all granted                 ★追加
  </Directory>                          ★追加
</VirtualHost>                          ★追加
# systemctl enable httpd.service
# systemctl start httpd.service

Exment インストール

# cd /var/www
# wget https://exment.net/downloads/ja/exment.zip
# unzip exment.zip
# rm exment.zip -f
# cd exment
# chown apache:apache -R /var/www/exment
# chmod 775 -R /var/www/exment/storage
# chmod 775 -R /var/www/exment/bootstrap/cache

MySQL

MySQL 設定

# systemctl enable mysqld.service
# systemctl start mysqld.service
# cat /var/log/mysqld.log | grep password
2016-09-01T13:09:03.337119Z 1 [Note] A temporary password is generated for root@localhost: uhsd!XXXXXX

root@localhost: 以降がパスワードをメモする。

# vi /etc/my.cnf
# grep -v -e '^\s*#' -e '^\s*$' /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
validate-password=OFF                 ★追加
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# systemctl restart mysqld.service

DB 初期化

# mysql_secure_installation

Enter password for user root: (先ほど残したパスワードを入力)

New password: (新しいパスワードを入力)
Re-enter new password: (新しいパスワードを入力)

Change the password for root? : y

Remove anonymous users? : y #匿名ユーザーアカウントを削除
Disallow root login remotely? : y # ローカルホスト以外からアクセス可能な root アカウントを削除
Remove test database and access to it? : y # test データベースの削除
Reload privilege tables now? : y #privilegeテーブルを再読込

DB 構築

# mysql -u root -p
Enter password: (パスワード)

mysql> CREATE DATABASE exment_database;
mysql> CREATE USER 'exment_user'@'192.168.200.%' IDENTIFIED BY '(exment_user用のパスワード)';
mysql> GRANT ALL ON exment_database.* TO exment_user identified by '(exment_user用のパスワード)';
mysql> FLUSH PRIVILEGES;
mysql> quit

LDAP 関連インストール

# COMPOSER_MEMORY_LIMIT=-1 composer require predis/predis
# COMPOSER_MEMORY_LIMIT=-1 composer require adldap2/adldap2-laravel

.env

# vi .env
# cat .env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:XXXXXXXXXXXXXXXXXXXX
APP_DEBUG=true
APP_URL=http://192.168.200.20          ★変更
APP_LOCALE=ja                         ★追加
APP_TIMEZONE=Asia/Tokyo               ★追加

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=exment_database           ★変更
DB_USERNAME=exment_user               ★変更
DB_PASSWORD=<設定したパスワード>        ★変更

~(省略)~

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

EXMENT_INITIALIZE=1                  ★追加

証明書チェック無効

# vi /etc/openldap/ldap.conf
# grep -v -e '^\s*#' -e '^\s*$' /etc/openldap/ldap.conf
TLS_CACERTDIR   /etc/openldap/certs
SASL_NOCANON    on
TLS_REQCERT     never                ★追加
# systemctl restart httpd

Exment 設定

初期設定

ブラウザで、 http://192.168.200.20/admin にアクセスする。 画面に従って完了させる

Ansible 環境構築

YAML 形式の Playbook を作成して、構築が行える Ansible。
Ansible を使って、環境を構築できるように Ansible 環境を構築します~
環境の構成としては、とりあえず、以下。

【Ansible サーバ】
 192.168.200.13
【対象端末】
 192.168.200.21

Ansible インストール

まずは、RPM のパッケージをインストールして、Ansible サーバを構築します。

# dnf -y install epel-release
# dnf -y install ansible


# ansible --version 
ansible 2.9.14
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Apr 16 2020, 01:36:27) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]

パスワードなしで、対象端末を操作できるように鍵を生成する。

# ssh-keygen -t rsa -f $HOME/.ssh/id_rsa -N ""


Ansible で制御する端末を準備

Ansible で制御するには、対象の端末に以下の準備が必要になります。
作業は、対象端末上で行います。

  • Ansible 専用のアカウントの追加
  • パスワードなしで、root 権限でコマンドを実行できるように、設定

# useradd ansible
# passwd ansible

sudoers に ansible アカウントをパスワードなしで、実行できるように、設定を追加します。

# visudo
ansible ALL=(ALL)       NOPASSWD: ALL


Ansible サーバで、動作確認実施。

[root@ansible]$ ssh ansible@192.168.200.21
Last login: Xxx Xxx xx xx:xx:xx xxxx from 192.168.200.13
[ansible@target]$ sudo su -
Last login: Xxx Xxx xx xx:xx:xx xxxx from tty1
[root@target]$ 


Ansible サーバに対象を登録して、動作確認

制御端末のKeyを登録して、パスワード入力なしに制御できるようにします。
Ansible サーバで行います。

[root@ansible]$ ssh-copy-id ansible@192.168.200.21
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ansible@192.168.250.21's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'ansible@192.168.200.21'"
and check to make sure that only the key(s) you wanted were added.

設定を作成して、Ansible の ping モジュールを使って、動作するか確認します。

$ vi inventory/hosts
[test]
192.168.200.21  ansible_user=ansible
$ ansible -i inventory/hosts test -m ping
192.168.200.21 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

ここまでくれば、Ansible の Playbook を作成して、実行することで、Ansible を使った構築ができる!

Git Runner (Linux)

GitHub にコミットすると、ビルドする Git Runner の Linux 版を構築する。 公式には、Docker を使うのが推奨らしいが、VMでTry.

Git Runner が CentOS 8 未対応っぽい。(リポジトリみても、バイナリがない) なので、CentOS 7 の VM を作成。

最小構成でセットアップして、yum で最新化しておく。

ビルドに必要なツール類をインストール。

# yum -y groupinstall "Development Tools"

次にGit Runner をインストールする。

リポジトリ情報取得
# curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash

yum でインストール
# yum -y install gitlab-runner

Git Runner 登録をする。

リポジトリ 取得
# gitlab-runner register

入力内容は、Windows 版で入力した内容でほぼOK。 ただし、タグは、Linux にしておく。

Git Runner (Windows)

GitHub にコミットすると、ビルドする Git Runner の Windows 版を構築する。 まず、Windows マシンを構築。 ビルド環境に、Visual Studio Community をセットアップ!

Visual Studio Communit (visualstudio.microsoft.com) からセットアップの EXE をダウンロードして、インストールする。 なんでもできるように、一応、全オプション ON で。(^^;

次に、Git Runner は、Git を使ってソースを取得するので、 Downloading Git (git-scm.com) から取得して、Git をインストール。

最後に、 Files / master / GitLab.org / gitlab-runner / GitLab () Git Runner を取得して、格納。 Download から対象の環境にあったバイナリを取得します。

コマンドプロンプトを管理者権限で実行して以下を実行。

> gitlab-runner-windows-amd64.exe register
> gitlab-runner-windows-amd64.exe install

なお、register 時の入力の、URL, Token は、GitLab の Runners で表示されているものを入力。 また、Tag は、Windows とつけて、Windows のもののみを実行できるようにする。 executor は、shell で。

VSの環境変数BATがPowerShellだと微妙なので、cmdにする。 config.toml を編集します。

shell = "PowerShell"
shell = "cmd"

GitLab の Runners に表示されていれば OK。

後は、Git のリポジトリに、.gitlab-ci.yml に設定を書いてコミットすれば、コミットすると、Runner で Build とかできる。 以下にサンプルを書いておく。

variables:
  MSBuildEnv: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\VsDevCmd.bat'


stages:
  - build

msbuild:
  stage: build
  tags:
    - Windows
  script:
    - chcp 65001
    - Call "%MSBuildEnv%"
    - 'msbuild ConsoleApp.sln /t:clean;rebuild /p:Configuration=Release;Platform="Any CPU"'
  artifacts:
    paths:
      - ConsoleApp\bin\Release\ConsoleApp.exe
      - ConsoleApp\bin\Release\ConsoleApp.exe.config

GitLab構築

次に、GitLab を構築する。OS は、CentOS8 で。
パッケージの更新やら、ドメインの参加とかは、実施済みってことで進める。
GitLabの設定の際に、アクセスするアカウントとパスワードを設定する必要があるため、事前に、GitLab ユーザを作成しておく。

インストールの参考は以下。
Step 3: Install GitLab CE on CentOS 8 / RHEL 8 (computingforgeeks.com)

# dnf -y install curl \
                 vim \
                 policycoreutils \
                 python3-policycoreutils
# curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
# dnf -y install gitlab-ce

認証をActive Directoryで行うように、GitLab の設定。
設定した個所は以下。


# vi /etc/gitlab/gitlab.rb
# cat /etc/gitlab/gitlab.rb
external_url 'http://gitlab.lab.local'
gitlab_rails['time_zone'] = 'Asia/Tokyo'

gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
  main: # 'main' is the GitLab 'provider ID' of this LDAP server
    label: 'Active Directory'
    host: 'lab.local'
    port: 636
    uid: 'sAMAccountName'
    bind_dn: 'CN=GitLab,CN=Users,DC=lab,DC=local'
    password: 'gitlabuser'
    encryption: 'simple_tls' # "start_tls" or "simple_tls" or "plain"
    verify_certificates: false
    smartcard_auth: false
    active_directory: true
    allow_username_or_email_login: true
    lowercase_usernames: true
    block_auto_created_users: false
    base: 'DC=lab,DC=local'
    user_filter: ''
EOS

# gitlab-ctl reconfigure

確認
# gitlab-rake gitlab:ldap:check RAILS_ENV=production
Checking LDAP ...

LDAP: ... Server: ldapmain
not verifying SSL hostname of LDAPS server 'lab.local:636'
LDAP authentication... Success
LDAP users with access to your GitLab server (only showing the first 100 results)
        DN: cn=certificate service dcom access,cn=builtin,dc=lab,dc=local        sAMAccountName: Certificate Service DCOM Access
~ 省略 ~
        DN: cn=krbtgt,cn=users,dc=lab,dc=local   sAMAccountName: krbtgt

Checking LDAP ... Finished

Firewall を変更して、アクセスできるようにする。

# firewall-cmd --permanent --add-service={http,https} --permanent
# firewall-cmd --reload



最後に、ブラウザでアクセスして、初期設定。
初回アクセスの場合、root のパスワード設定があるので、設定する。
その後、「Standard」を選択して、root でログインする。
あとは、GitLab の設定をいろいろカスタマイズ。

Active Directory」を選択して、DC のアカウントでもログインできる。