開発環境テンプレート on WSL

# はじめに
WIP: 迷走してるなぁ, Docker使うと楽だけれどリソース消費が大きいなぁ.

開発環境を簡単に立てたい, 簡単に移行したい, Windowsアプリをビルドしたい.
Docker for Windowsでもできなくなさそうだが, WSLならより楽をできるのでは.
過去に, VM上になんやかんや構築すれば楽では？と考えたが, 挫折した経験あり.

# Common

とりあえず, Alpine. Debianでもいいかも (2020/11).

| Distribution | Size |
| :--- | :--- |
| Alpine | 2.6 MB |
| Debian | 199 MB |
| Kali   | 575 MB |
| Ubuntu | 980 MB |

```
$ cd ~
$ adduser nya
$ addgroup nya wheel
$ apk add sudo
$ visudo
```

`/etc/apk/repositories`に追記.

```
http://dl-cdn.alpinelinux.org/alpine/edge/main
http://dl-cdn.alpinelinux.org/alpine/edge/community
```

セットアップディレクトリを統一する目的もあって, 以降もrootで作業するかな.

# Builds
他に必要なのあるかな？

```
$ apk add vim gcc g++ make cmake git
```

# MariaDB

```
$ sudo apk add mariadb mariadb-client
$ sudo rm -R /var/lib/mysql/*
$ sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
$ sudo mysqld_safe&

$ mysql_secure_installation

```

# Gogs

```
$ sudo apk add gogs
$ sudo gogs web
```

MariaDBは中途で挫折中.

```
mysql> DROP DATABASE IF EXISTS gogs;
mysql> CREATE DATABASE IF NOT EXISTS gogs CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
mysql> CREATE USER 'gogs'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT ALL ON gogs.* TO 'gogs'@'localhost';
```

`http://localhost:3000/`にアクセスすると初期設定画面になるはず. とりあえずSQLite3.

## Docker版

とりあえず, SQLiteで, 実用になるかはわからない.

```
version: '3.3'
services:
  gogs:
    container_name: gogs
    image: gogs/gogs:latest
    restart: always
    ports:
        - 3000:3000
    volumes:
        - ./data:/data
```

# Redmine

```
$ sudo apk add openssl-dev
$ sudo apk add ruby ruby-dev ruby-bundler
$ sudo apk add apache2 apache2-ctl apache2-dev imagemagick
$ sudo gem install passenger --no-ri --no-rdoc -V
$ sudo passenger-install-apache2-module
```

```
CREATE DATABASE redmine CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';
FLUSH PRIVILEGES;
```

[公式ダウンロードページ](https://www.redmine.org/projects/redmine/wiki/Download)

```
$ sudo mkdir -p /var/www/
$ tar zxvf redmine-x.x.x.tar.gz
$ sudo mv ./redmine-x.x.x /var/www/redmine
$ sudo chown -R redmine:redmine /var/www/redmine
$ cd /var/www/redmine/config
```

データベースの設定, `production`以外は削除してしまっていいと思います.

```
$ sudo cp ./database.yml.example ./database.yml
$ sudo cp ./configuration.yml.example ./configuration.yml
```

`/var/www/redmine/config/initializers/utf8mb4.rb`

```
ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters

    class AbstractMysqlAdapter
      def create_table_with_innodb_row_format(table_name, options = {})
        table_options = options.merge(:options => 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC')
        create_table_without_innodb_row_format(table_name, table_options) do |td|
          yield td if block_given?
        end
      end
      alias_method_chain :create_table, :innodb_row_format
    end

  end
end
```
WIP

## Docker版

```
version: '3.3'
services:
  redmine:
    container_name: redmine
    image: redmine:alpine
    restart: always
    ports:
      - 8100:3000
    volumes:
      - ./data/plugins:/usr/src/redmine/plugins
      - ./data/themes:/usr/src/redmine/public/themes
    environment:
      REDMINE_DB_MYSQL: redmine-db
      REDMINE_DB_PASSWORD: redmine
  redmine-db:
    image: mariadb
    container_name: redmine-db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: redmine
      MYSQL_DATABASE: redmine
    volumes:
      - ./data/db:/var/lib/mysql
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
```

ログインは, `admin`, `admin`.



# Jenkins

Jenkinsはメンテナンスする人間としては不満しかない. じゃあお前が作れという話ではあるが, そんな意欲はない.
GoCDは環境構築挫折中なので待たれよ (おそらく挫折したまま終わる).

```
apk add openjdk11-jre ttf-dejavu
mkdir jenkins;cd jenkins
wget https://get.jenkins.io/war-stable/2.249.3/jenkins.war
cd ..
```

プロキシの内側だとコマンドラインで指定しないと, プラグインインストールで詰みます.

```
java -jar ./jenkins/jenkins.war -Dhttp.proxyHost=xxx.xxx.xxx.xxx -Dhttp.proxyPort=8080 -Dhttps.proxyHost=xxx.xxx.xxx.xxx -Dhttps.proxyPort=8080 -Dhttps.protocols=TLSv1.1,TLSv1.2 -jar jenkins.war --httpPort=8090 > /dev/null 2&>1 &
```

一度起動すれば, `$HOME/.jenkins/secrets/initialAdminPassword`が作成されるので, adminでログインする.

## テスト
本命なのですが, メンテナンスする人間には苦痛かも.
シェルの実行, 警告が出るが動くかな.

```
/mnt/c/Windows/System32/cmd.exe /c echo test
```

# 起動
WSLの欠点は起動スクリプトが動作しないことかな.

```
#!/bin/sh
java -jar /root/jenkins/jenkins.war --httpPort=8090 -Djava.awt.headless=true > /dev/null  2>&1 &
```

# まとめ

Dockerを使うとどうしてもリソースを喰うのはどうしようもない.
ビルド済みが上手くいかなくて, ソースからビルドするために, wgetやgolangをインストールしているのが無駄になっている.

WSLの〇ちがいぶりは, はじめから`/mnt/`にWindowsディレクトリがマウントされていることなどかわいいもので, エクスプローラからLinuxのファイルシステムが見えること.

```
\\wsl$
```

# TODO

- しばらく運用後, 別環境に移動した場合に正常に動作するか.
- GoCD とか

# OpenProject
Redmineと両方は重いのではずす.

```
$ git clone --depth=1 --branch=stable/11 https://github.com/opf/openproject
$ cd openproject
$ docker-compose up -d
```

`http://localhost:8080` にアクセスする, 初期設定は `admin`, `admin`.