SiG Staff Blog

福井と金沢にある株式会社SIG 総合研究所で働きたい方、ご連絡ください。

BacklogでPR(Spring F/W)があったらJenkins(AWS)がコードレビューの一部をしてくれて、結果をSlackに通知してくれるようにする。~その7~

jenkinsの設定をする

jenkinsで各チェックが動くように設定をしていきます。

jenkinsにジョブを追加する。

1.jenkinsのダッシュボードを開く f:id:Bee_Flim:20180217164213p:plain

2.新しいジョブをクリックして、適当な名前を付けて”Mavenプロジェクトのビルド”を選択する。 f:id:Bee_Flim:20180217164218p:plain

Git、Mavenの設定をする。

1.[jenkinsの管理]->[Global Tool Configuration]を選択する。

2.Gitの所にエラーがないか確認する。

3.Mavenの所に、適当に名前を付けて自動インストールにチェックをする。*1

Slack連携の為に設定をする。

1.[jenkinsの管理]->[システムの設定]を選択する。 f:id:Bee_Flim:20180217164227p:plain

2.webhook設定の所に、slackのtokenキーを設定して、

3.endpointにslackのURLを指定する。”https://[チーム名].slack.com” f:id:Bee_Flim:20180217164223p:plain

ジョブの設定をする。

基本設定

  1. ダッシュボードに先ほど作ったジョブがあるので、選択する。
  2. 左のメニューにある[設定]を開く。
  3. プロジェクト名、説明を適当に設定する。
  4. Backlogにチェックを入れて、Backlog URLに"https://<スペースID>.backlog.jp/projects/<プロジェクトキー>"を設定する。
  5. ユーザー、パスワードはそのプロジェクトが見れるユーザーを指定する。(ブランクでも良い)
  6. APIキーには、前回Backlogの設定で取得したキーを設定する。 f:id:Bee_Flim:20180217164253p:plain

ソースコード管理の設定

  1. Gitを選択する。
  2. リポジトリURLにはbacklogのgitリポジトリを設定する。
  3. 認証情報の追加ボタンを押下して、種類に”ユーザー名とパスワード”を選択して、ユーザー名とパスワードにbacklogのアカウント情報を登録する。
  4. 認証情報に追加したアカウントが表示されるので、それを選択する。
  5. nulabさんのblog( Jenkins Backlog Pluginで、ビルド結果をプルリクエストに通知! | ヌーラボ )では、

    高度な設定 > Refspec : “+refs/pull/:refs/remotes/origin/pr/

を指定すると、プルリクエストが取れると書かれていたのですがプルリク時にうまく動かないので、その設定はブランクにしてビルドするブランチに**を指定することでプルリクエストがマージされたときに発動するようにしました。*2

pipelineの方には、プルリクエストを処理できるようになっているみたいで、今度試してみようと思います。

f:id:Bee_Flim:20180217164303p:plain

ビルドトリガの設定

  1. SCMをポーリングにチェックを入れます。 f:id:Bee_Flim:20180217164306p:plain

ビルド設定

  1. checkstyleやPMDなどのチェックを入れていく。
  2. 高度な設定を開いて、常に実行にチェックを入れる。
  3. 未解決タスクはテストコードを対象外にしたいので、パスを指定する。

f:id:Bee_Flim:20180217164309p:plain f:id:Bee_Flim:20180217164314p:plain f:id:Bee_Flim:20180217164317p:plain f:id:Bee_Flim:20180217164321p:plain f:id:Bee_Flim:20180217164324p:plain

ビルド後の処理

  1. JaCoCo、Slack Notification、Step Counterにチェックを入れる。
  2. Slack Notificationの高度な設定を開いて、"Team Subdomain"にチーム名を入れる。(”https://[チーム名].slack.com”のチーム名の部分)
  3. "Integration Token"にSlackのJenkinsCIで取得したトークンを設定する。
  4. "Project Channel"に通知をしたいchannelを指定する。
  5. 通知したいタイミングにチェックを入れる。
  6. Step Counterにはカウント対象のファイルを指定する。テストコードを除きたい場合は、除外するファイルパターンにテストコードのパスを指定する。 f:id:Bee_Flim:20180217164331p:plain f:id:Bee_Flim:20180217164341p:plain f:id:Bee_Flim:20180217164334p:plain

試してみる。

eclipseにテストコードを追加する。 f:id:Bee_Flim:20180217172130p:plain

こんな感じの適当な物を作成。

/*
 * ソースコード
 */
@SpringBootApplication
public class DemoApplication {

  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }

    public int addCalc(int x, int y) {
        return x + y;
    }

    public int minusCalc() {
      //FIXME テストを修正する事
      String bug = null;
      bug.toCharArray();
      return 1;
    }
  public void sample() {
    //Some thing
  }
}
/*
 * テストコード
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class DemoApplicationTests {

  @Autowired
  DemoApplication demo;

  @Test
  public void 加算の成功テスト() {
    assertEquals("成功", 3, demo.addCalc(1, 2));
  }

  @Test
  public void 加算の失敗テスト() {
    assertNotEquals("値が違う", 4, demo.addCalc(1, 2));
  }

  @Test
  public void 加算の失敗テスト2() {
    assertEquals("値が違う2", 4, demo.addCalc(1, 20));
  }

  @Test
  public void 加算の失敗テスト3() {
    assertEquals("値が違う3", 4, demo.addCalc(1, 20));
  }

}

Backlogにブランチをプッシュして、masterにプルリクエストを送信します。 そのあと、そのブランチをもう一度pushすると処理が走りました。

こんな感じで、実行結果が表示されました。 f:id:Bee_Flim:20180217164237p:plain

Slackにも通知が来るようになりました。 f:id:Bee_Flim:20180217172548p:plain

おわりに

一応、通知が来るようになったんですが、プルリクエストがあった時にチェックをしたいので、マージ時に実行されるのはいまいちですね。 デプロイする時にはこれでもよさそうな気がします。 pipelineを使うと、出来るようになるらしいので試してみます。

気になった事

ブランチをプッシュした後プルリクエストを送った後にそのブランチを更新しないと実行されないので、 実際の運用時に

”ブランチ作ったらとりあえずプッシュ、その後プルリクエストを送る前にプッシュしてもらう”

って運用が必要になるかと思いました。

*1:自分でmavenyumでインストー ルしてもOK。sudo yun install maven

*2:BacklogのWebHookの履歴を見ていると、プルリクエスト後のGitプッシュの通知でJenkinsのビルドが走っているようで、プルリクエスト前のGitプッシュでは実行されないので、なぜなのかWebHookの内容を見ていると送信している内容が少し違っていました。 ブランチをプッシュした後プルリクエストを送った後に、そのブランチを更新するとJenkinsが動き出したのでJenkins plug-inとWebHookの仕様が微妙にイケてないのかもしれない。

BacklogでPR(Spring F/W)があったらJenkins(AWS)がコードレビューの一部をしてくれて、結果をSlackに通知してくれるようにする。~その6~

pom.xmlの設定をする

jenkinsで実行されるようにpom.xmlの設定を行います。

pluginの設定を行う

mavenの事をあまり知らないのですが、とりあえず下のように設定しました。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>demo</name>
  <description>Demo project for Spring Boot</description>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <!-- checkstyleの定義ファイルの場所を指定する -->
    <checkstyle.config.location>config/checkstyle/google-checks.xml</checkstyle.config.location>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
     <!-- checkstyleやらPMDとかの設定をする。 -->
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <phase>test</phase>
          </execution>
        </executions>
        <configuration>
          <violationSeverity>warning</violationSeverity>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>findbugs-maven-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <phase>test</phase>
            <goals>
              <goal>findbugs</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <failOnError>true</failOnError>
          <xmlOutput>true</xmlOutput>
          <outputEncoding>UTF-8</outputEncoding>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.0</version>
        <executions>
          <execution>
            <id>default-prepare-agent</id>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
          </execution>
          <execution>
            <id>default-report</id>
            <goals>
              <goal>report</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

    </plugins>
  </build>

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>3.0.0</version>
      </plugin>
    </plugins>
  </reporting>

</project>

終わりに

mavenの事が全然わからなかったので、下の本を読んで勉強してこようと思います。

BacklogでPR(Spring F/W)があったらJenkins(AWS)がコードレビューの一部をしてくれて、結果をSlackに通知してくれるようにする。~その5~

Slackの設定をする

Jenkins CIのインストール

Slackのチームにログインして、Essential Apps等からJenkins CIを探してインストールする。

Jenkins CIの設定

1.Jenkins CIのConfigurationsを開く

f:id:Bee_Flim:20180210154228p:plain

2.通知をしたいchannelを指定して、Tokenの値が入っていることを確認する。

f:id:Bee_Flim:20180210154356p:plain

名前やアイコンとかは好きなものを設定する。

Slackの設定はこれで終わり。

slackの設定は楽でした。

違うchannelに通知したいときはAdd Configurationで同じように設定をしていけばいいみたいですね。

BacklogでPR(Spring F/W)があったらJenkins(AWS)がコードレビューの一部をしてくれて、結果をSlackに通知してくれるようにする。~その4~

Backlogの設定をする

APIキーの取得

1.Backlogの個人設定を開く。

f:id:Bee_Flim:20180210152655p:plain

2.APIを開いて、メモにコメントを入れて登録を押すと、下にAPIキーが作成される。

f:id:Bee_Flim:20180210152657p:plain

Webhookの設定

1.対象にしたいプロジェクトを開いて、プロジェクト設定を開く。*1

f:id:Bee_Flim:20180210152848p:plain

2.webhookを選択して、以下のように設定する。

f:id:Bee_Flim:20180210152852p:plain f:id:Bee_Flim:20180210152855p:plain

Backlogの設定はこれで終わり

ここで設定したAPIキーを後でJenkinsで使用する。


参考サイト nulab-inc.com

*1:設定を行える権限が必要です。

BacklogでPR(Spring F/W)があったらJenkins(AWS)がコードレビューの一部をしてくれて、結果をSlackに通知してくれるようにする。~その3~

JenkinsをAWSにインストールする

AWSにJenkinsをインストール

f:id:Bee_Flim:20171018152806p:plain

  1. AWSのEC2を適当に作成します。(Amazon Linuxを使用しました)
  2. セキュリティグループで8080ポートにアクセスできるようにインバウンドに追加します。
  3. Backlogのwebhookが取れるように下もインバウンドに追加します。
カスタム TCP ルール TCP 8080-9999 54.238.59.48/32

4. Jenkinsでjavaを使用するのだが、javaが1.7なので1.8をインストールする

AWSAWS作成時に作る秘密鍵とユーザー名:ec2-userでsshで入る。

    sudo yum -y install java-1.8.0-openjdk-devel
    
    # インストールが行われる
    
    # java1.8をデフォルトにする
    $ sudo alternatives --config java
    2 プログラムがあり 'java' を提供します。
 
    選択       コマンド
    -----------------------------------------------
    *+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
       2           /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.25-0.b18.4.amzn1.x86_64/jre/bin/java
 
    Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2

5. java --verson で1.8であることを確認する。

    $ java -version
    openjdk version "1.8.0_25"
    OpenJDK Runtime Environment (build 1.8.0_25-b18)
    OpenJDK 64-Bit Server VM (build 25.25-b02, mixed mode)

6. jenkinsをインストールする。

    # Jenkinsをダウンロード
    sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
    
    # パッケージ署名チェック用のキーをインポートする
    sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key

    # jenkinsのインストール
    sudo yum install jenkins
    

7. gitが入っていないのでインストールする。

    sudo yum install git

8. jenkinsを起動する

    sudo service jenkins start
起動されたら、http://public DNS:8080 にアクセスしてjenkinsの画面が立ち上がるのを確認する。
Unlock Jenkinsという画面が出るので、
    sudo cat /var/lib/jenkins/secrets/initialAdminPassword
で表示されるパスワードをいれて、アンロックする。
推奨プラグインはインストールしてもらう。

[f:id:Bee_Flim:20180210150020p:plain] 7. jenkinsの起動設定をする

    sudo chkconfig jenkins on

静的解析に必要なプラグインをJenkinsに入れる。

f:id:Bee_Flim:20180210150516p:plain f:id:Bee_Flim:20180210150535p:plain

  • FindBugs Plug-in - バグ解析用
  • PMD Plugin - コピペコードのチェック
  • DRY - コードの重複チェック
  • checkstyle - コーディング規約チェック
  • JaCoCo plugin - コードカバレッジの算出
  • Task Scanner Plug-in - TODOの収集
  • Jenkins Backlog Plugin - backlogのgitにアクセス
  • Slack Notification Plugin - Slackへの通知
  • StepCounter - ステップ数をカウントする
  • JUnit Attachments Plugin

これらをインストールしていく。

jenkinsのインストールはこれで終了

他のサービスとの連携等の設定は、この後から行うので、とりあえず起動だけできればOK。

BacklogでPR(Spring F/W)があったらJenkins(AWS)がコードレビューの一部をしてくれて、結果をSlackに通知してくれるようにする。~その2~

eclipseのインストールと設定

eclipseのインストール

日本語で使いたいので、以下のサイトからeclipseをダウンロードする。

Eclipse 日本語化 | MergeDoc Project

1.とりあえず、最新版を選択する。 f:id:Bee_Flim:20180210125938p:plain

2.自分の環境に合わせてJavaeclipseをダウンロードする。 f:id:Bee_Flim:20180210125941p:plain

3.ダウンロードしたファイルを適当な場所に解凍する。

Spring Tool Suite (STS) for Eclipseを追加する

1.[その他]->[マーケットプレイス]を開く

f:id:Bee_Flim:20180210131029p:plain

2.検索の所に、STSと打ち込むと Spring Tool Suiteが出てくるのでインストールを選択する。

f:id:Bee_Flim:20180210131356p:plain

checkstyleに合わせた設定をする。

checkstyleのコードスタイルはGoogleStyleに合わせるように設定していく。

1.[ウィンドウ]->[設定]を開く

f:id:Bee_Flim:20180210131421p:plain

2.[一般]->[エディタ]->[AnyEdit]の設定

f:id:Bee_Flim:20180210131425p:plain

3.[Web]->[HTMLファイル]->[エディター]

f:id:Bee_Flim:20180210131738p:plain

checkstyleの設定を確認する

1.JavaのスタイルがGoogleになっていることを確認する。 *1 f:id:Bee_Flim:20180210132257p:plain

2.JavaScriptのスタイルを確認する。

2-1.下のURLからEclipse用の設定ファイルをダウンロードする。 https://raw.githubusercontent.com/jokeyrhyme/eclipse-formatter-profiles/master/google-style-guide-javascript-eclipse.xml

2-2.インポートで上記ファイルを指定してインポートして、アクティブなプロファイルにGoogle JavaScript Styleを選択する。 f:id:Bee_Flim:20180210132658p:plain

試し用のSpringプロジェクトを作成する。

1.パッケージエクスプローラー上で右クリックをして、[新規]->[その他]を選択。

f:id:Bee_Flim:20180210133616p:plain

2.Spring Bootからスタータープロジェクトを選択。

f:id:Bee_Flim:20180210133617p:plain

3.試し用なので、デフォルトで次へ。

f:id:Bee_Flim:20180210133620p:plain

4.こちらも、デフォルトで。

f:id:Bee_Flim:20180210133619p:plain

checkstyleの設定ファイルを導入する。

1.Checkstyleのサイトhttp://checkstyle.sourceforge.net/google_style.htmlJavaの設定ファイルがあるので、これをダウンロードする。 https://raw.githubusercontent.com/checkstyle/checkstyle/master/src/main/resources/google_checks.xml *2

2.ダウンロードしたファイルをフォルダに配置する。 とりあえず、root/config/checkstyle/google_check.xml に配置する。

3.プロジェクトに反映する。

3-1.プロジェクトを右クリックして[プロパティー]を選択する。

3-2.checkstyleを選択して、[ローカル・チェック構成]を選択して、[新規]をクリックする。

f:id:Bee_Flim:20180210135724p:plain

3-3.以下のように設定する。

  • 型:プロジェクト相対効性
  • 名前:任意
  • ロケーション:ダウンロードしたファイルの場所(root/config/checkstyle/google_check.xml
  • checkstyle構成ファイルの保護:チェックを入れる

f:id:Bee_Flim:20180210135846p:plain

3-4.テストモジュールはcheckstyleの対象外にする。

メインタブを開き、以下のように設定する。

  • プロジェクトでcheckstyleを有効にする:チェックをつける
  • シンプル攻勢を使用する:チェックを外す

f:id:Bee_Flim:20180210140255p:plain

ファイル・セットすべてになっているので、ダブルクリックをして設定ウィンドウを開く。

f:id:Bee_Flim:20180210140258p:plain

一致正規表現に以下を設定する。

^src/main/./..java$

f:id:Bee_Flim:20180210140256p:plain

eclipseの設定はここまで。

これで、フォーマッタとcheckstyleが一致したので、整形忘れも楽に解決できる。はず。。。

*1:初期状態で選択されていると思うが、入っていない場合は下のURLから設定ファイルをダウンロードして、 インポートでこのファイルを指定する。 https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml

*2:プロジェクトに合わせて内容を微調整する。

BacklogでPR(Spring F/W)があったらJenkins(AWS)がコードレビューの一部をしてくれて、結果をSlackに通知してくれるようにする。~その1~

以前にAWSにJenkinsをインストールするというエントリーを書いたけど、 eclipseの設定を含めて1からの手順を纏めることで、 全社に展開できるかなーと思ったので纏めてみようと思った次第です。

このまとめの目標

BacklogのGitにPull Requestを送ると、Jenkinsに通知が言って、checkstyle、コードの重複、ユニットテスト、その他を 実施してくれて、Slackに通知をしてくれる。

やる事

  1. eclipseのインストールと設定 yakisaba.hatenablog.jp
  2. JenkinsのAWSへのインストール yakisaba.hatenablog.jp
  3. Backlogの設定 yakisaba.hatenablog.jp
  4. Slackの設定 yakisaba.hatenablog.jp
  5. pom.xmlの設定 yakisaba.hatenablog.jp
  6. Jenkinsの設定とCIの実施 yakisaba.hatenablog.jp