組み込みLinux開発でJenkinsを使った自動ビルド環境の構築

# 背景
組み込みソフトウェアの開発で、OSとCPUのポーティングを行う事になり、開発環境を一から構築し直す事になりました。
今までは自動化などはしていなかったため、思い切って自動化をしてみました。


# 使用したツール
* Jenkins
* Hyper-V
* Cppcheck
* Git

# 概要

手元にあまり使われていないPCがあったため、それをサーバーとしてコード編集以外の作業をサーバーに任せる形で環境を構築します。

![構成図.jpg](https://qiita-image-store.s3.amazonaws.com/0/211147/59454666-a505-88d0-4416-61d5ccf6aea9.jpeg)




gitサーバーはGit for Windowsのdaemonを使用しましたが、今後はGitLabに移行したいと考えています。


## バージョンとか

|ツールとか|ローカルPC|リモートPC(ホストOSM)|リモートPC(ゲストOS)|
|:----:|:----:|:----:|:----:|
|Windows|Windows8.1|Windows8.1|Hyper-V(Ubuntu 17.10)|
|Git|2.15.1.windows.2|2.15.1.windows.2|git version 2.17.0|
|Jenkins|-|2.107.3|-|
|Cppcheck|-|1.83|-|


## 1.Jenkinsの設定

プラグインなどはGitとSSH接続ができればOK。
すみません。色々と試してたため覚えてません。。。
多分、`SSH plugin`と`Git Plugin`だと思います。

基本的にはJenkinsのワークディレクトリを使用しています。
（あまり良くないかもしれませんが。。。）
ワークディレクトリのい位置は、`Jenkinsの管理` - `システムの設定` から確認できます。

### 1.1.ジョブ作成

1.ログイン後、`新しいジョブ`をクリック。
2.ジョブの名前を設定。とりあえずsampleという名前で作成。
3.`フリースタイル・プロジェクトのビルド`を選択してOK。
4.下記のようにビルド設定をします。

* ソースコード管理
    * `Git`を選択
        * `リポジトリURL`にリモートPCのディレクトリを設定(`E:\git\sample.git`)

![ソースコード管理.jpg ](https://qiita-image-store.s3.amazonaws.com/0/211147/96df810b-ee6c-8f51-7abe-f08305a79d7d.jpeg)

* ビルド・トリガ
    * `リモートからビルド`をチェック
        * `認証トークン`に任意の文字列を設定(`sample`)

![ビルド・トリガ.jpg](https://qiita-image-store.s3.amazonaws.com/0/211147/63578f61-d92d-44ef-e86e-7540b4d0b309.jpeg)



### 1.2.リモートビルド

次に、要のビルド手順の設定を行います。
リモートホスト側は git clone 済みです。
鍵認証ではなく、パスワード認証としています。

### 1.2.1.SSH

[こちら](https://tomokazu-kozuma.com/setting-to-ssh-from-jenkins-to-remote-server/)を参考にさせていただきました。

(1) 認証情報

* Jenkinsのトップページから、`認証情報`の`System`をクリック
* `グローバルドメイン`をクリック
* `認証情報の追加`を選択

![グローバルドメイン.jpg](https://qiita-image-store.s3.amazonaws.com/0/211147/800dfe2e-6ba0-bcaa-5e60-9c1000f7bb4b.jpeg)
![認証情報の追加.jpg](https://qiita-image-store.s3.amazonaws.com/0/211147/3e5130df-62bc-dbc5-ec85-4a672b08f31c.jpeg)


(2) 認証情報の追加

* `種類`に`ユーザー名とパスワード`を選択
* `スコープ`に`グローバル`を選択
* `ユーザー名`、`パスワード`にリモートホストのユーザー情報を入力
* `ID`は未入力
* 必要なら`説明`も入力。
* `保存`を選択

![認証情報.jpg](https://qiita-image-store.s3.amazonaws.com/0/211147/d7122ca6-1a3d-d037-5249-ed2ef9526552.jpeg)


(3) SSHリモートホストの追加

* トップページから、`Jenkinsの設定`の`システムの設定`を選択
* `SSHリモートホスト`から `追加`をクリック
    * `ホスト名`にリモートホストのホスト名またはIPアドレスを入力
    * `ポート`に接続ポート番号を入力(デフォルトは22)
    * `Credentials`に先程作成したユーザーを選択
    * `Check connection`をクリック
    * `Successfull connection`が出れば接続成功
    * 保存をクリック

![SSH.jpg](https://qiita-image-store.s3.amazonaws.com/0/211147/061c9e44-4dfa-ce8b-1275-af732f5bdd82.jpeg)

(4) ビルド設定

* トップページから作成したsampleジョブを選択して、設定をクリック
* `ビルド手順の追加`から`リモートホストでシェルを実行`を選択
    * `SSHサイト`を先程作成した認証情報
    * `シェルスクリプト`に実行したいコマンドを入力
    * 保存をクリック

![ビルド.jpg](https://qiita-image-store.s3.amazonaws.com/0/211147/4528005c-60db-f817-3bcd-d95fe013ee55.jpeg)


(5) ビルド後の処理

* `ビルド後の処理の追加`から`成果物を保存`を選択
    * `保存するファイル`を入力
        * カレントディレクトリは**Jenkinsのワークディレクトリ**です。
        * ビルドで作成した実行ファイルを選択しました。

![ビルド後.jpg](https://qiita-image-store.s3.amazonaws.com/0/211147/bdb64e53-bdca-4db4-a178-23c2104e8976.jpeg)



## 1.3.Cppcheck

(1) Cppcheck

CppcheckはリモートPCのWindows側にインストールしています。
パスは事前に通してあります。


(2) ビルド設定

* トップページから作成したsampleジョブを選択して、設定をクリック
* `ビルド手順の追加`から`Windowsバッチコマンドの実行`を選択
    * `コマンド`にCppcheckを実行するコマンドを入力
        * 作業ディレクトリは、**Jenkinsのワークスペース**で行われます。
        * 詳細は省きますが、`cppcheck --xml --enable=all . 2> report.xml`を入力しました。
* ビルド後の処理で、出力されたファイルを選択します。
    * こちらもカレントディレクトリは**Jenkinsのワークスペース**になります。
    * `report.xml`と入力しました。
* 保存をクリック

![cppcheck.jpg](https://qiita-image-store.s3.amazonaws.com/0/211147/ef1bf997-3aa6-1d3c-2c5e-c23334ea2895.jpeg)


上記の設定でビルド処理は完成です。
この状態でsampleプロジェクトの`ビルド実行`を行って成功すればOKです。


## 2.Gitの設定

git push をトリガーにするための設定です。

### 2.1.Gitサーバー

まずは動かす事を前提に、とりあえずでWindows上でサーバーを立てました。
後々GitLabとか使ってみたいと思ってます。

次のコマンドを実行するとサーバーとして立ち上がります。
`git daemon --export-all --enable=receive-pack --base-path=E:\git --verbose`

| オプション | 概要 |
|:--|:--|
|--export-all|git-daemon-export-okファイルがなくても許可。|
|--enable=receive-pack|許可するサービス今回は匿名プッシュを許可。|
|--base-path=C:\git|許可するディレクトリのトップ。<br>git以下にxxx.gitフォルダがある。|
|--verbose|接続してきた相手とファイルを表示。|

※参考
https://git-scm.com/docs/git-daemon


### 2.2.hook

こちらの記事を参考にさせていただきました。
[git hook はじめの一歩 - Qiita](https://qiita.com/mhimuro/items/adfc4e5a168d2d9295ae)
[Git hooks まとめ - Qiita](https://qiita.com/khlizard/items/dfe1ec9d82c0ed5da7c6)

今回しようしたのは、**post-update**になります。
pushを受けた際ブランチ毎に実行されるようです。
ブランチ毎に処理を分けての処理は今後の課題です。

`git init`すると.gitフォルダ内にhooksフォルダ作成されます。
その中にサンプルファイル`post-update.sample`がありますので、それを参考にしながらファイルを作成します。
ファイル名は`post-update.sample`ファイルの拡張子を消して、`post-update`とします。
Windows版のGit hookは、**git-bash**で実行されました。

`curl --user "(username):(password)" (URL)`
という形式です。
もう少し具体的に書くと、
`curl --user "user:password" http://192.168.xxx.xxx:8080/job/sample/build?token=sample`
です。
ユーザー名、パスワード、IPアドレス、ポート番号の部分は自分の環境に合わせてください。

# おわりに

以上で設定は完了です。
周りに聞ける人がいない中で独自に構築したので、普通はこうするなどの教えていただけると助かります。

今後は、GitLab-CEやStackStormが組み込み開発で使えないかなどを調べていきます。

以上です。最後までご覧いただきありがとうございます。