プロジェクト

全般

プロフィール

(2)Giteaからソースを取得してビルド&テスト

最終更新日:2022/05/15

第二部、Jenkinsおじさんにパシらせる。

はじめに

このページは「Jenkinsで.NET用環境構築を作る」の第二部です。

(1).NET用Jenkinsを立ち上げる
(2)Giteaからソースを取得してビルド&テスト←イマココ!
(3)SonarQubeで静的解析&コードカバレッジ集計

第二部ではGitからソースを取得するように指示し、取得したソースをビルドできるようにします。
この解説ではGiteaを使い、最終的にはWebhookを通してプッシュ時に自動的にビルドするように構築していきます。
もし自動ビルドが不要な場合は、通常のGitでも可能です。(ソース引っ張ってくるだけなので)

Giteaについてはこちら(大した解説ないのでググって調べたほうが早い)
サーバー/Gitea

Gitea構築

(1):DockerCompose編集

まずは前回のdocker-compose.ymlにGiteaを追加する。

Giteaの環境設定で「GITEA__webhook__ALLOWED_HOST_LIST=*」を追加している。
これはWebhookの呼び出しホストの設定で、すべてのホストを許可にしている。
ローカルや閉じたネットワークの場合はこれでいいが、もし外部に公開されているネットワークの場合は確認すること。

Config Cheat Sheet - Docs
https://docs.gitea.io/en-us/config-cheat-sheet/

version: '3.8'
services:

  jenkins:
    image: localhost/jenkins_net:1.0.0
    container_name: jenkins_cont
    ports:
      - '8080:8080'
      - '50000:50000'
    environment:
      - JENKINS_USERNAME=user
      - JENKINS_PASSWORD=bitnami
    volumes:
      - 'jenkins_data:/bitnami/jenkins'

  # ★Giteaを追加!
  gitea:
    image: gitea/gitea:1.16
    container_name: gitea_cont
    ports:
      - "3000:3000"
      - "3022:22"
    environment:
      - GITEA__webhook__ALLOWED_HOST_LIST=*
    volumes:
      - gitea_data:/data

volumes:
  jenkins_data:
    driver: local
  gitea_data:
    driver: local

(2):立ち上げ

「http://(IPアドレス):3000」にアクセスして初期設定ページが表示されたら立ち上げは成功。
設定としては「サーバードメイン」と「GiteaのベースURL」をアクセスしたIPアドレスに設定するぐらい、他はデフォルト。
最後に「Giteaをインストール」を選択してインストールする。

gitea_01.png

インストール後は下記のページが表示されるので、赤枠の新規アカウント登録をする。
最初に登録したアカウントが管理者となる。

gitea_02.png gitea_03.png

(3):リポジトリ作成

ここはリポジトリを作ってソースをアップするだけなので、知ってる人はパスしていい。
ユーザーページの赤枠のところからリポジトリを新規作成する。

gitea_04.png

リポジトリ名はなんでもヨシ!
「リポジトリを作成」を選択してリポジトリを作成する。

gitea_05.png

リポジトリ作成完了、ここに確認用のソースを追加する。
追加方法は各自に任せるが、確認用のソースは例として「WindowsFormsで遊戯王を交えながらMVVMっぽく作って単体テストもやってみる」で作ったものを置いておきます。
[DL] RunRunGridLiner-develop.zip

gitea_06.png

最後にJenkinsファイルをリポジトリのルートに追加する、ファイル名は「Jenkinsfile」(拡張子なし)となる。
中身は前回.NETの環境確認に使用したもの、後々これにビルドの指示を記載していく。

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
                sh 'dotnet --info'
            }
        }
    }
}

gitea_07.png

Jenkins連携

ここからはJenkinsに先程のリポジトリからソースを取得するように指示していきます。

(1):ジョブ作成

ジョブ作成でパイプラインのジョブを作成する。

gitea_08.png

ジョブの設定でパイプラインを先程のリポジトリに合わせていく
「定義」を「Pipeline script from SCM」に変更、すると画像のようにSCMを設定できるようになる。
「SCM」は「Git」を選択、「リポジトリURL」に先ほど作成したリポジトリを入力する。
今回ソースの取得のみなので認証情報は未設定でOK、もしプライベートリポジトリにしてたら必要かも?
「ビルドするブランチ」は変更していなければ「*/master」のままでOK。
入力が終わったら「保存」を選択してジョブを作成する。

gitea_09.png

(2):ビルド実行

作成したら左のメニューから「ビルド実行」を選択しビルド実行。
成功するとビルド結果#1が緑色で表示される。

gitea_10.png

ビルド結果のページから、ビルド時のログ出力を確認する。
先ほど作成したリポジトリからのチェックアウトと、Jenkinsfileの中身が実行されていることが確認できる。

gitea_11.png

(3):.NETビルド記述

無事にリポジトリからソースを取得できたので、実際に.NETのビルドをJenkinsファイルに記述していく。
ここではLinux上でビルドするため、Windowsのコンポーネント(WindowsFormsとか)を含むビルドはエラーになるので注意。
もしWindows上でJenkinsを構築しているならビルドできる・・・はず!

先程のJenkinsファイルにクリーンとビルドとテストのステージを追加する。
最初にクリーンを行い、.NET Coreのプロジェクト(RunRunGridLinerCore)をビルドし、それのテストプロジェクト(RunRunGridLinerCore_Test)の単体テストを実行するようにしている。

「Clean」ステージでは今回の対象のプロジェクトのクリーン。
「Build」ステージでは.NET Coreのプロジェクトのビルド。
「Test」ステージではテストプロジェクトのテスト実行。

pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
                sh 'dotnet --info'
            }
        }
        stage('Clean') {
            steps {
                echo 'Clean'
                sh 'dotnet clean ./RunRunGridLinerCore/'
                sh 'dotnet clean ./RunRunGridLinerCore_Test/'
            }
        }
        stage('Build') {
            steps {
                echo 'Build'
                sh 'dotnet build ./RunRunGridLinerCore/'
            }
        }
        stage('Test') {
            steps {
                echo 'Test'
                sh 'dotnet test ./RunRunGridLinerCore_Test/'
            }
        }
    }
}

それぞれのステージのdotnetコマンドでプロジェクトを指定しているが、これは他のプロジェクトにこの環境ではビルドできないプロジェクトが含まれているため。
プロジェクトを指定しないとソリューション全体でのクリーンやビルドになり、エラーが発生してジョブが途中で止まってしまう。

Jenkinsファイルの編集が終わったらリポジトリにプッシュしておく。

(4):再度ビルド実行

Jenkinsに戻り、再度ジョブの左のメニューから「ビルド実行」を選択しビルド実行。
成功すると、.NETビルド用に追加したステージ「Clean」「Build」「Test」が追加されているのがわかる。
ビルドやテストでエラーになった場合は、失敗したステージでエラーとなり赤く表示される。
ビルドエラーになるソース上げるな!

gitea_12.png

出力ログにもビルドやテストのログが出力されている、特にエラーなくビルドとテストが実行されていれば無事完了!
エラー時もこのログに表示されるので、何か問題があった場合はここを見ること。

gitea_13.png gitea_14.png

Webhookで自動ビルド

ここではGiteaのWebhookを使い、Jenkinsがそれを検知して自動ビルドするようにしていきます。

(1):Giteaプラグイン追加

「Jenkinsの管理」から管理ページに移り、「プラグインの管理」を選択する。

webhook_01.png

真ん中の「利用可能」を選択すると、利用できるプラグインの一覧が表示されるので、右上の検索窓に「gitea」と入力。
するとGiteaプラグインが表示されるので、チェックしてインストールする。

webhook_02.png

インストール後は再度「Jenkinsの管理」から管理ページに移り、今度は「システムの設定」を選択する。

webhook_03.png

スクロールしていくと先程追加したGiteaプラグインの項目が追加されているので、そこに立てたGiteaのアドレスを入力する。
正しいアドレスが入力されるとすぐ下に実行中のGiteaのバージョンが表示される。
入力が終わったら保存する。

webhook_04.png

(2):Webhookの設定(Gitea)

Giteaの方に戻り、リポジトリの「設定」から「Webhook」を選択する。

webhook_05.png

Webhookの設定ページになるので、右の「Webhookを追加」から「Gitea」を選択しWebhookを追加する。

webhook_06.png

「ターゲットURL」には「http://(Jenkinsアドレス)/gitea-webhook/post?job=(対象ジョブ名)」と入力する。
Jenkinsアドレスが「192.168.11.10:8080」、対象ジョブ名が「TestJob2」の場合は、「http://192.168.11.10:8080/gitea-webhook/post?job=TestJob2」となる。

webhook_07.png

「トリガー」の項目ではどのイベントでWebhookを通知するかタイミングを選択できる。
今回はデフォルトの「プッシュのイベント」のままで進める。

入力が終わったら下の「Webhookを追加」で追加する。
その後、追加したWebhookのページに飛び、「テスト配信」を選択して疎通確認を行う。
成功すれば問題ないが、失敗した場合はJenkinsのGiteaプラグインの確認や、入力したURLを再度チェックする。

webhook_08.png

(3):Webhookの設定(Jenkins)

Giteaの方の設定が終わったので、Jenkinsのジョブの設定を行う。
と言っても簡単で、ジョブの設定で「SCMをポーリング」をオンにする。
ポーリングによる自動ビルドは、一度手動でビルドしてからじゃないとポーリング状態にならないので注意。

webhook_09.png

(4):自動ビルド実行

あとはリポジトリに適当にプッシュするだけ。
Jenkinsのジョブのページを開いていれば、自動的にビルドしてくれるところが見れるぞ!失敗したときは悲しいけどね!
ポーリングしているかどうかは「Gitのポーリングログ」で見ることができる。

webhook_10.png

おわりに

これでGiteaからソースを取得してビルドできるようになりました。
自動でビルドや単体テストまでしてくれると助かりますね、サンキューJenkinsおじさん!

最後はソースを静的解析してガバ具合を確認していきます、お楽しみに!

(1).NET用Jenkinsを立ち上げる
(2)Giteaからソースを取得してビルド&テスト←イマココ!
(3)SonarQubeで静的解析&コードカバレッジ集計


メインページに戻る

他の形式にエクスポート: PDF HTML TXT