LoginSignup
11
8

More than 1 year has passed since last update.

WSLを使ってWindows環境で完結するCI環境を構築する

Last updated at Posted at 2022-01-06

目的

ローカルのWindows PCで完結するCI環境を構築すること。
全体イメージ
image.png

前提条件

環境

  • WSL(Ubuntu)はインストール済
  • Visual Studio Codeはインストール済
    • プラグインとしてRemote-WSLはインストール済(Visual Studio Code上からWSL上で作業できるようになる)
  • Jenkinsで基本的なjobの作成ができる

ソースコード

設定例の説明用

├── CMakeLists.txt
├── build                   # CMake実行ディレクトリ
├── include
├── lib
│   ├── ubuntu              # ライブラリ置き場(gtest, gmock)
├── pkgconfig
│   └── ubuntu
├── src                     # ソースコードディレクトリ(テストしたいコード)
│   ├── CMakeLists.txt
│   └── *.cpp               # テスト対象ファイル
└── test                    # テストコードディレクトリ
    ├── CMakeLists.txt
    ├── main.cpp
    └── unittest_***.cpp    # テストケースファイル

環境構築手順

gccなどビルド環境に必須なツール

$ sudo apt install build-essential

CMake

インストール

$ sudo apt get -y install cmake

コンパイラをClangに切り替え

./CMakeLists.txtに以下記載

set(CMAKE_C_COMPILER "/usr/bin/clang" CACHE string "clang compiler" FORCE)
set(CMAKE_CXX_COMPILER "/usr/bin/clang++" CACHE string "clang++ compiler" FORCE)

GoogleTest

インストール

レポジトリではビルドしたライブラリを./lib/ubuntu以下に含ませているので不要
ライブラリのリンク方法はレポジトリのCMakefile.txtを参照。
自身でインストールする場合は、以下の記事が参考になると思います。

C++ TestMate(VSCode上にGoogleTestの結果を可視化するプラグイン)

見た目は以下のようになります。

カバレッジ

lcovのインストール

sudo apt install lcov

coverageを取れるようにするCMake設定

set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} --coverage")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")

参考
https://qiita.com/imasaaki/items/0021d1ef14660184f396#%E8%A7%A3%E8%AA%AC
https://www.hiroom2.com/2015/07/06/jenkins%E3%81%AEcobertura-plugin%E3%81%A8lcov-to-cobertura-xml%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/

Code Coverage(VSCode上にカバレッジの結果を可視化するプラグイン)

使い方

カバレッジ情報が含まれているファイルを coverageディレクトリ 内に置く必要がある
buildディレクトリ内で cmake .., make して実行ファイルを走らせた後

$ lcov -c -d ./build -o lcov.info
$ lcov -r lcov.info */googletest/* test/* */c++/* -o lcov.info
$ mv lcov.info ./coverage

これで、以下のような見た目になる。

コード管理、分析

clang-format(フォーマッター)

Googleで採用されている(by Googleのソフトウェアエンジニアリング)
clang-formatのインストール

sudo apt install clang-format

clang-tidy(静的解析ツール)

Googleで採用されている(by Googleのソフトウェアエンジニアリング)
clang-tidyのインストール

sudo apt install clang-tidy

clang-format, clang-tidyのCMake設定

を参考に設定する。

他参考サイト
https://qiita.com/yoyomion/items/8ff1f5a63b4b4f757732

Jenkins

参考サイト

インストール

$ sudo apt -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# JAVA
$ sudo apt -y install openjdk-8-jdk
$ sudo apt -y install openjdk-11-jre-headless
# Jenkins
$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add
$ sudo bash -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
$ sudo apt update
$ sudo apt install jenkins
# Update Firewall to enable Jenkins service
$ sudo ufw enable
$ sudo ufw allow 8080 # whatever port number you like
$ Check the status of your port:
$ sudo ufw status
# Run Jenkins server
$ sudo service jenkins start
# この後、Winodwsブラウザのhttp://localhost:8080/ からJenkinsにアクセスできる
# できない場合は JenkinsにWSLをpower shellから`wsl.exe --shutdown` で再起動してから再度jenkins startしてみる
# 初期パスワード確認
$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword

起動

sudo service Jenkins start

Tips

localhostから拒否されるときは
WSLをpower shellからwsl.exe --shutdown で再起動してから、再度WSLを立ち上げてjenkins startしてみる(原因はよくわからない。。)

初期設定

Windowsブラウザで http://localhost:8080 にアクセス
Adminパスワードは $ sudo cat /var/lib/jenkins/secrets/initialAdminPassword で確認する

Jenkinsプラグインのインストール設定

Warningの集計、可視化するプラグイン(Warnings Next Generation)

以下をインストール

設定はビルド後の処理から Record compiler warnings and static analysis results を選んで、ツールとして Clang-Tidy を選択する

これで↓のような出力が得られる。

テスト結果集計のプラグイン(JUnitテスト結果の集計)

C++でもJUnitテスト結果の集計を使う。

test_result.xmlは実行時に--gtest_output=xml:test_result.xmlをオプション設定することで出力される。
参考 : https://srz-zumix.blogspot.com/2012/03/google-test-jenkins.html

これで↓のような出力が得られる。

カバレッジをレポートするプラグイン(Cobertuna)

カバレッジをレポートするにはlcovの出力結果をxmlに変換する必要がある。
カバレッジ のセクションでlocvのインストールとCMakeの設定は済。
xmlへの変換はlcov_cobertura.pyが必要となる。
wget https://raw.githubusercontent.com/eriwen/lcov-to-cobertura-xml/master/lcov_cobertura/lcov_cobertura.py
から落とせるが、今回はレポジトリ内の./toolにおいてあるファイルを使う。

lcov -c -d ./build -o coverage.info
lcov -r coverage.info */googletest/* test/* */c++/* -o coverageFiltered.info
./tool/lcov_cobertura.py coverageFiltered.info -b ./ -o coverage.xml

生成されたcoverage.xmlを設定する。

これで↓のような出力が得られる。

最終的なshellの内容

git clone https://github.com/azukibar0713/wsl-ci-env/
cd wsl-ci-env
mkdir build
cd build
cmake ..
make
./test/TestSample1 --gtest_output=xml:test_result.xml
cd ..
lcov -c -d ./build -o coverage.info --gcov-tool `pwd`/tool/llvm-gcov.sh
lcov -r coverage.info */googletest/* test/* */c++/* -o coverageFiltered.info
./tool/lcov_cobertura.py coverageFiltered.info -b ./ -o coverage.xml
11
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8