索引(名前順)

(1).NET用Jenkinsを立ち上げる

最終更新日:2022/05/15

第一部、Jenkinsおじさんを仲間にする。

はじめに

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

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

第一部ではLinux向けJenkinsに.NET 5用のツールを入れて、Docker上に立ち上げるところまで解説します。
「もうJenkinsも知ってるし、ソースもあるから環境だけ作れればいいぜ!」って方はこの部で終わりです!

Jenkinsについては、Jenkins自体がどのようなものかと、簡単なジョブを作れる程度の知識が必要です。
一応流れは説明しますが、詳しい解説はないので、各自調べるか勉強してください!

ちなみに、これからやることはAzure DevOpsで大体できるらしいですよ・・・(未確認)

Azure DevOps Services | Microsoft Azure
https://azure.microsoft.com/ja-jp/services/devops/

.NET環境インストールイメージ作成

いつも通りDockerイメージをDockerfileで作っていきます。
解説はPodmanなので、Dockerの方は適宜置き換えてお読みください。

イメージは公式とBitnami版があるが、Bitnami版のほうがカスタムしやすかったのでこっちで。

bitnami/bitnami-docker-jenkins: Bitnami Docker Image for Jenkins
https://github.com/bitnami/bitnami-docker-jenkins

(1):ファイル取得

Bitnami版Jenkinsのリポジトリからクローンして取得する。

(2):Dockerfile編集

「2/debian-10」フォルダに移動し、「Dockerfile」をエディタで開く。
今回追加するのは5点。

まずは「wget」を追加でインストール。
「install_packages 」の最後に追記する。

# Install required system packages and dependencies
RUN install_packages (長いので中略) wget

次に.NET用の環境変数を設定する。
「DOTNET_CLI_HOME」は.NETの作業フォルダ的なもの、これを設定しないとビルド時にエラーになる。
「PATH」には追加する.NETツールを使用するためのパスを追加。
「HOME」は色々あって固定、作業フォルダなので別のフォルダでも可能。
「SONAR_USER_HOME」は第三部で使用する「SonarQube」用、第三部までいかないなら不要。

# .NET Environment
ENV DOTNET_CLI_HOME="/home/dotnet" \
    PATH="/home/dotnet/.dotnet/tools:$PATH" \
    HOME="/home/dotnet" \
    SONAR_USER_HOME="/home/dotnet"
RUN mkdir /home/dotnet

その次は.NET SDKをインストールさせる。
公式の手順をそのまま追加。

Debian に .NET をインストールする - .NET | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-debian

# Install .NET SDK
RUN wget https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
RUN dpkg -i packages-microsoft-prod.deb
RUN rm packages-microsoft-prod.deb
RUN apt-get update && apt-get install -y apt-transport-https
RUN apt-get update && apt-get install -y dotnet-sdk-5.0

第三部で使用する「SonarQube」用のツールもインストールする。
第三部までいかないなら不要なのでパスしていい。
どちらにせよ作業フォルダに権限を付与しておく。

# Install .NET Tools
RUN dotnet tool install --global dotnet-sonarscanner
RUN dotnet tool install --global dotnet-reportgenerator-globaltool
RUN chmod 777 -R /home/dotnet

最後に.NETのロックファイルを削除させる。
削除しないと結構な確率でJenkinsでのビルドが失敗する。

# Remove .NET Lock
RUN rm -r /tmp/NuGetScratch/lock/

もし下記のようなのエラーが出た場合は、このロックファイルを削除する必要がある。

/usr/share/dotnet/sdk/5.0.407/NuGet.targets(565,5): error :
Unable to obtain lock file access on '/tmp/NuGetScratch/lock/aae88f3c14dc199495b9493acae97ac082428280' for operations on '/home/dotnet/.nuget/NuGet/NuGet.Config'.
This may mean that a different user or administrator is holding this lock and that this process does not have permission to access it.
If no other process is currently performing an operation on this file it may mean that an earlier NuGet process crashed and left an inaccessible lock file, in this case removing the file '/tmp/NuGetScratch/lock/aae88f3c14dc199495b9493acae97ac082428280' will allow NuGet to continue.

最終的にはこんな感じ。
長いので折りたたみ(クリックして展開)

(3):ビルド

ビルドしてイメージを作成する。

podman build ./ -t jenkins_net:1.0.0

終了後はイメージ一覧コマンドで作成され追加されているか確認する。

動作確認

(1):立ち上げ

さっとdocker-compose.ymlファイルを作って立ち上げましょう。

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'

volumes:
  jenkins_data:
    driver: local

「http://(IPアドレス):8080」にアクセスしてログインページが表示されたら立ち上げは成功。
アカウント名とパスワードはdocker-compose.ymlで設定したやつ。

jenkins_01.png

(2):ジョブ作成

ログインすると「プラグインのアップデートしろ」通知があるが、無視してまずは.NETがインストールできたか確認する。
左のメニューから「新規ジョブ作成」を選びジョブ作成ページへ。
ジョブ名を入力し、「パイプライン」を選択したら「OK」でジョブを作成する。

jenkins_02.png jenkins_03.png

ジョブの設定に関してはすべてすっ飛ばして、パイプラインの定義のみ行う。
右のメニューから「Hello World」を選択しサンプルを呼び出し、8行目に.NETの情報を呼び出すコマンドを追記する。
入力が終わったら「保存」でジョブを保存する。

sh 'dotnet --info'

jenkins_04.png

(3):ビルド実行

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

jenkins_05.png jenkins_06.png

(4):ログ出力確認

ビルド結果のページからログを確認し、.NETが使えるか確認する。
ビルド結果には赤枠のリンクからビルド結果ページに飛んでいける。

jenkins_07.png

左のメニューから「Console Output」を選択し、ビルド時のログ出力を確認する。
.NETの情報がログに出力されていれば無事に環境構築は無事完了!

+ dotnet --info
.NET SDK (reflecting any global.json):
 Version:   5.0.407
 Commit:    1a1785612e
(以下略)

jenkins_08.png

おわりに

これでJenkinsに.NET環境を入れる作業は終わりです。
これも.NETが様々なプラットフォームで動かせるようになったおかげです、サンキューMS!

次は実際にソースを取得してビルドと単体テストをします、お楽しみに!

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


メインページに戻る


(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で静的解析&コードカバレッジ集計


メインページに戻る


(3)SonarQubeで静的解析&コードカバレッジ集計

最終更新日:2022/05/15

第三部、Jenkinsおじさんは疲れたので特に何もしない。

はじめに

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

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

第三部ではSonarQubeを使ってソースの静的解析を行い、ついでに単体テストのコードカバレッジも集計していきます。
SonarQube自体はC#以外にも色んな言語に対応しているので、覚えておくとソースのクオリティが上がります(多分)

SonarQubeとは

SonarQubeとはコードを静的解析し、品質やセキュリティを保つ素晴らしいツール。
オープンソースであり無料で使え、JenkinsやGitHubなど、他のプラットフォームとの連携も可能。
有償プランもあり、対応言語とかレポートの出力とか追加される。

Code Quality and Code Security | SonarQube
https://www.sonarqube.org/

SonarQube Documentation | SonarQube Docs
https://docs.sonarqube.org/latest/

SonarQube構築

(1):下準備

Dockerで立ち上げる前に、プロセスが使用可能なメモリマップ領域を確認する、下記のコマンドで確認可能。
低すぎるとSonarQubeが動かない可能性があるため、最大値を上げる。

sysctl vm.max_map_count

設定方法は2種類、手っ取り早いのは以下、ただし再起動すると元に戻る。

sysctl -w vm.max_map_count=524288

もう1つは直接「/etc/sysctl.conf」を編集する、こちらは再起動しても設定した値になる。
下記の設定を書き込むだけ、編集方法は任せる!

vm.max_map_count=524288

これらはLinuxの場合のみ、Windowsは・・・知らんw

(2):DockerCompose編集

前回のdocker-compose.ymlにSonarQubeと、SonarQube用のPostgresを追加する。
特に追加の環境設定はなし。

version: '3.8'
services:

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

  gitea:
    image: gitea/gitea:latest
    container_name: gitea_cont
    ports:
      - "3000:3000"
      - "3022:22"
    environment:
      - GITEA__webhook__ALLOWED_HOST_LIST=*
    volumes:
      - gitea_data:/data

  # ★SonarQube用Postgresを追加!
  postgres:
    container_name: postgres_cont
    image: postgres:13.4-alpine
    environment:
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=sonar
    volumes:
      - postgres_data:/var/lib/postgresql/data

  # ★SonarQubeを追加!
  sonarqube:
    container_name: sonarqube_cont
    image: sonarqube:community
    depends_on:
      - postgres
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://postgres:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
    ports:
      - "9000:9000"

volumes:
  jenkins_data:
    driver: local
  gitea_data:
    driver: local
  postgres_data:
    driver: local
  sonarqube_data:
    driver: local
  sonarqube_extensions:
    driver: local
  sonarqube_logs:
    driver: local

(3):立ち上げ

「http://(IPアドレス):9000」にアクセスしてログインページが表示されたら立ち上げは成功。
立ち上げに時間がかかるので、紅茶でも飲んで少し待つこと。
初期IDとパスワードは「admin」で、初回ログイン後にパスワードの再設定をする。

sonar_01.png

ログイン後のページ、ここで後ほどプロジェクトを作成する。

sonar_02.png

(4):プロジェクト作成

SonarQubeはプロジェクト単位で静的解析とかを行う。
今回は前回の.NET Coreのソースを利用するので、C#のプロジェクトを作成していく。
手動で行うので「Manually」を選択。

sonar_03.png

プロジェクト作成ページでは、プロジェクト名とプロジェクトキーを入力する。
ここでは「TestCS」とする。
入力後「SetUp」を選択して次へ。

sonar_04.png

ここでは解析するリポジトリを選択する。
「Jenkins」があるがこれは罠で、下の「Locally」を選択する。

sonar_05.png

解析プロジェクトページではまずはアクセス用のトークンを生成する。
適当に入力してトークンを生成、これは後で使うのでメモっておく。
生成したら「Continue」で次へ。

sonar_06.png sonar_07.png

次へと言ったが、ここは実はただの解説ページなので飛ばしていい。
一応説明すると今回は.NET Coreが対象なので、ビルド対象を「.NET」、ビルドツールを「.NET Core」と選択すると、その使い方が表示される。

sonar_08.png

これでSonarQubeでの作業は終わり。

Jenkins連携

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

Jenkinsのプラグイン管理のページで、右上の検索窓に「sonarqube」と入力。
するとSonarqubeプラグインが表示されるので、チェックしてインストールする。

sonar_09.png

インストール後、システム設定のページにSonarQubeのプラグインの項目が追加されているので、そこに立てたSonarQubeのアドレスを入力する。
「Name」は何入力してもいいが、後で使用するのでメモしておく。
その後、先程生成したアクセストークンの認証情報を追加するので、下の追加を選択する。

sonar_10.png

認証情報追加ダイアログが表示されるので、種類の「Sercret Text」を選択し、「Sercret」にアクセストークンをコピペする。
「ID」はJenkins内での識別用ID、「説明」はその認証情報の説明なので分かりやすいものを入力しておく。
終わったら「追加」を選択し、追加した認証情報を選択して保存する。

sonar_11.png sonar_12.png

(2):Jenkinsファイル編集

SonarQubeプラグインの設定が終わったら、次はそれを使用するためにJenkinsファイルを編集する。
SonarQube用の環境変数を呼び出す「withSonarQubeEnv」を追加し、その中で第一部で.NET用Jenkins構築時に追加したツールを呼び出す。

「withSonarQubeEnv」のパラメータは、SonarQubeサーバーを追加した時に「Name」に入力した名称を設定する。

ツール「SonarScanner」の使い方は簡単で、「begin」~「end」の間にビルドとテストをするだけ。
「begin」のパラメータ「/k」には、SonarQubeで作成したプロジェクト名を設定する。

ツール「ReportGenerator」は、レポートを生成するツール。
ここでは単体テスト時にコードカバレッジレポートを出力し、このツールでSonarQube用に変換している。

stage('SonerQube') {
    steps {
        withSonarQubeEnv('SonarQube') {
            echo 'SonerQube'
            sh 'dotnet sonarscanner begin /k:"TestCS" /d:sonar.coverageReportPaths="./SonarQubeCoverage/SonarQube.xml"'
            sh 'dotnet build ./RunRunGridLinerCore/'
            sh 'dotnet test ./RunRunGridLinerCore_Test/ --collect:"XPlat Code Coverage"'
            sh 'reportgenerator -reports:"RunRunGridLinerCore_Test/TestResults/*/coverage.cobertura.xml" -targetdir:"./SonarQubeCoverage" -reporttypes:"SonarQube"'
            sh 'dotnet sonarscanner end'
        }
    }
}

最終的にはこんな感じ。
Jenkinsファイルの編集が終わったらリポジトリにアップする。

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/'
            }
        }
        stage('SonerQube') {
            steps {
                withSonarQubeEnv('SonarQube') {
                    echo 'SonerQube'
                    sh 'dotnet sonarscanner begin /k:"TestCS" /d:sonar.coverageReportPaths="./SonarQubeCoverage/SonarQube.xml"'
                    sh 'dotnet build ./RunRunGridLinerCore/'
                    sh 'dotnet test ./RunRunGridLinerCore_Test/ --collect:"XPlat Code Coverage"'
                    sh 'reportgenerator -reports:"RunRunGridLinerCore_Test/TestResults/*/coverage.cobertura.xml" -targetdir:"./SonarQubeCoverage" -reporttypes:"SonarQube"'
                    sh 'dotnet sonarscanner end'
                }
            }
        }
    }
}

「SonarScanner」の詳しい使い方は↓の公式へ!

SonarScanner for .NET | SonarQube Docs
https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-msbuild/

「ReportGenerator」の詳しい使い方は↓の公式へ!

単体テストにコードカバレッジを使用する - .NET | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/core/testing/unit-testing-code-coverage?tabs=windows

(3):ビルド実行

Jenkinsに戻り、ジョブの左のメニューから「ビルド実行」を選択しビルド実行。
前回から続きであれば自動ビルドが走るはず。
少し時間がかかるので、紅茶飲みながらクッキーでも食べて待つこと。

成功すると、SonarQube用に追加したステージ「SonarQube」が追加される。
また、左のメニューにSonarQubeの該当のプロジェクトへのリンクが追加されている。

sonar_13.png

(4):静的解析結果

SonarQubeの作成したプロジェクトを見てみると、先程の静的解析の結果が反映されている。
「Pass」と出てるので、多分良い結果なはずw

sonar_14.png

「Issues」のページに詳細が出ており、ここでどのコードを直せばいいか確認できる。

sonar_15.png

「Measures」のページではコードカバレッジの結果が出ており、単体テストでどれぐらいコードをカバーしたか確認できる。

sonar_16.png

他にはセキュリティに関する関するページなどもあるので、ヤバそうなコードがあったらここに表示されると思う。

おわりに

これでSonarQubeで静的解析とコードカバレッジ集計ができました。
昨今色々なツールがありますが、ローカルな環境で静的解析できるのは便利だと思いました。

以上で「Jenkinsで.NET用環境構築を作る」は終わりです。
Jenkinsは遊び甲斐があるので、これからも解説は増やしていきたいですね!

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


メインページに戻る


Jenkins

最終更新日:2022/05/15

歴史ある自動化サーバー

解説

◆Jenkinsとは
未作成、そのうち作る(~_~)

Jenkinsで.NET用環境構築を作る

大長編3部作です!

(1).NET用Jenkinsを立ち上げる
Docker上に.NET用Jenkinsを構築しよう!

(2)Giteaからソースを取得してビルド&テスト
Webhookで連携させて自動化させよう!

(3)SonarQubeで静的解析&コードカバレッジ集計
自分のソースのガバガバ具合を確認しよう!


コンテンツ一覧へ戻る