Redmineへのpluginインストール(agile/issue_templates/work_time/checklists)

# はじめに
現在所属しているプロジェクトでRedmineを使ってタスク管理を行っている
プロジェクトではSRE体制を目指しており、アジャイル開発プロセスを導入しているためプロジェクトのタスク管理に役立ちそうなpluginをいくつかインストールする
pluginインストールにあたっては`git clone`を利用してソースをダウンロードする手法が一般的なようだが、インターネットへ接続できない閉域環境でのインストールを想定してコンテナへはファイルコピーによってソースを転送することとした

# 環境情報
- OS: Windows 10 Pro 22H2
- RAM: 8.0GB
- SSD: 256GB
- Podman Desktop: v1.1.0
- Podman: v4.5.1
- Redmine(Bitnami): v4.2.5.stable

# agileインストール
何らかのカンバンボートを導入したいと考えてpluginを探したところ、`backlogs` , `agile` , `kanban` あたりがあることがわかった。
プロジェクトではScrum開発を取り入れており、カンバンにSprintの概念を盛り込みたかったため`agile`を選択した(`kanban`にはSprintの概念がなさそう)

[RedmineUP REDMINE AGILE(アジャイル)プラグイン](https://www.redmineup.com/pages/ja/plugins/agile)の**ダウンロード**をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/45e1d9f3-26ac-961a-f25f-47da71e31214.png)

Light版は無料でダウンロードができるので**ダウンロード中**をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/8c2ae455-703f-7ee1-6804-dac309a4213e.png)

メールアドレスの登録が必要なため、登録の上メールにて送信されてきたURLからソースをダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/38046666-a222-073f-bc6e-33854410287e.png)

ダウンロードしたzipファイルを端末の任意のドライブに解凍する

Windows PowerShell(管理者)にてWSLでpodman-machine-defaultを実行する
```
PS C:\WINDOWS\system32> wsl -d podman-machine-default

You will be automatically entered into a nested process namespace where
systemd is running. If you need to access the parent namespace, hit ctrl-d
or type exit. This also means to log out you need to exit twice.

[user@hostname ~]$
```

端末の`Cドライブ`が`/mnt/c`にマウントされているので、pluginのソースファイルをredmineコンテナの`/opt/bitnami/redmine/plugins` ディレクトリへコピーする
```
[user@hostname ~]$ podman cp /mnt/c/Home/Tool/podman/redmine/redmine_agile user_redmine_1:/opt/bitnami/redmine/plugins/.
[user@hostname ~]$
```

redmineコンテナにbash接続する
```
[user@hostname ~]$ podman exec -it user_redmine_1 bash
#
```

以下コマンドでpluginをインストールする
```
# cd /opt/bitnami/redmine
# bundle install --without development test --no-deployment
[DEPRECATED] The `--without` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set --local without 'development test'`, and stop using this flag
[DEPRECATED] The `--no-deployment` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set --local deployment 'false'`, and stop using this flag
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this
application for all non-root users on this machine.
[DEPRECATED] This Gemfile does not include an explicit global source. Not using an explicit global source may result in a different lockfile being generated depending on the gems you have installed locally before bundler is run. Instead, define a global source in your Gemfile like this: source "https://rubygems.org".
Could not find gem 'redmine_crm' in locally installed gems.
```

エラーを解決するために`gem install`にて`redmine_crm`をインストールする
```
# gem install redmine_crm
```

こちらでもエラーが発生する
例えば、`racc`のインストールが失敗しており、エラーメッセージに従って`mkmf.log`を参照すると以下のメッセージが出力されている
```
# cat /opt/bitnami/ruby/lib/ruby/gems/2.6.0/extensions/x86_64-linux/2.6.0-static/racc-1.7.1/mkmf.log
"gcc -o conftest -I/opt/bitnami/ruby/include/ruby-2.6.0/x86_64-linux -I/opt/bitnami/ruby/include/ruby-2.6.0/ruby/backward -I/opt/bitnami/ruby/include/ruby-2.6.0 -I. -I/opt/bitnami/ruby/include   -s conftest.c  -L. -L/opt/bitnami/ruby/lib -Wl,-rpath,/opt/bitnami/ruby/lib -L. -Wl,-rpath=/opt/bitnami/ruby/lib -L/opt/bitnami/ruby/lib -fstack-protector-strong -rdynamic -Wl,-export-dynamic     -Wl,-rpath,/opt/bitnami/ruby/lib -L/opt/bitnami/ruby/lib -lruby-static -lz -lpthread -lrt -lrt -ldl -lcrypt -lm   -lm   -lc"
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main(int argc, char **argv)
4: {
5:   return 0;
6: }
/* end */
```

gccの`-l`オプションで指定されているライブラリが不足している可能性が疑われる
以下で一通りインストールしてみる
他にもインストールが失敗するたびに、mkmf.logを確認して順次対応していく
ちなみにchatGPTにメッセージを入力して対処方法を質問することで有益な回答を得ることができた
aptコマンドで以下インストールすることで`bundle install`がエラーなく完了することができた
```
# apt update
# apt install zlib1g-dev 
# apt install libpthread-stubs0-dev
# apt install libc6-dev
# apt install build-essential
# apt install ruby-dev
# apt install libmariadb-dev
# apt install libpq-dev
# apt install libruby
```

再度`bundle install`を実行
```
# bundle install --without development test --no-deployment
[DEPRECATED] The `--without` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set --local without 'development test'`, and stop using this flag
[DEPRECATED] The `--no-deployment` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set --local deployment 'false'`, and stop using this flag
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this
application for all non-root users on this machine.
Bundler 2.3.11 is running, but your lockfile was generated with 2.3.8. Installing Bundler 2.3.8 and restarting using that version.
Fetching gem metadata from https://rubygems.org/.
Fetching bundler 2.3.8
Installing bundler 2.3.8
[DEPRECATED] The `--without` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set --local without 'development test'`, and stop using this flag
[DEPRECATED] The `--no-deployment` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set --local deployment 'false'`, and stop using this flag
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this
application for all non-root users on this machine.
You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.

If this is a development machine, remove the /opt/bitnami/redmine/Gemfile freeze
by running `bundle config unset deployment`.

The dependencies in your gemfile changed

You have added to the Gemfile:
* redmine_crm
#
```

メッセージに書かれている通りに `bundle config unset deployment` を実行
```
# bundle config unset deployment
```

再度`bundle install`を実行
```
# bundle install --without development test --no-deployment
```

`bundle install`が完了したら以下コマンドを実行
```
# bundle exec rake redmine:plugins NAME=redmine_agile RAILS_ENV=production
```

以下でredmineのコンテナを再起動する
```
# exit
[user@hostname ~]$ podman restart user_redmine_1
```

プラウザから自端末のredmineへアクセスしてログインすると`Agile`タブが現れている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/3ef2e486-033d-8c47-188e-9d664ccdfbeb.png)


# issue_templateインストール
チケットのテンプレートを登録できるプラグイン
あらかじめ`題名`と「説明」を入力したテンプレートを登録し、「新しいチケット」画面でテンプレートを選ぶと入力された状態で表示することができる
チケットの説明欄に記入例や定型文を入力するなどの使い方を想定

[GetHub issue_teplates](https://github.com/akiko-pusu/redmine_issue_templates) からソースをダウンロードする

Windows PowerShell(管理者)にてWSLでpodman-machine-defaultを実行する
```
PS C:\WINDOWS\system32> wsl -d podman-machine-default

You will be automatically entered into a nested process namespace where
systemd is running. If you need to access the parent namespace, hit ctrl-d
or type exit. This also means to log out you need to exit twice.

[user@hostname ~]$
```

端末の`Cドライブ`が`/mnt/c`にマウントされているので、pluginのソースファイルをredmineコンテナの`/opt/bitnami/redmine/plugins` ディレクトリへコピーする
```
[user@hostname ~]$ podman cp /mnt/c/Home/Tool/podman/redmine/redmine_issue_templates user_redmine_1:/opt/bitnami/redmine/plugins/.
[user@hostname ~]$
```

redmineコンテナにbash接続する
```
[user@hostname ~]$ podman exec -it user_redmine_1 bash
#
```

以下コマンドでpluginをインストールする
```
# cd /opt/bitnami/redmine
# bundle install --without development test --no-deployment
# bundle exec rake redmine:plugins NAME=issue_templates RAILS_ENV=production
```

以下でredmineのコンテナを再起動する
```
# exit
[user@hostname ~]$ podman restart user_redmine_1
```

プラウザから自端末のredmineへアクセスしてログインし、**管理** -> **プラグイン** へ行くとIssue Templates プラグインがインストールされていることが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/c8ff2590-fef4-0ca6-0aab-fca13ecc8d1e.png)

# work_timeインストール
Redmineでは各チケットに`作業時間`を記録することができる
work_time プラグインは日単位でチケットを一覧表示し、作業時間を記録/参照することができる

[GetHub work_time](https://github.com/tkusukawa/redmine_work_time) からソースをダウンロードする

Windows PowerShell(管理者)にてWSLでpodman-machine-defaultを実行する
```
PS C:\WINDOWS\system32> wsl -d podman-machine-default

You will be automatically entered into a nested process namespace where
systemd is running. If you need to access the parent namespace, hit ctrl-d
or type exit. This also means to log out you need to exit twice.

[user@hostname ~]$
```

端末の`Cドライブ`が`/mnt/c`にマウントされているので、pluginのソースファイルをredmineコンテナの`/opt/bitnami/redmine/plugins` ディレクトリへコピーする
```
[user@hostname ~]$ podman cp /mnt/c/Home/Tool/podman/redmine/redmine_work_time user_redmine_1:/bitnami/redmine/plugins/.
[user@hostname ~]$
```

redmineコンテナにbash接続する
```
[user@hostname ~]$ podman exec -it user_redmine_1 bash
#
```

以下コマンドでpluginをインストールする
```
# cd /opt/bitnami/redmine
# bundle exec rake redmine:plugins:migrate RAILS_ENV=production
```

以下でredmineのコンテナを再起動する
```
# exit
[user@hostname ~]$ podman restart user_redmine_1
```

プラウザから自端末のredmineへアクセスしてログインし、**管理** -> **プラグイン** へ行くとWork Time プラグインがインストールされていることが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/3b58d484-bd77-1704-4020-5d6a3c37b7ac.png)

# checklistsインストール
Redmineでは各チケットにチェックリストを追加できるようにするプラグイン
チケットの終了条件として複数タスクがある場合などに利用することを想定している

[RedmineUP REDMINE CHECKLIST PLUGIN](https://www.redmineup.com/pages/plugins/checklists)の**ダウンロード**をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/fc9fab3d-d126-d9cb-376c-4a328ead8ca2.png)


Light版は無料でダウンロードができるので**Download now**をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/32efd73f-df0c-04db-d42e-b22eb974d358.png)


メールアドレスの登録が必要なため、登録の上メールにて送信されてきたURLからソースをダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/f8aae830-e203-5a31-6fba-301cea9e8a6c.png)


ダウンロードしたzipファイルを端末の任意のドライブに解凍する

Windows PowerShell(管理者)にてWSLでpodman-machine-defaultを実行する
```
PS C:\WINDOWS\system32> wsl -d podman-machine-default

You will be automatically entered into a nested process namespace where
systemd is running. If you need to access the parent namespace, hit ctrl-d
or type exit. This also means to log out you need to exit twice.

[user@hostname ~]$
```

端末の`Cドライブ`が`/mnt/c`にマウントされているので、pluginのソースファイルをredmineコンテナの`/opt/bitnami/redmine/plugins` ディレクトリへコピーする
```
[user@hostname ~]$ podman cp /mnt/c/Home/Tool/podman/redmine/redmine_checklists user_redmine_1:/bitnami/redmine/plugi
ns/.
[user@hostname ~]$
```

redmineコンテナにbash接続する
```
[user@hostname ~]$ podman exec -it user_redmine_1 bash
#
```

以下コマンドでpluginをインストールする
```
# cd /opt/bitnami/redmine
# bundle install --without development test --no-deployment
# bundle exec rake redmine:plugins NAME=redmine_checklists RAILS_ENV=production
```

以下でredmineのコンテナを再起動する
```
# exit
[user@hostname ~]$ podman restart user_redmine_1
```

プラウザから自端末のredmineへアクセスしてログインし、**管理** -> **プラグイン** へ行くとWork Time プラグインがインストールされていることが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472468/c2074fb6-2e03-dd72-3194-9baf19ad2e2e.png)

# 今回のpluginのインストール手順
色々試行錯誤したが今回のpluginをインストールする際の手順は以下となった
(1)Windows PowerShell(管理者)にてWSLでpodman-machine-defaultを実行する
```
PS C:\WINDOWS\system32> wsl -d podman-machine-default
```

(2)pluginのソースファイルをredmineコンテナの/opt/bitnami/redmine/plugins ディレクトリへコピーする
```
[user@hostname ~]$ podman cp /mnt/c/Home/Tool/podman/redmine/redmine_agile user_redmine_1:/opt/bitnami/redmine/plugins/.
[user@hostname ~]$ podman cp /mnt/c/Home/Tool/podman/redmine/redmine_issue_templates user_redmine_1:/opt/bitnami/redmine/plugins/.
[user@hostname ~]$ podman cp /mnt/c/Home/Tool/podman/redmine/redmine_work_time user_redmine_1:/bitnami/redmine/plugins/.
[user@hostname ~]$ podman cp /mnt/c/Home/Tool/podman/redmine/redmine_checklists user_redmine_1:/bitnami/redmine/plugins/.
```

(3)redmineコンテナにbash接続する
```
[user@hostname ~]$ podman exec -it user_redmine_1 bash
```

(4)aptコマンドで以下をインストールする
```
# apt update
# apt install -y zlib1g-dev libpthread-stubs0-dev libc6-dev build-essential ruby-dev libmariadb-dev libpq-dev libruby
```

(5)`redmine_crm`をインストールする
```
# cd /opt/bitnami/redmine
# gem install redmine_crm
```

(6)以下コマンドを実行する
```
# bundle config unset deployment
```

(7)`bundle install`を実行する
```
# bundle install --without development test --no-deployment
```

(8)`bundle exec`を実行
```
# bundle exec rake redmine:plugins:migrate RAILS_ENV=production
```
再度`bundle install`せよというメッセージが出力された場合は(7)と(8)を再度実施する


(9)redmineコンテナを再起動する
```
# exit
[user@hostname ~]$ podman restart user_redmine_1
```



# おわりに
Redmine packaged by Bitnami(Container)におけるプラグインのインストールは基本的には以下の流れとなる

(1)ソースを`/opt/bitnami/redmine/plugins/`にソースのディレクトリを配置する
(2)`cd /opt/bitnami/redmine`　を実施の上　`bundle install --without development test --no-deployment`　を実行する
(3)`bundle exec rake redmine:plugins:migrate RAILS_ENV=production`　を実行する
(4)`podman restart` コマンドにてRedmineコンテナを再起動する

`bundle install`時にライブラリの依存関係などでいくつかエラーが発生したが、今回はchatGPTを利用することで効果的にエラーを解消することができた

# 参考ページ
- [RedmineUP REDMINE AGILE(アジャイル)プラグイン](https://www.redmineup.com/pages/ja/plugins/agile)
- [RedmineUP Installing Agile plugin on Linux](https://www.redmineup.com/pages/help/agile/installing-redmine-agile-plugin-on-linux)
- [Redmine で Agile プラグイン( Light 版)を使う](https://qiita.com/ping-pong/items/78ae62e17219a3c1e26e)
- [[Redmine]プロジェクトにチケットのテンプレートを設定する](https://codelab.website/redmine-issue-templates-plugin/)
- [【Redmineプラグイン】工数管理を簡単にする（Work Time Plugin）](https://rin-ka.net/redmine-work-time-plugin/)
- [[Redmine]チケットにチェックリストを追加するプラグイン](https://codelab.website/redmine-checklist-plugin/)