🦊

GitLabにPushしたソースコードをJenkinsで自動テストしてみる!

に公開

実現したいこと

ローカル環境に構築したGitLabにソースコードをPushしてJenkinsで自動テストすること

GitLabでマージリクエストが作成された際にJenkinsで自動テストを実行して、テスト結果が良好の場合のみマージを許可します

環境

項目 バージョン
物理マシン OS macOS Sequoia バージョン15.4
ハイパーバイザ VMware Fusion プロフェッショナル バージョン 13.6.3
仮想マシン OS Ubuntu 24.04.2 LTS
仮想マシン CPU 4vCPU(GitLab), 2vCPU(Jenkins)
仮想マシン Memory 4GB
GitLab 17.11.1-ee
Jenkins 2.504.1
OpenJDK 17.0.14

GitLabでプロジェクトを作成

  • GitLabで新規プロジェクトを作成
    • Project Name:test-project-001
  • プロジェクトのマージ条件を指定
    左サイドバーのSettings -> Merge requestsで「Pipelines must succeed」のチェックを入れてSave changesボタンを押します

JenkinsにGitLabへのアクセス権を付与

  • GitLabでプロジェクトアクセストークンを作成
    左サイドバーのSettings -> Access tokensでAdd new tokenボタンを押します

    • Token name:Jenkins
    • Select a role:Maintainer
    • Select scopes:api

    Create project access tokenボタンを押して作成されたアクセストークンをコピーしておきます

  • JenkinsでGitLabプラグインをインストール
    Jenkinsの管理 -> Plugins -> Available pluginsでGitLabプラグインを検索してインストールします

  • JenkinsでGitLabプラグインを設定
    Jenkinsの管理 -> SystemでGitLabのセクションを設定します

    • Connection name:GitLab
    • GitLab host URL:http://<GitLabのIPアドレス>/
    • Credentials:追加ボタンからJenkinsを選択して新規トークンを設定します
      • Domain:グローバルドメイン
      • 種類:GitLab API token
      • スコープ:グローバル
      • API token:<GitLabで作成したアクセストークン>

    Test Connectionボタンを押してSuccessが表示されたら問題なく設定できているのでSaveボタンを押します

Jenkinsでジョブを作成

  • ダッシュボード -> 新規ジョブ作成でジョブ名を入力し、フリースタイル・プロジェクトのビルドを選択してOKボタンを押します

    • ジョブ名:test-project-001
  • ジョブを設定します

    • GitLab Connection:GitLab (先ほど作成したConnectionを選択)
    • ソースコードの管理:Git
      • リポジトリURL:http://<GitLabのIPアドレス>/user001/test-project-001
      • 認証情報:追加ボタンからJenkinsを選択してGitLabユーザのCredentialを設定します
        • Domain:グローバルドメイン
        • 種類:ユーザー名とパスワード
        • スコープ:グローバル
        • ユーザー名:<GitLabのユーザー名>
        • パスワード:<GitLabユーザーのパスワード>
      • ビルドするブランチ:*/develop
    • Triggers:「Build when a change is pushed to GitLab. ...」をチェック
      「Opened Merge Request Events」をチェック
    • Build Steps:シェルの実行
      今回はPythonを用いて簡単なテストを実行します
    python3 test_calculator.py
    
    • ビルド後の処理: 「Publish build status to GitLab」を選択

    以上を設定したらSaveボタンを押します

GitLabでJenkinsインテグレーションを設定

  • Webhook、Integrationsからローカルネットワークへのリクエスト許可を設定
    GitLabにrootユーザーでログイン後、左サイドバーのAdminボタンを押し、
    Settings -> Network -> Outbound requestsで「Allow requests to the local network from webhooks and integrations」のチェックを入れてSave Changeボタンを押します

  • GitLabユーザーでログイン後、今回のプロジェクトの左サイドバーからSettings -> IntegrationsでJenkinsのAddボタンを押します

    • Trigger:「Merge request」
    • Jenkins server URL:http://<JenkinsのIPアドレス>:8080/
    • Enable SSL verification:チェックを外す
    • Project name:test-project-001
    • Username:<Jenkinsのユーザー名>
    • Password:<Jenkinsユーザーのパスワード>

    Test settingsボタンを押してConnection Successful.と表示されたらOKなのでSave Changesボタンを押します

GitLabにソースコードをPushして自動テストの動作確認

  • 物理マシンにGitLabプロジェクトをクローン

    git clone http://<GitLabのIPアドレス>/user001/test-project-001.git
    cd test-project-001
    
  • 物理マシンからGitLabにソースコードをPush
    足し算をする簡単なPythonプログラムとテスト用のプログラムを作成します

    ソースコード
    # calculator.py
    def add(a, b):
        return a + b
    
    # test_calculator.py
    import unittest
    import calculator
    
    class TestCalculator(unittest.TestCase):
        def test_add(self):
            self.assertEqual(calculator.add(2, 3), 5)
    
    if __name__ == "__main__":
        unittest.main()
    

    developブランチを作成してGitLabにPushします

    git branch develop
    git checkout develop
    git add .
    git commit -m "[add] calculator.py test_calculator.py"
    git push origin develop
    
  • GitLabでマージリクエストを作成
    左サイドバーのMerge requestsでCreate merge requestボタンを押します

    • Title:[add] calculator.py test_calculator.py

    Titleを入力してCreate merge requestを押すとJenkinsがマージリクエストの作成を検知して自動テストが実行されます

  • 自動テストの結果確認
    Jenkinsでジョブ結果のコンソール出力を確認し、Finished: SUCCESSが表示されていればOKです

    Jenkinsジョブのコンソール出力
    # 抜粋
    [test-project-001] $ /bin/sh -xe /tmp/jenkins17365276700092986362.sh
    + python3 test_calculator.py
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.000s
    
    OK
    Finished: SUCCESS
    

    しばらくするとテスト結果がGitLabに連携されます
    GitLabプロジェクトの左サイドバーのMerge requestsで今回作成したマージリクエストを選択します
    成功していればPipeline #1 passedと表示されます

    最後にMergeボタンを押せば動作確認は完了です

まとめ

ローカル環境でGitLabとJenkinsを連携させて自動テストを実行することが出来ました!

Discussion