開発環境テンプレート 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;

公式ダウンロードページ

$ 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.