CI/CDはじめの一歩 ソースコード管理(Git)編

    CI/CDはじめの一歩 ソースコード管理(Git)編

     

    目次

      はじめに

      アジアクエスト クラウドインテグレーション部の田中雄也です。
      この記事では、CI/CDを知るためのはじめの一歩として、ソースコード管理で用いられる機能と用語について触れていきます。

       

      記事の目的(または狙い)

      • 今後、CI/CDやコード管理に触れてみたい方のきっかけづくり
      • コード管理の情報収集をする方向けの参考情報に

      そもそもCI/CDとは

      「Continuous Integration」・「Continuous Delivery」の略称で、日本語に訳すと「継続的インテグレーション・継続的デリバリー」といった意味になります。

      ソフトウェアのリリーススピードの向上を目的とした開発手法で、
      ソフトウェアをリリースさせた段階で満足するのではなく、リリース後においても継続的なアップデートを提供をすることで、絶えず変化するビジネス環境に適応したソフトウェアの提供を目指すための手法です。

      コードの変更が行われる都度のテストやデプロイを自動化することで、ソフトウェアのリリーススピードの向上を通して、市場が求めるアプリケーションを維持し、競争力を保ち続けることが目的となっています。現在ではソフトウェアだけでなく、クラウドインフラにもこの仕組みが応用されるなど幅広い開発現場で用いられる手法となっています。

      コード管理とは

      ずばり、コードのバージョン(変更履歴)を管理することです。

      現代においては、1つの大きな成果物を複数人で作り上げるということが考えられます。
      そんな時、手作業によってバージョン管理をしているとどんなことが予想されるでしょうか?

      以下が一例になります。

      • 複数人が同一ファイルを同時に編集してしまうことで内容が競合したり、上書きされてしまう恐れがある
      • 今扱っているファイルが最終版なのかどうかが分からない
        • ××設計書
        • ××設計書_20231110_ver2
        • ××設計書_20231110_田中編集版
        • ××設計書_20231111_最新

      上記のようなファイル群があった時、パッと最新ファイルを見分けられるでしょうか?難しいですよね。。

      これらの理由から、コードのバージョンをシステムで管理する必要が生じます。また、最近の開発では、複数の開発者が1つのコードベースを共有しています。そのため、エンジニアは後述するバージョン管理システムを用いてこうしたコード管理の技術を使うことが必須となっているのです。

       

      バージョン管理システムとは

      バージョン管理システムは、ソフトウェアのソースコードの変更を追跡し、複数の開発者が同じコードベースで作業できるようにするためのシステムです。 そんなバージョン管理システムは大きく分けて分散型と集中型の2つに分類されます。

      202402_firststeps_to_CICD_sourcecode_management_01

      (左が集中型・右が分散型)

      集中型・分散型のそれぞれの特徴として

      • 集中型:中央サーバーは全てのファイルの履歴を単独で管理する。開発者は作業を始める前に、このサーバーから最新のファイルを取得し、変更を加えた後はそれをサーバーにアップロードする必要がある。そのため、サーバーやネットワークに問題が生じた場合、新たな作業の開始や既存の作業の共有ができなくなる場合がある。

      • 分散型:各開発者は自身のコンピュータ上で完全に独立して作業を行い、全てのファイルの履歴を保持する。作業が完了した後、変更を他者と共有するために、これらの変更を1つの共有場所(中央サーバー)に送信することができる。サーバーにアクセスできない場合でも、開発者は自己のコンピュータ上での作業を続行できる。

      といった違いがあります。

      今回のテーマとなっているGitは上記の分類のなかで、分散型に属しています。
      そうした特徴のあるコード管理システムはCI/CDの自動化プロセスに密接に関係しているのです。
      つまり、コード管理を知ることがCI/CD理解への第一歩と言えるのではないでしょうか。

      というわけで、ここからはコードを管理するために用いられる、数多のバージョン管理システムの中から圧倒的なシェアを占めるといわれるGitを紹介していきます。

      Gitとは

      Linuxカーネル開発のために生まれた分散型のバージョン管理システムで、一説には80~90%のシェア率を誇ると言われています。このGitに対応するツールとしてGitHubやGitLabがあります。
      ※参考サイト Developer Survey Results2018 | stack overflow
      Gitを用いることで、分散型バージョン管理システムの特徴やブランチ、マージといった仕組みから複数人でのソフトウェア開発を容易に進めることができるようになります。

      また、GitとCI/CDを組み合わせることで、開発者がGit上でコミットを行うとCI/CDシステムが変更を検知し、コードビルド、自動テスト、デプロイメントなどの一連の作業を自動で開始できます。これによって、リリースプロセスを効率化し、ソフトウェアの品質を維持しながら納期を短縮するのに寄与しています。

       

      Git利用のメリット

      バージョン管理システムとしてGitを扱うメリットとしては主に下記の5つが考えられます。

      オフライン環境でも作業可能
      • Gitは分散型バージョン管理システムであり、インターネット接続がない状況でも、開発者は完全なリポジトリの履歴と共に作業を継続できます。これにより、移動中やリモート環境での作業が可能になります。
      バージョン管理が容易に行える
      • Gitは変更履歴を効率的に管理し、特定のコミット(地点)への切り戻しやブランチ(分岐)間のマージ(統合)を簡単に行うことができます。これにより、大規模なチームでも安定した開発フローを維持しながら、エラー発生時のリスクなく新機能を開発・導入できます。
      複数人が並行して作業可能
      • Gitの強力なブランチ機能により、複数の開発者が同時に異なる機能上で作業を進めることができ、誰がどのファイルにどんな変更を加えたかが明確にできます。GitHubやGitLabなどのリモートリポジトリホスティングサービスを使えばPull RequestやMerge Requestを通じたレビュープロセスを経て、品質を保ちつつ変更を主要ブランチに統合できます。
      開発のスタンダードとしての認知
      • Gitは現代のソフトウェア開発ではほぼスタンダードツールとして認識されており、オープンソースコミュニティや商業的な開発のいずれにおいても広く使用されています。その普及度から、知識や技術の共有が活発に行われています。それによって、不明点が出た場合にもインターネットで調べることによって容易に明確な答えを得ることができます。
      様々なサービスとの連携
      • GitはGitHubやGitLabなどのリモートリポジトリホスティングサービスとシームレスに連携でき、クラウドベースの開発ツールと組み合わせてCI/CDパイプラインを構築できます。これにより、ソフトウェアの自動テストやデプロイが容易になり、開発プロセスが効率化します。

      こうしたメリットからGitは開発者からの人気を集めているのです。

       

      Gitにまつわる用語

      以下に主に使われることの多い、Gitにまつわる用語とその説明を記載します。

      • リポジトリ
        • ソースコードや変更履歴の保存場所。ローカルとリモートの2種類が存在する。レポジトリとも呼ばれる
          • ローカルリポジトリ:自分の手元のマシン上の保存場所
          • リモートリポジトリ:ローカルの変更を複数人で共有するために使われるインターネット上、またはネットワーク内の保管場所
      • クローン
        • リモートリポジトリのコピーをローカルに作成すること
          • 主に初回にリモートの内容をローカルに取り込むために用いられる
      • ブランチ
        • 木の枝や支流といった意味から派生して履歴の流れを分岐して記録するといった意味を持つ
        • 独立した開発をするためのコードの分岐点。異なる機能開発やバグ修正を同時進行するために利用できる
          • 複数人で並行して作業をするために、大元のブランチから機能追加箇所などで分離させて運用する
      • フェッチ
        • リモートリポジトリ上の変更履歴の情報をローカルに取得すること
          • ローカル上の変更履歴の情報を最新版に更新するために用いられる
          • プルとは違い、変更履歴の最新情報を取得してくるだけに留まり、内容の変更までは行われない
      • マージ
        • 2つのブランチの変更を1つに統合すること
          • 各ブランチで同一箇所の変更をしていた場合はconflict状態となり、開発者が手動でこの状態を解消する必要がある
      • プル
        • リモートリポジトリ上のデータを取得し、自動的に現在のローカルブランチとマージする
          • フェッチ+マージの働き
      • プッシュ
        • ローカルリポジトリ上の変更をリモートリポジトリにアップロードして共有する
          • この操作を行うことでローカル上の内容を他人と共有できる状態にする
      • コミット
        • リポジトリの変更を記録するために行う行為。処置を確定するといった意味を持つ
          • ローカルでコミットしたものだけがプッシュ時にリモートリポジトリに反映される
      • プルリクエスト
        • Githubのようなオンラインホスティングサービスで使用される概念でローカルでの変更を他の開発者に通知し、コードレビューを促すための機能
          • 開発者が変更を指定のAのブランチに反映後、分岐元になったBのブランチに対してプルリクエストを作成する
          • レビュワーはリクエストを確認し、レビューをする
          • レビューの結果、問題が無ければBのブランチに変更をマージするといったかたちで利用される


      このような用語を理解することで、Gitの機能や以下に記載されたGitを操作するにあたって用いるコマンドについての理解も深めることができます。

       

      Gitの基本的なコマンド

      次に基本的に用いられるGitのコマンドを紹介します。

      • git init
        • 新しいリポジトリを作成するためのコマンド
      • git clone
        • 既存のリモートリポジトリをローカル環境に複製するためのコマンド
        • git clone [取得対象のリモートリポジトリのURL] のように用いられる
      • git checkout
        • 新しいブランチを作成したり、ブランチの切り替えをするためのコマンド
        • git checkout -b [新しいブランチ名] 
        • git checkout [切り替えたいブランチ名]のように用いられる
      • git add
        • ファイルやディレクトリをインデックス(コミットの際の対象リスト)に登録するためのコマンド
        • git add [登録したいファイル名]のように用いられる
      • git commit
        • インデックスに追加済のファイルをコミットするためのコマンド
        • git commit -m[コメント]のように用いられる
          • この際、コメント部分には変更点を他者が見ても理解できるように具体的に記載することが望ましいです
      • git push
        • リモートリポジトリにローカルリポジトリの変更を反映するためのコマンド
        • git push -u origin [リモートのブランチ名]のように用いられる
          • 2回目以降はgit pushだけでOK
      • git log
        • コミットの履歴と詳細を表示するためのコマンド
        • git logだけでつかえます
      • git fetch
        • リモートリポジトリの最新の更新状態をローカルに取得してくるコマンド
        • git fetch [リモートリポジトリ名]のように用いられる
      • git merge
        • fetchで取得してきた情報を現在のローカルのブランチに統合するコマンド
        • git merge [統合したいブランチ名]のように用いられる
      • git pull
        • リモートリポジトリから最新の変更を取得して現在のブランチに自動的にマージするコマンド
        • (fetchとmergeを実行するコマンド)
        • git pull [マージ元のリモートリポジトリ名] [統合したいブランチ名]のように用いられる

      以上がGitでよく用いられるコマンドの一覧となります。

       

      現在の開発環境では、Gitと連携する多様なアプリケーションの普及により、従来のコマンドライン操作に代わってGUIベースのインターフェイスが好まれるようになりました。これにより、Gitの日常的な操作がより直感的でアクセスしやすくなっています。
      とはいえ、コマンドラインでのGit操作を理解しておくと、GUIでは対応できない状況や細かな操作が必要な場合にも対応できるため、その知識は依然として重要です。

      こうしたコマンドを覚えるためには、実際に手を動かして操作してみることが一番の近道です。
      ぜひ、上記のコマンド一覧を参照の上、実際の操作の流れを体験してみてください。


      まとめ

      というわけで、この記事では「CI/CDはじめの一歩 ソースコード管理編」として、CI/CDとGitについて触れさせていただきました。

      CI/CDとは、継続的インテグレーション・継続的デリバリーを指す言葉で、ソフトウェアのリリーススピードの向上を目的としてコードの変更が行われる都度のテストやデプロイを自動化するものとして現在では、ソフトウェアだけでなくクラウドインフラを含めた幅広い開発現場で用いられている開発手法であること。

      GitとはLinuxカーネル開発のために生まれた分散型のバージョン管理システムで、Gitを用いることで、分散型バージョン管理システムの特徴やブランチ、マージといった仕組みから複数人でのソフトウェア開発を容易に進めることができるようになること。

      そして、CI/CDとGitを組み合わせることでソフトウェア開発における一連の作業を自動化し、これによって、リリースプロセスを効率化し、ソフトウェアの品質を維持しながらリリーススピードの向上ができることをご紹介させていただきました。

      この記事が皆様のCI/CDやコード管理に踏み出す一歩として寄与することを願っています。
      最後までお読みいただき、ありがとうございました!

      参考記事

      ソースコード管理とは? | Splunk
      Developer Survey Results2018 | stack overflow