Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .devcontainer/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
APP_PORT=8000
SELENIUM_PORT_1=4444
SELENIUM_PORT_2=5900
MAILCATCHER_PORT=1080
RAILS_DB_ADAPTER=postgresql
17 changes: 17 additions & 0 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# [Choice] Ruby version (use -bullseye variants on local arm64/Apple Silicon): 3, 3.1, 3.0, 2, 2.7, 2.6, 3-bullseye, 3.1-bullseye, 3.0-bullseye, 2-bullseye, 2.7-bullseye, 2.6-bullseye, 3-buster, 3.1-buster, 3.0-buster, 2-buster, 2.7-buster, 2.6-buster
ARG VARIANT=3.1-bullseye
FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT}

# Default value to allow debug server to serve content over GitHub Codespace's port forwarding service
# The value is a comma-separated list of allowed domains
ENV RAILS_DEVELOPMENT_HOSTS=".githubpreview.dev"

# [Choice] Node.js version: lts/*, 16, 14, 12, 10
ARG NODE_VERSION="lts/*"
RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"

# [Optional] Uncomment this section to install additional OS packages.
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
&& apt-get -y install --no-install-recommends bzr gsfonts imagemagick libmagick++-dev

EXPOSE $APP_PORT
2 changes: 2 additions & 0 deletions .devcontainer/create-db-user.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
CREATE USER vscode CREATEDB;
CREATE DATABASE vscode WITH OWNER vscode;
44 changes: 44 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Update the VARIANT arg in docker-compose.yml to pick a Ruby version
{
"name": "Redmine dev mirror",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "/workspace",
"shutdownAction": "stopCompose",
// Configure tool-specific properties.
"customizations": {
// Configure properties specific to VS Code.
"vscode": {
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"rebornix.ruby",
"eamodio.gitlens",
"kaiwood.endwise",
"mtxr.sqltools",
"mtxr.sqltools-driver-pg",
"ms-vsliveshare.vsliveshare"
],
"settings": {
"workbench.colorCustomizations": {
"activityBar.background": "#ab3e3e"
},
"sqltools.connections": [
{
"previewLimit": 50,
"server": "postgresdb",
"port": 5432,
"driver": "PostgreSQL",
"name": "app_development",
"database": "app_development",
"username": "db_user",
"password": "password"
}
]
}
}
},
"postCreateCommand": "bash .devcontainer/scripts/postCreateCommand.sh",
"postStartCommand": "bash .devcontainer/scripts/postStartCommand.sh",
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "vscode"
}
66 changes: 66 additions & 0 deletions .devcontainer/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
version: '3'
services:

# PostgreSQL
postgresdb:
image: postgres:14
restart: on-failure:5
volumes:
- ./create-db-user.sql:/docker-entrypoint-initdb.d/create-db-user.sql
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres

# MySQL
# mysqldb:
# image: mysql:5
# restart: on-failure:5
# environment:
# MYSQL_ROOT_PASSWORD: password
# MYSQL_PASSWORD: password
# MYSQL_USER: db_user

app:
build:
context: ..
dockerfile: .devcontainer/Dockerfile
args:
APP_PORT: $APP_PORT
# Update 'VARIANT' to pick a version of Ruby: 3, 3.1, 3.0, 2, 2.7, 2.6
# Append -bullseye or -buster to pin to an OS version.
# Use -bullseye variants on local arm64/Apple Silicon.
VARIANT: "3.0-bullseye"
# Optional Node.js version to install
NODE_VERSION: "14"
environment:
RAILS_DB_ADAPTER: postgresql
RAILS_DB_HOST: postgresdb
RAILS_DB: app
RAILS_DB_USERNAME: postgres
RAILS_DB_PASSWORD: postgres
RAILS_DB_ENCODING: utf8
RAILS_ENV: development
env_file: .env
tty: true
ports:
- $APP_PORT:3000
depends_on:
- postgresdb
# - mysqldb
command: sleep infinity
volumes:
- ..:/workspace:cached

# For selenium test
# chrome:
# M1の場合はselenium/standalone-chrome-debugが動かないため、seleniarm/standalone-chromium:latestを代わりに使うこと。
# image: selenium/standalone-chrome-debug:3.141.59-20210913
# ports:
# - $SELENIUM_PORT_1:4444
# - $SELENIUM_PORT_2:5900
# shm_size: 2gb

smtp:
image: schickling/mailcatcher
ports:
- $MAILCATCHER_PORT:1080
17 changes: 17 additions & 0 deletions .devcontainer/files/.vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Rails server",
"type": "Ruby",
"request": "launch",
"cwd": "${workspaceRoot}",
"program": "${workspaceRoot}/bin/rails",
"args": [
"server",
"-b",
"0"
]
}
]
}
16 changes: 16 additions & 0 deletions .devcontainer/files/Gemfile.local
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
gem 'pry-rails'
gem 'pry-byebug'
gem 'binding_of_caller'
gem 'better_errors'
gem 'view_source_map'
gem 'parallel_tests'
gem 'benchmark-ips'
gem 'activeresource'
gem 'timecop'
if Gem.ruby_version < Gem::Version.new('3.1.0')
gem 'ruby-debug-ide'
gem 'debase', '~> 0.2.5beta2'
end
if Gem.ruby_version >= Gem::Version.new('2.7.0')
gem 'debug'
end
4 changes: 4 additions & 0 deletions .devcontainer/files/additional_environment.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# redmine-dev-mirror用ファイル

# ログの保存箇所をvolumesの対象外にして同期による負かを軽くする
config.logger = Logger.new('/logs/redmine.log', 2, 1000000)
10 changes: 10 additions & 0 deletions .devcontainer/files/configuration.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# redmine-dev-mirror

development:
email_delivery:
delivery_method: :smtp
smtp_settings:
address: 'smtp'
port: 1025
test:
production:
23 changes: 23 additions & 0 deletions .devcontainer/files/database.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# redmine-dev-mirror

production:
adapter: <%= ENV['RAILS_DB_ADAPTER'] %>
database: <%= ENV['RAILS_DB'] %>
username: <%= ENV['RAILS_DB_USERNAME'] %>
password: <%= ENV['RAILS_DB_PASSWORD'] %>
host: <%= ENV['RAILS_DB_HOST'] %>
encoding: <%= ENV['RAILS_DB_ENCODING'] %>
development:
adapter: <%= ENV['RAILS_DB_ADAPTER'] %>
database: <%= ENV['RAILS_DB'] %>_development
username: <%= ENV['RAILS_DB_USERNAME'] %>
password: <%= ENV['RAILS_DB_PASSWORD'] %>
host: <%= ENV['RAILS_DB_HOST'] %>
encoding: <%= ENV['RAILS_DB_ENCODING'] %>
test:
adapter: <%= ENV['RAILS_DB_ADAPTER'] %>
database: <%= ENV['RAILS_DB'] %>_test
username: <%= ENV['RAILS_DB_USERNAME'] %>
password: <%= ENV['RAILS_DB_PASSWORD'] %>
host: <%= ENV['RAILS_DB_HOST'] %>
encoding: <%= ENV['RAILS_DB_ENCODING'] %>
15 changes: 15 additions & 0 deletions .devcontainer/scripts/postCreateCommand.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/bin/bash

cp .devcontainer/files/Gemfile.local Gemfile.local
cp .devcontainer/files/database.yml config/database.yml
cp .devcontainer/files/configuration.yml config/configuration.yml
cp .devcontainer/files/additional_environment.rb config/additional_environment.rb
cp -r .devcontainer/files/.vscode .vscode

sudo mkdir /logs
sudo touch /logs/redmine.log
sudo chown -R vscode /logs

bundle install

rake db:create
9 changes: 9 additions & 0 deletions .devcontainer/scripts/postStartCommand.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/bin/bash

bundle update
rake generate_secret_token

rake db:migrate
rake redmine:plugins:migrate

rake log:clear
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,6 @@
/node_modules
yarn-error.log

docker-compose.yml
/docker-compose.yml

/.vscode
123 changes: 122 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,125 @@ https://redmine-patch.connpass.com/

### 4. イベントの時間になったらDiscordを開いて、ボイスチャンネルに参加しよう!

(時間になったら他の参加者も参加しているはず)
(時間になったら他の参加者も参加しているはず)

## VSCode Remote ContainerによるRedmineの開発環境の作り方 / 機能

Redmineの開発環境を作るやり方のうちの一つです。開発環境がすでにある人はこの手順を使わなくても大丈夫です。

### 前提条件

* Docker Desktopを起動している
* Visual Studio Codeが利用できる

### 利用手順

* このリポジトリを手元にClone

```bash session
git clone --config=core.autocrlf=input https://github.com/redmine-patch-meetup/redmine-dev-mirror.git
cd ./redmine-dev-mirror
```

* 必要に応じて.devcontainer/.envを書き換える(portの衝突がなければデフォルトでも動きます)

```bash
# 開発中のRedmineに http://localhost:8000 でアクセス出来るようになる。8000を既に使っている場合は変える
APP_PORT=8000
# Seleniumのテストを実行するときに利用するポート。4444, 5900を既に使っている場合は変える
SELENIUM_PORT_1=4444
SELENIUM_PORT_2=5900
# Redmineから送信したメールを http://localhost:1080 で確認出来るようになる。1080を既に使っている場合は変える
MAILCATCHER_PORT=1080
# mysqlやsqlite3に変えても良い。mysqlの場合、.devcontainer/docker-compose.ymlのMySQL関連のコメントアウトを外す
RAILS_DB_ADAPTER=postgresql
```

* VScodeに拡張機能[Remote-Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)をインストール

* VScodeで/your/path/redmine-dev-mirror を開く

<img width="1552" alt="フォルダを開く様子" src="https://user-images.githubusercontent.com/14245262/182572108-7f2cd55d-11eb-4a95-8a9f-e7ccb22b3f5d.png">

* 右下に出てくるポップアップのReopen in Containerを選択(出てこなかったらVSCodeのコマンドパレットからRemote Containers: Rebuild and Reopen in Containerを選択) => ビルドが始まるはず

<img width="1552" alt="Reopen in Containerボタン" src="https://user-images.githubusercontent.com/14245262/182571986-6557f3a3-8b04-43ca-8ad0-3fbfdab624fc.png">

* VSCodeの左側のバーが赤くなり、左側のファイルツリーも表示されたらコンテナ内に入れている状態

画面下のターミナルに"Press any key"と表示されるため、「キー入力を行い(ターミナルが閉じる)、メニューからターミナルを開く」か 「"Press any key"を放置したままターミナル右上のプラスを押す」 という流れでコマンドを入力できるようにする。

<img width="1552" alt="Press any keyと表示されている画面" src="https://user-images.githubusercontent.com/14245262/182572013-623e6df8-c3ed-4121-84bf-5d8a957dd276.png">
<img width="1552" alt="コマンドを入力可能になった画面" src="https://user-images.githubusercontent.com/14245262/182572033-0a89e4e7-165d-4f6c-a656-5c5e2087a117.png">

* 画面下のターミナル内で
```bash
rails s -b 0.0.0.0
```
* 少し待つと、ブラウザから http://localhost:[.devcontainer/.envで指定したAPP_PORT] でRedmineにアクセスできるようになる。

<img width="1552" alt="Railsアプリケーションを起動できた画面" src="https://user-images.githubusercontent.com/14245262/182572087-5ea31d80-50ea-4af5-bbf1-64133a191b0b.png">

* テストの実行
```bash
bundle exec rake test RAILS_ENV=test
```

### おまけ

#### 1. VSCodeの拡張機能を増やしたい

.devcontainer/devcontainer.jsonのextensionsに拡張機能を追加し、VSCodeのコマンドパレットからRebuild and Reopen container

#### 2. Redmineから送信されるメールの内容をチェック

http://localhost:[.devcontainer/.envで指定したMAILCATCHER_PORT] でにアクセスするとメールキャッチャーを開ける

#### 3. Ruby3.0系以外のバージョンで動作検証やテストをしたい

.devcontainer/docker-compose.yml ファイルの `VARIANT: "3.0-bullseye"` の3.0-bulleseye 部分を利用したいバージョンに書き換えて、VSCodeのコマンドパレットからRebuild and Reopen container

#### 4. test/systemのテストを実行する場合

.devcontainer/docker-compose.yml内のchrome:の塊のコメントアウトを外し、VSCodeのコマンドパレットからRebuild and Reopen container

selenium/standalone-chrome-debugイメージから持ってきたchromeを動かすためにCapybara周りで下のように設定を追加する。
app == docker-composeでrailsアプリケーションが動いているところのサービス名
chrome:4444 == docker-compose selenium/standalone-chrome-debugイメージのサービス名 + port

```diff
diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb
index 1a1e0cb4a..fedbe7d15 100644
--- a/test/application_system_test_case.rb
+++ b/test/application_system_test_case.rb
@@ -43,13 +43,17 @@ class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
}
}
)
-
+ options[:browser] = :remote
+ Capybara.server_host = 'app'
+ Capybara.server_port = <.devcontainer/.envのAPP_PORT(デフォルト8000)に入れた値に書き換える>
driven_by(
:selenium, using: :chrome, screen_size: [1024, 900],
options: options
)

setup do
+ Capybara.app_host = "http://#{Capybara.server_host}:#{Capybara.server_port}"
# Allow defining a custom app host (useful when using a remote Selenium hub)
if ENV['CAPYBARA_APP_HOST']
Capybara.configure do |config|

```

```
bundle exec rake test TEST=test/system RAILS_ENV=test
```

そのときホスト側で
```
open vnc://localhost:5900
```
を実行すると実際に動いているChromeの画面を見ることができる。 (パスワードを要求されたら `secret` と入れる)