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