コミットメッセージにチケット番号がない場合に警告を出すGithook

オンラインコンサルタントの直井です(^^♪

前に記事を投稿してから早一日が経過しました。
よく、「ローマは一日にして成らず」と言われますが、GitHooksは違います。
「GitHooksは一日にして作成すべき」これは、ローマ帝国から受け継がれてきた名言です。
なぜ、一日でやらなくてはいけないのか?
それは、業務効率化のツールは、すぐに共有すべきであるからです。効率的なツールの作成は有用な時間を作ることができるのです。

そんな冗談はさておき、今回の記事は以下の3本建てでお送りします。
・「GitHooksを利用してコミットメッセージに、ブランチ名からチケット番号を自動的に追加する」
・「チェックアウトしたときに、ブランチ名をチェックする」
・「GitHooksを共有する方法」


そもそも、何を解決したいのか?

そもそも、今回の問題はなんでしょうか?

現状:チケットとGitを連携するには、コミットメッセージにチケット番号が必要だが、コミットメッセージにチケット番号を入れるのを結構忘れがち → チケットとの関連付けや終了が自動的にされない。

解決したいこと:コミットメッセージにチケット番号を入れたい

ざっとまとめるとこんな感じです。なので、今回の問題はいたってシンプルに「
コミットメッセージにチケット番号を入れたい 」という願いをかなえるだけです。


どうやって実現させるか

状況が整理され、問題が明確になったところで、今度は最も重要な部分….
どうやってこの問題を解決するかです。

毎朝出社時に「 コミットメッセージにチケット番号を! 」と力技オペレーション解決もアリです。しかし、これはスマートでない解決方法です。

今回天才的な発想で思いついた解決方法は以下の通りです。
①:ブランチ名の最初にチケット番号を入れる
②:ブランチ名から自動的にコミットメッセージにチケット番号を入力する
③:①、②のアクションをする際に、チケット番号らしき数字が見つからなかったら警告を出す。

修正や新規機能を開発するときにすること、それはブランチを切る!ということは?その行為自体はチケット番号と結びつきがあるのです。また、ブランチに番号が付くことで、たくさんあるリモートブランチから目的のブランチを探しやすくなります。


1. ブランチ作成時チケット番号が書いていなさそうな時にエラーを表示するGitHookを作成

GitHookでは、様々なGitアクションに対してフックを設定することができます。
ブランチを作成したというアクションに対するフックはないので、厳密ではないですが、チェックアウトしたときに発動する「post-checkout」を利用します。

#!/bin/sh

# PHPStorm勢からのアツい要望
git pull

ticketNumber=`git branch | grep "*" | awk '{print $2}' | sed -e "s/^\([0-9]*\).*/\1/g"`
if [ -n "$ticketNumber" ]; then
    exit 0
else
    # チケット番号がないブランチ
    echo -e "チケット番号がありません。"
    exit 1
 fi

PHPStorm勢からのアツい要望とありますが、チェックアウトしたときにGitPullされていないことが何回かあったというお話を聞いてついでに入れました。

それ以降は、ブランチ名からチケット番号らしき数字を取得して、それがあればOKなければエラーを表示するようにしました。

eixt のコード0が正常に終了したことを伝え、エラーの場合は0以外(ここでは1)を指定するようにします。


2. ブランチ名からチケット番号を取得して自動的にコミットメッセージに組み込むGitHookを作成

前のセクションでブランチ名にチケット番号があるという前提ができました。
これ以降は、ブランチ名にチケット番号が入っているので、それをコミットメッセージにチケット番号を入力すればいいだけです。

#!/bin/sh

if [ "$2" == "" ] ; then
    ticketNumber=`git branch | grep "*" | awk '{print $2}' | sed -e "s/^\([0-9]*\).*/\1/g"`
    if [ -n "$ticketNumber" ]; then
        mv $1 $1.tmp
        echo "fix #${ticketNumber}" > $1
        cat $1.tmp >> $1
    else
	# チケット番号がないブランチ
	echo -e "チケット番号がありません。"
	exit 1
    fi
fi

さっきのpost-checkoutを流用しただけのお手軽ファイルを作成します。
ブランチ名からチケット番号らしき数字を取得し、コミットメッセージの最初にfix #チケット番号 を追加しています。

※すべてのコミットにこれが適用されます。


3. 作成したGitHooksを共有する

基本的に、GitHookは「.git/hooks」で生成・管理されるので、Git管理下にありません。
ですが、今回はチームメンバーと共有しなくては意味がありません。

なんと便利なことにコマンド一つでGitHooksのパスを変更することが可能なのです!

git config core.hooksPath <githooks dir>

超簡単!一番最後の引数にgithookしてほしいファイルが入ったディレクトリを指定するだけです。今回は、プロジェクトルートに「.githooks」ディレクトリを作成し、その中に1と2で作成したファイルを入れます。

なので、この場合下記コマンドを実行するだけで、良いわけです。

git config core.hooksPath .githooks

3 – 1 ダブルクリックだけで済むようにする

このコマンドをターミナルに入ってプロジェクトのあるディレクトリで実行してくれ!というのも簡単ですが、さすがに不親切な気がするので、batファイルを作っておきます。(windowsユーザーがほとんどなので)

@echo off
cd %~dp0
git config core.hooksPath .githooks

cd %~dp0 でこのbatファイルが存在するディレクトリに移動
そして先ほどのコマンドを実行

ただそれだけのファイルですが、あると便利だしみんな助かるので作りましょう。

※作成したbatファイルと.githooksが同じ階層にある前提です。

3 – 2 一時無効化batファイルを作成

急な修正やチケットがない変更…その他もろもろの理由で今回作成したgithooksが鬱陶しく感じる時があるかもしれません。
ですので、事前に一時無効化できるようにしておきます。

chcp 65001
@echo off
cd %~dp0
git config core.hooksPath .git/
set /p x="GitHooksの機能を一時的に無効化しました。元に戻しますか?(y/n):"
if "%x%" == "y" (
    git config core.hooksPath .githooks
)

このファイルをダブルクリックすることで、一時的に無効化されます。
その後はキー入力次第で元に戻すかどうか選択することができます。

一番上に「chcp 65001」と入れておくことで、日本語の文字化けを防げます。

hooksPathを./gitにしておくことで、何も読み込まれない状況を作り出しています。これは、./git/hooks/にはあるが./gitではファイルが見つからないため、動作しません。ですので、新しく空の「empty_githooks」ディレクトリを作成し以下のようにすることも一つの策です。

git config core.hooksPath empty_githooks

最後に

これでひとまず、プログラム側でどうにかできたので、後は運用面で浸透させる必要があります。

もしかすると、ここが一番肝で難しいことかもしれませんね…

それでは、またお会いしましょう!(^^)!

GitHubとRedmineを連携させてチケット管理を楽にする方法

オンラインコンサルタントの直井です(^^♪

4月になり、寒暖差がとても激しいですが、いかがお過ごしでしょうか!(^^)!
冬用のアウターを完全に収納してしまったので、仕事の行はまだしも、帰りに凍えながら通勤しています(T_T)

さて、今回は表題の通りチケット管理をもっと楽に!というテーマでお話できればと思います。


チケット閉じ忘れ問題

「 問題が発生した!チケット作ろう! 」と考えチケットを追加してくれる方はかなりいらっしゃるのですが、それを終了にすることを忘れがちです….なので、「本当は終わっている」のに終了になっていないチケットが多数存在していました。

それによって、同じ意味のチケットが2つ以上存在してしまったり..なんてことも…

遠足でよく聞くフレーズのように、「チケットを閉じるまでが修正」これを開発メンバー全員に毎日チャットで送れば少しは改善するかもしれません。
しかし、こんな非効率的なことをしても互いにうっとおしいだけで、またチケットが閉じられなくなる日が目に見えています。


チケットとGitを連携させる

どうすれば、チケットの閉じ忘れが解消されるか?

修正は、いずれ origin/main ブランチにマージされます。
それは、チケットが終了したことを意味します。
ということは….
「 origin/mainにマージされた内容(コミットメッセージ等)にチケット番号があればそのチケットは終了 」にすればいいのでは?

そう考えた我々はアマゾンの奥地へ向かった…


1. 環境

1 Git(remote)
・GitHub
2 チケット管理
・Redmine( 4.1.1.stable )

今回は上記のような構成でお送りします。バージョンなどの違いで少し手順が変わっているかもしれません。

また、プラグインを導入する際に、うまくインストールできない場合があると思います。その際は、下記リンクの記事を参照ください。
https://oc-technote.com/%e6%a5%ad%e5%8b%99%e5%8a%b9%e7%8e%87up/redmine%e3%81%ab%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e3%82%92%e5%85%a5%e3%82%8c%e3%82%8b%ef%bc%81/


2. 手順

2 – 1 redmine_github_hookについて

今回利用するプラグインは「 redmine_github_hook 」です。
こちらのプラグインがどのように動作するか、簡単に説明すると下記のような形です。

①:プラグインを発火させるためのURLを踏む
②:git fetchでリモートリポジトリとプラグイン内部にあるローカルリポジトリを同期
③:コミット内容を読み込んで、チケットのアクションを実行(終了や関連付け)

サクッと①を行うことで自動的に②、③が実行されます。詳しいライフサイクルはこちら

なんて便利なプラグインなのでしょうか!デフォルトで入っていてもいいような気がしますが…
しかし、今回実現したいことをやろうとするといまいちな箇所があります。

・②を実行すると、developや開発途中のリモートブランチなどの変更も読み取って終了になってしまう(git fetchですべてのブランチの変更をくみ取るため)


2 – 2 Redmineにプラグインを追加

redmineアプリディレクトリのpluginsディレクトリ配下にプラグインファイルを配置します。(bitnamiスタックの場合「~/stack/apps/redmine/htdocs/plugins」の可能性が高いです。)
また、今回使用するプラグインは「redmine_github_hook」ですが、ほかのプラグインも同様の手順でインストールすることができます。

今回、マスターにブランチにマージされた内容だけをくみ取りたいので、下記URLからプラグインを追加
https://github.com/asurann123/redmine_github_hook

git clone https://github.com/asurann123/redmine_github_hook.git

このリポジトリで変更している箇所は、「app/services/github_hook/updater.rb」の最下部にある関数を変更しています。環境によってはmainブランチだったりするかもしれないので、適宜変更をお願いします。(Gitがうまく吸収してくれる可能性あるかも?)

ここまで来たら、後はreadmeにある内容の通りです。

アプリケーションのトップディレクトリに戻っておく(bitnamiの場合)

cd ~/stack/apps/redmine/htdocs/

gem追加

gem "redmine_github_hook"

インストール

 bundle install --no-deployment

マイグレーション

 bundle exec rake redmine:plugins:migrate RAILS_ENV=production

再起動(bitnamiの場合)

sudo /opt/bitnami/ctlscript.sh restart

2 – 3 プラグイン用にリポジトリをclone

bareオプションを追加して適当な場所にリポジトリをクローン

 git clone --bare <Repos URL or SSH>

リモートを追加

git remote add origin <Repos URL or SSH>

2 – 4 プロジェクトにリポジトリを設定

プロジェクトの「設定」から「リポジトリ」を選択し、「新しいリポジトリ」をクリック

先ほどクローンしたpathを入力する。メインであればメインにチェックし、識別子があると後々わかりやすいが、記入しなくてもいい

2 – 5 発火URLの設定

ここまででとりあえずGitとRedmineの連携設定は完了です。しかし、動作させるには発火URLを踏む必要があります。

ほかのサイトを参考にすると、Github Actionsを利用したりしています。
今回は、デプロイの1セクションにこれを追加しようと思います。

簡単にPythonファイルを作成して、デプロイのお好きなタイミングにこのPythonファイルを実行するだけです。AWSをご利用の場合、CodePiplineなどを利用されていると思いますので、その間にLambdaで発火させるだけです。


import requests

response = requests.post('https://<your domain>/github_hook?project_id=<project_id>',params={"project_id":"<project_id>"})

3 . 最後に

かなり超大作になってしまいました💦しかし、同じような内容でお困りの方が少しでも参考になればと思います。

一年前に作業した内容なので、もしかすると情報が古い可能性があります。

次回は、「 コミットメッセージにチケット番号がない場合に警告を出すGithook 」編でお会いしましょう!

VS Codeで拡張機能がONにならないときの対処法

最近、VS Codeの調子が悪くダイアログ下部に「拡張機能をアクティブ化しています」と表示されるものの、数秒で消え有効化されない事象が発生していました。

中々解決できず、アンインストールとインストールを繰り返したり面倒なことをやっていました。


解決方法

①:「ctrl」 + 「shift」+ 「P」で「拡張機能が無効な状態での再読み込み」を行う

②:ウィンドが再読み込みされたら、 「ctrl」 + 「shift」+ 「P」で 「拡張機能の再起動」

③:右下に出ている「拡張機能を有効にして再読み込み」をクリック


現行バージョン(1.65.2)ではこれで問題なく動作します。

Git HooksでDocker内を操作したい

はじめに

ブランチ切り替えた時に「composer dump-autoload」が出来たら便利なんじゃないか?とふと思ったので、Git Hooksを使ってやってみようと思った次第です。

やってみよう

① プロジェクトのgitconfigを設定してhooksを使えるようにしよう!

/project/.git/configにhooksの情報を記述
・coreセクションにhookspathを設定

[core]
    ~(略)~
    hookspath=.git/hooks ←新たに追加
[remote "origin"]
    ~(略)~

② 何をhookするか決めよう!

/project/.git/hooks/には様々なgitアクションをhookできるようになっています。今回は、ブランチ切り替えた時なので「post-checkout」を編集もしくは、新規作成します。

他にhookできる内容は下記リンクを参照ください。
https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF

③ 処理を書こう!

②の手順で用意した 「 post-checkout 」に直接記載します。

※windows環境で作成しています

#!/bin/sh
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "docker exec -i [container-name] bash -c \"composer dump-autoload\""

dockerに入って何かするってのがうまくいかなかったので、powershellを経由してdockerに入り、-cでうまくコマンドを渡してやるって感じです。

最後に

色々できそうなので、あれしたいっすね!
共有とか!コミットをフックしたりとか!

WP自前のルート証明書を更新する

発端

ある日、WPから外部システムへ連携するプラグインが動いていないことに気が付きました….
正直、そこら辺を変更した記録もないし、タイミングがよくわからず…..

該当のプラグインでAPIの設定をテストできる項目があったので、ありがたくテストしたところ下記メッセージが表示されていました。
cURL error 60: SSL certificate problem: certificate has expired
内心「なんでー??この前の2021/10/1で終わりじゃなかったのかよ」と叫びながら調査しました。

いろいろ調べた結果、WordPressには内部に独自のルート証明書を持っているそうです….とんだお節介野郎め….
なので、OSレベルのルート証明書を更新してもWP内のプラグインで利用されるcURLではそちらは利用されません。なので「
/wp-includes/certificates/ca-bundle.crt 」を更新する必要があります。


対処

① 新しい 「ca-bundle.crt」を取得
 → このca-bundle.crt が古いためエラーが出ているので新しくする。

wget https://raw.githubusercontent.com/WordPress/WordPress/master/wp-includes/certificates/ca-bundle.crt

② 「 /wp-includes/certificates/ca-bundle.crt 」を①でダウンロードした「
ca-bundle.crt 」に更新する
  →単純にコピーで上書きする

cp -b -i ca-bundle.crt /wp-includes/certificates/ca-bundle.crt 

-b:上書きの場合、上書き前のファイルのバックアップを作成
-i:本当に上書きしますか?と注意してくれる(必要性はないが、何となく)

③ 完了!


最後に

WPも奥が深いでござる…