📈

Git導入による課題解決と成果

2024/11/26に公開

はじめに

テーマ「今年の最も大きなチャレンジ」として投稿しています。
成果として、ジュニアメンバによる誤コミットを仕組みで解決し、開発の手戻りがなくなりました。

チャレンジの概要

セクション1~4

Gitの導入を通じて、ジュニアメンバーの誤コミットを防止し、開発の手戻りを削減する仕組みを構築しました。
具体的には、バージョン管理ツールをSubversion(SVN)からGitへ移行し、GitLabをオンプレで構築することで、チーム全体の開発プロセスの効率化を実現しました。

後半部

GitLab構築に際して直面した課題と、その解決方法を紹介します。
課題にはパッケージの取得、プロキシの設定、ポート競合の回避などが含まれ、それぞれに対する具体的な対処方法や参考URLも記載しています。

1. 本題

1.1. 背景と導入の目的

SVNによるバージョン管理を行なっており、ジュニアメンバによる誤コミットによるデグレコミットが頻発し、開発効率が低下していました。
Gitの導入により以下の効果を期待しました。

  • 品質向上:コードレビューを開発プロセスに組み込み、デグレードを防止。
  • コスト削減:誤コミットの修正に要する時間を削減。

以前から対策としてGitを利用するように提案は行なっていたがきっかけがなかった。
提案資料:speakerdeck

1.2. Git導入に至った経緯

小規模案件でのサブリーダーを任された際、裁量を活かしGitを導入しました。
Gitは以下の点で優れていると考えました。

  • 軽量なブランチ管理:タスク単位のブランチ運用が容易
  • 標準的なツール:GitHubやGitLabなど、サードパーティツールとの親和性が高い
  • コードレビューの促進:プルリクエスト (PR) やマージリクエスト (MR) により開発サイクルを改善

1.3. バージョン管理の問題点や制約

Git導入に際し、以下の問題点や制約がありました。

学習コスト

SVNからGitへの移行に伴い、チームメンバーの学習負担が発生。

外部ツール利用の制限

セキュリティの観点から、GitHubなどの外部リポジトリサービスの利用が禁止されており、オンプレミス環境での対応が必須。

2. Gitの導入計画

2.1. 導入の目的とゴール設定

Git導入の目的は、誤コミットの防止と開発効率の向上です。このため、GitLabをオンプレミスに構築することを決定しました。選定理由は以下の通りです。

豊富な情報量

GitLabに関する技術情報が多く、トラブル発生時の対応が容易。

機能の充実

マージリクエスト (MR) を活用することで、コードレビューを導入しやすい

2.2. チーム全体の準備と教育

Gitの導入にあたり、メンバーがスムーズに移行できるよう、以下の取り組みを行いました。

手順書の作成

  • 各PCからのSSH接続手順書作成
  • Git操作手順書の作成
  • 管理者向けの手順書作成

勉強会の実施

  • メンバーへの勉強会の実施、学習教材提供

勉強会ではMixi社の研修資料を活用させていただきました。
https://speakerdeck.com/mixi_engineers/2023-git-training

2.3. Gitフローやブランチ戦略の選定とその理由

運用モデルには「GitHub Flow」を採用しました。
理由:
「GitLab Flow」や「Git Flow」と比較してルールがシンプル。
初期段階では動作するソフトウェアが存在しなかったため、最終的な成果物をゴールとするGitHub Flowが適していました。
基本は以下の構成:

  • main:
  • 短期的なfeatureブランチ
    PRベースの運用をし、コードレビューを行い、featureブランチはmainへマージされる運用法法。

4. 成功と課題の振り返り

4.1. 導入によって得られた成果

【個人として】

完全独力でオンプレ環境へGitLabを構築し、チームへのGit普及を行なった。
日常の学習結果を業務へ活用し、提案/改善を遂行できた。

【組織として】

PR(GitLabではMR:マージリクエスト)ベースでの開発を適用することで誤コミットの受け入れが0となった。
ブランチ運用モデル(GitFlow)を意識したブランチ管理で並行/先行した機能開発が行えた。
チーム外から構築したGitLabを使ってみたいなどの声があがるようになった。

4.2. 予期しなかった課題と対応策

ブランチの概念

問題: ブランチ運用に慣れていないメンバーが戸惑う。
対応: 初期段階ではタスクごとのブランチを代表者が一括作成。メンバーはコミットとプッシュに集中する運用に変更。結果として、メンバーの操作負担が軽減。
現在では操作にも慣れているようで、ブランチ作成からMRを作成まで一連の流れで作業をいただけるようになりました。

4.3. 予今後の発展の可能性

こうした取り組みをさらに進化させ、CI/CDの導入など開発速度の向上とチーム全体のスキルアップを実現する

後半:GitLab立ち上げまでの超えてきたハードル

OSの設定

OSはCentOSのイメージが社内にあったため、ダウンロードの手間を惜しみそれを利用。

yumのアップデートを実行する際にミラーサイトがないと怒られる場合がある

その場合ミラーサイトを変える(ちゃんとあるやつを探し出す)
https://qiita.com/mighty-n/items/edb02507d73aa7d8cd1b

yum / curl プロキシを設定する。

社内なのでプロキシの設定が必要でしたので設定しました。
https://qiita.com/katsuta/items/17eee8e78543871b5f27

後述のcurlの設定も必要。

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh -x {PROXY_URL} | sudo bash yum install  gitlab-ce 

上記にしても取得したシェルの中でもcurlしているため、curlの設定にもプロキシ入れたほうが良い

vi ~/.curlrc proxy={PROXY_URL}
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash yum install  gitlab-ce 

GitLab HTTP待ち受けポートの変更

HTTPの標準ポート(80/tcp)はほかサービスで競合するのが嫌だったので8888にしてみる

https://ez-net.jp/article/42/LMtSMqNF/76wV8fNmgSLz/

vi /etc/gitlab/gitlab.rb external_url 'http://{SERVER_URL}:8888' 

ポート開放

待受ポートを変えたのであればそのポートを開けないと見れるものも見れないので開ける。

firewall-cmd --zone=public --add-port=8888/tcp --permanent sudo firewall-cmd --zone=public --remove-port=8888/tcp --permanent firewall-cmd --reload 

ルートで操作し続けたのかGitLabが502エラー

https://qiita.com/rsasns/items/92a14879e4f59fb9499c

GitLabのコマンド

起動、停止、再起動

gitlab-ctl start
gitlab-ctl stop
gitlab-ctl restart 

設定の再構築

gitlab-ctl reconfigure

Discussion