くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

2019年05月

GitLabとRedmineの連携

別サーバで社内に立ててるGitLabとRedmineを連携したくなった。

ちなみに片一方はAWSでもう一方はAzure。

GitLabへのPush通知をRedmine側に出して、RedmineからGitLabのリポジトリをpullして

Redmine側のリポジトリに反映させるみたいなやつ。

やるときの流れ。

  1. Redmineに「redmine_github_hook」のプラグインをインストール
  2. Redmineのサーバで適当な場所に該当リポジトリをbareでClone
  3. Redmineでパスワード無しでfetch出来るようにする
  4. Redmineのリポジトリに上でCloneしたフルパスを設定する
  5. GitLabのWebhookを設定する

redmine_github_hookのインストール

https://github.com/koppen/redmine_github_hook

redimne/htdocs/Gemfileの一番最後に↓を記載してbundle

gem "redmine_github_hook"

あと再起動。

リポジトリをbareでClone

こんな感じ

git clone --bare https://gitlab.hoge.com/fuga/myrepo.git myrepo.git

ベアリポジトリのディレクトリ名は「***.git」にした方がいいらしい。

パスワード無しでfetch出来るようにする

sshが通る場合はそれで。

通らない場合はhttpsでcloneすると思いますが、

パスワードキャッシュだとうまくいかなかった。

configにID/PASS書かないとだめっぽ。微妙ーーーー。

myrepo.git/config

[remote "origin"]
	url = https://[userid]:[password]@gitlab.hoge.com/fuga/myrepo.git

Redmineのリポジトリの設定

これは普通に。。。

GitLabのWebhookを設定する

GitLab側は該当リポジトリの「設定⇒インテグレーション」の

WebHookで下の感じのURLを設定してPushにチェックつけて追加。

https://hoge.com/redmine/github_hook?project_id=[プロジェクトの識別子]&repository_id=[リポジトリの識別子]

こんな感じ
https://hoge.com/redmine/github_hook?project_id=myproject&repository_id=myrepo

とりあえずこれで通った。

上手くいかない場合の調べ方。

まずはとりあえず、サーバ間の疎通が取れてるか確認。pingでも何でもいい。

そしたらGitLabに設定したWebHookの編集のリンク。

TestクリックしてPushを選択。

そうすると通知履歴が出来るので、それの編集をクリック。

そしたらResponseが見れるので、一番下にエラーの内容が返ってきてるはず。

Redmine側のログは「log\production.log」あたり。

apacheならPostリクエストのログがapacheのログにも出てるはず。

そのあたり見て、問題の切り分けをするしかなかね。

とりあえず、bareリポジトリじゃないとfetch後のマージとか失敗してるみたいですよ。

犬は吠えない

ずいぶんと久しぶりに書く。

つか、独り言。後でもう少しちゃんと書こう。

オブジェクト指向の話。

とある例え話を見た。

なんかしっくりきたので、残しておきたい。

「動物に触ることができるか」っていう話なんだけど、

「動物とのふれあい」とかよくいうじゃない?

動物に触るって聞いたときに、

イメージしてるのって具体的な犬とか猫とかだと思うんです。

例えば、ワンコを飼ってる人だったら、自分の飼い犬を想像したり。

で、そのワンコには名前がついてるはず、例えばポチとしましょう。

ポチは「触れる」んですよね。でも動物は触れない。

動物は概念だから。存在しないから。

それがクラスとインスタンスなんだと。

なんかしっくりきた。

よく、クラスはオブジェクトの設計図っていうけど、

違う気がした。クラスは概念なんだと。

で、ちょっと「継承」って事を考える。

「継承が無いとオブジェクト指向じゃない」みたいな話もみたことある。

例えば、さっきの例だとポチのクラスは「犬」で、親クラスは「動物」みたいな話。

で、「動物」に例えば「吠える」っていうメソッドがあったとする。

「犬」にも吠えるってメソッドが継承されて、

「ポチ」に吠えるってメソッドがつく。

でも、「動物」は吠えないし、「犬」も吠えない。

吠えるのは「ポチ」だよね。

って考えると、やっぱり親クラスのメソッドは「インターフェース」なんだろうなと。

継承すると親クラスのメソッドとかフィールドとか使えて便利~♪みたいになるのは

やっぱ違うんじゃないかと思った。

「インターフェース」が定義されてるって考えるとなんかしっくりくる。

継承ってただの共通機能の寄せ集めになってる事が稀によくあるので、

それってきっと本来のオブジェクト指向の継承っていう事じゃないよね。

継承されるべきはインターフェースなんだろうなとふと思った次第。

継承されてきたフィールドとかメソッドって

一種のグローバルだと思うんです。

グローバルな変数とかメソッドって麻薬みたいなもんだと最近思う。

使ったその時はすごく便利。どこからでも呼べるし、

どこで定義してどこで使ってるかその時の「自分」は知ってるから。

でも時間が過ぎたり、色んな他の人が修正したりする中で、

どんどんメチャクチャになっていく。

で、そうなるともっとグローバルなものが必要になっていって・・・。

みたいな。

オブジェクト指向とかSOLIDとかとか、

今までに考えられて来たものってきっと、機能(役割)の分割(分担)の手法なんだろう。

機能の分割とみんな戦ってるんだな。

機能の構造化をするために、色んな手法があるんだな。

で、分割した機能は疎じゃないと。

原点回帰でそれって分割統治法ってことですよね。

昔の人もやっぱり凄いね。

問合せ