DockerでRedmine環境構築

前提

・Dockerが、すでにインストールされていること。

はじめに

今回、docker-compose.yml作成を行います。
以下、やることの目標になります。
・Dockerを使ってRedmineを作る
プラグインを入れる

基本的な事は、公式に書いてあるので参照していただければ幸いです。
Redmine公式はこちら

ディレクトリ構成

手始めに、作業ディレクトリとして以下のように、
フォルダを作成して頂くとスムーズかと思います。

redmine
├── mysql_data
└── redmine_data
    ├── plugins
    └── themes

Dockerを使ってRedmineを作る

準備

公式のymlを参考に作ります。(バージョンの固定とポート、DBパスワードのみ修正)
以下のdocker-compose.ymlを作成すれば、ここでの作業は、完了になります。
ディレクト

redmine
├── docker-compose.yml ←追加
├── mysql_data
└── redmine_data
    ├── plugins
    └── themes

・docker-compose.yml

version: '3.1'

services:

  redmine:
    image: redmine:4.0.3
    restart: always
    ports:
      - 3000:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: password

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: redmine

実行

以下、コマンドを打ちます。
(完了まで少し時間が掛かると思う。)

$ cd 配置場所までのパス/redmine
$ docker-compose up

ブラウザで「localhost:3000」にアクセスしてみましょう。
見慣れたredmineの画面が表示されるはずです。
確認後、ターミナル(パワーシェル)で「ctrl + c」で停止します。

プラグインを入れる

準備

コマンドを打ち込んで入れるのも面倒なので、ローカル環境にマウントしてみましょう。
(ついでにテーマも!)
これで、入れる準備は完了です。
・docker-compose.yml

version: '3.1'

services:

  redmine:
    image: redmine:4.0.3
    restart: always
    ports:
      - 3000:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: password
    volumes:
      - ./redmine_data/plugins:/usr/src/redmine/plugins ←追加
      - ./redmine_data/themes:/usr/src/redmine/public/themes ←追加

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: redmine

プラグイン配置

マウントしたフォルダにプラグインを配置しましょう。

redmine
├── docker-compose.yml
├── mysql_data
└── redmine_data
    ├── plugins
    │    ├── easy_gantt ←追加
    │    └── redmine_issue_templates ←追加
    └── themes

DB作成

作成したイメージを動かしてみましょう。
おそらくエラーが出始めるので、一旦置いておきます。
(原因は、テーブルが足りないからです。)

$ cd 配置場所までのパス/redmine
$ docker-compose up

次に、別ターミナルを開きます。 以下、コマンドを実行しましょう。
(easy_ganttしか載せていませんが、プラグインのReadMeを見て必要なら他のプラグインにも実行してください。)

$ docker ps
$ docker exec -it コンテナID(一番左に表示されてる) bash
root@コンテナID:/usr/src/redmine# cd /usr/src/redmine/plugins
root@コンテナID:/usr/src/redmine# cd easy_gantt(対象プラグインのフォルダ)
root@コンテナID:/usr/src/redmine# rake redmine:plugins:migrate RAILS_ENV=production

放置していたターミナル(パワーシェル)上で、「ctrl + c」を押して停止します。
停止できたら再度、起動します。
これで、エラーが出ていなければ完了です。
お疲れ様でした。
(Redmineの画面で、プラグインが入っていることの確認を忘れずにね。)

$ docker-compose up

空のレスポンスコード200を返すには?

前提

「200」で返すには、ボディ部が必要だと思っていた。
プログラムは、画面から呼ばれるAPIで基本的にJSONを返す仕様。

はじめに

なぜ「200」で返す必要があるのか?
特に返す情報がない場合、204(=OKかつno contents)でも良いのだが、
自社プログラムにて、200だけが成功とみなされるため。
(画面側の処理が、影響しているのだろう。。。)

課題感

レスポンスコード200(=OKかつボディがある)にするために、実行結果であるJSONが不要な場合でも、「"OK"(=文字列)」をJSONで返している。(既存処理)
「イケてない。。。」とは思いつつも既存処理に倣って「"OK"」を詰めたオブジェクトをJSONに加工して返すような処理を書いていた。

施策

JAX-RS(Jersey)を使って、無駄なレスポンスを削る。
これで、200(=OKかつno contents)で返ってきます。

import javax.ws.rs.core.Response;

public Response method() {
  .
  .
  .
  return Response.ok().build();
}

こんな事できるなんてすごいなぁー(小並感

結果

無駄なオブジェクトが減らせてよかったと個人的には思ってる。
こんな事も知らなかった自分が恥ずかしい。。。

つぶやき

Dockerやドメイン駆動など、色々勉強しなくてはいけない重いものが増えてきて、中途半端になってきてる。。。 拙い記事ばかりですが、見に来て下さりありがとうございます。 なんとか整理して皆さんにお届けできるように頑張ります。

Dockerをはじめてみる。(エラー編)

はじめに

ここでは、テキストを進めた際に、起きたエラーと解決方法について記載して行こうと思う。 (原因までは、言及していないのでご了承ください。。。) 列挙形式で記入のため、分かりずらかったらコメントください。

Docker [ Adrian Mouat ]

価格:3,888円
(2019/3/11 22:07時点)

5章 開発でのDockerの利用

5.1 "Hello World!"

  • 問題箇所
[Dockerfile]

FROM python:3.4

RUN pip install Flask==0.10.1
.
.
.
  • エラー
DEPRECATION: Python 3.4 support has been deprecated. pip 19.1 will be the last one supporting it. Please upgrade your Python as Python 3.4 won't be maintained after March 2019 (cf PEP 429).
  • 解決方法
    バージョンをあげる。
FROM python:3.6

  • 問題箇所
[Dockerfile]

FROM python:3.6

RUN pip install Flask==0.10.1 uWSGI==2.0.8
.
.
.
  • エラー
requests.exceptions.ConnectionError: HTTPConnectionPool(host='dnmonster', port=8080): Max retries exceeded with url: /monster/monster.png?size=80
  • 解決方法
    バージョンをあげる。
RUN pip install Flask==0.10.1 uWSGI==2.0.18

6章 シンプルなwebアプリケーションの作成

6.2 既存のイメージ利用

  • 問題箇所
[identidock.py]

@app.route('/monster/<name>')
def get_identicon(name):
    r = requests.get('http://dnmonster:8080/monster/' + name +'?size=80')
.
.
.
  • エラー
requests.exceptions.ConnectionError: HTTPConnectionPool(host='dnmonster', port=8080): Max retries exceeded with url: /monster/monster.png?size=80
.
.
.
  • 解決方法
    ymlに追記する。
[docker-compose.yml]
.
.
.
  volumes:
    - ./app:/app
  links:
    - dnmonster

dnmonster:
  image: amouat/dnmonster:1.0

2/2_QUARKUS(Javaフレームワーク)触ってみた!(チュートリアル実行編)

はじめに

今回は、チュートリアル実行編です。 「そんなの自分でやってやるぜ!」って方に向けて、 以下に実行するチュートリアルの元URLを添付しておきます。

quarkus.io

環境構築編

環境構築大事!!
コマンド漏れなく打ってるのに、エラーになったらここを疑ってみて!
以下、リンクはWindowsの方向けに貼っておきます。
macは、「brew」使えばいいので...(脳筋

1. IDE(Javaなので、ecilpseかIntelliJ かな?)
eclipsehttp://mergedoc.osdn.jp/
IntelliJhttps://www.jetbrains.com/idea/
1. JDK 8以上
Windowshttps://qiita.com/ko2a/items/69fa8a5366d7449500ca
JAVA_HOMEの設定も忘れずに!
1. Maven or Gradle(Mavenが無難かな)
Mavenhttps://qiita.com/tarosa0001/items/e5667cfa857529900216
Gradle:https://qiita.com/vvakame/items/83366fbfa47562fafbf4
1. GraalVM
GraalVM:https://www.graalvm.org/docs/getting-started/ qiita.com

eclipseとかの入れ方は、ググっておくれ...
その他は、先駆者の方の記事をお借りします...(ありがたやー)
Gradleでのビルドは、追々やれたらいいな。。。

チュートリアル

1.Gitからクローンを落としてきます。

$ cd 保存場所
$ git clone https://github.com/quarkusio/quarkus-quickstarts.git

※ソースを落とす際に、プロジェクト名を変えないで!

2.Quarkusプロジェクトを作成します。

$ mvn io.quarkus:quarkus-maven-plugin:0.11.0:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=getting-started \
    -DclassName="org.acme.quickstart.GreetingResource" \
    -Dpath="/hello"

3.動作確認をします。

$ cd quarkus-quickstarts
$ cd getting-started
$ mvn compile quarkus:dev

localhostにアクセスする。
URL:http://localhost:8080

f:id:WoodPecker:20190317003130p:plain

もう一つコンソールを開き、curlを投げてみる。

$ curl http://localhost:8080/hello
hello

とりあえず今回は、ここまで!
お疲れ様でしたー

補足

プロジェクト作成時に、以下のエラーが出て焦ったけど、コマンド打つ階層を間違えてただけだったよ。。。

[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:0.11.0:create (default-cli) on project quickstart-projects: Unable to generate the project, the `projectGroupId`, `projectArtifactId` and `projectVersion` parameters are not supported when applied to an existing `pom.xml` file -> [Help 1]

リンク

続きはこちら↓
未作成
前回はこちら↓ woodpecker.hatenadiary.jp

1/2_QUARKUS(Javaフレームワーク)触ってみた!(導入編)

はじめに

3/7(かな?)に発表された新しいフレームワークのため、
記述内容に拙いところがありますが、ご了承ください。
quarkus.io

QUARKUSとは

サーバ関係でよく耳にするであろうredhat社が作ったJavaフレームワークです。 ( redhat社ホームページ:https://www.redhat.com/ja/global/japan )

何が嬉しいの?

  1. くそ早ええー
  2. くそ軽い!
  3. 既存のライブラリにも対応してるぜ

https://quarkus.io/assets/images/quarkus_graphics_v3_bootmem_wide_03.png

f:id:WoodPecker:20190312215818p:plain
出典:https://quarkus.io/

上記画像は、公式サイトに乗っている画像です。 メモリ使用量とアプリを起動してから最初のレスポンスが返却されるまでの時間です。(画像:上) 一目瞭然ですね。 また、画像にあるように既存の便利なライブラリも利用できるようです。(画像:下)

リンク

続きはこちら↓
woodpecker.hatenadiary.jp

Dockerをはじめてみる。

最近、流行りのDockerですよ。

会社でも使い始めたので、エンジニアとして遅れないためにも身につけておきたい。
(そんなこと言ってたらキリがないけどね。。。。)

冒頭良さげだった、安定のO’Reilly本を購入しました。

続くといいね(他人事

まぁ、これから良さげなところをぼちぼち上げていくとしよう。

Docker [ Adrian Mouat ]

価格:3,888円
(2019/3/11 22:07時点)

cherry-pickでブランチ整理

はじめに

プルリクやブランチ管理ミスった時に整理する術として「cherry-pick」は、とても便利です。 これから行う操作は、ターミナル(Mac)やGit Bash(Windows)での操作を想定しています。

cherry-pickとは

他ブランチに存在する特定のコミットのみを反映させるコマンドです。

やりたいこと

3つのコミットのうち2つのコミットだけを反映させたブランチを作りたい。

操作

まずコミットのログを確認してみましょう。
現在のコミットは、以下の通りです。
・third commit(3番目)
・second commit(2番目)
・first commit(1番目)

$ git log
commit ハッシュ値3 (HEAD -> master, origin/master, master)
Author: ユーザ名 <xxx@xxx.co.jp>
Date:   Thu Mar 7 22:17:21 2019 +0900

 third commit

commit ハッシュ値2
Author: ユーザ名 <xxx@xxx.co.jp>
Date:   Thu Mar 7 22:15:28 2019 +0900

 second commit

commit ハッシュ値1
Author: ユーザ名 <xxx@xxx.co.jp>
Date:   Thu Mar 7 22:05:52 2019 +0900

 first commit

新しいブランチは、以下の通り反映させたい。
・third commit(3番目)
・first commit(1番目)

では、新しいブランチを作り、切り替えます。

$ git branch branchname
$ git branch
branchname
* master
$ git checkout branchname
Switched to branch 'branchname'

新しく作ったブランチのコミットの確認です。
masterと同じコミットですが念のため。。。

$ git log
commit ハッシュ値3 (HEAD -> branchname, origin/master, master)
Author: ユーザ名 <xxx@xxx.co.jp>
Date:   Thu Mar 7 22:17:21 2019 +0900

 third commit

commit ハッシュ値2
Author: ユーザ名 <xxx@xxx.co.jp>
Date:   Thu Mar 7 22:15:28 2019 +0900

 second commit

commit ハッシュ値1
Author: ユーザ名 <xxx@xxx.co.jp>
Date:   Thu Mar 7 22:05:52 2019 +0900

 first commit

ここからが本番です。 1番目のコミットまで状態を戻します。

$ reset --hard ハッシュ値1

その後、cherry-pickで欲しいコミットを持ってくれば完了です。 お疲れ様でした。

$ git cherry-pick ハッシュ値3
[xxxxx] third commit
Date: Thu Mar 7 22:17:21 2019 +0900
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 b.txt
$ git log
commit ハッシュ値3 (HEAD -> branchname)
Author: ユーザ名 <xxx@xxx.co.jp>
Date:   Thu Mar 7 22:17:21 2019 +0900

 third commit

commit ハッシュ値1
Author: ユーザ名 <xxx@xxx.co.jp>
Date:   Thu Mar 7 22:05:52 2019 +0900

 first commit
Date:   Thu Mar 7 22:05:52 2019 +0900