LoginSignup
18
10

More than 3 years have passed since last update.

GitHub Actionsを使ってみた

Last updated at Posted at 2019-09-22

はじめに

タイトルは本当は「GitHub ActionsでGoogleTestを使ったテストモジュールを実行させ、それが失敗した場合該当ブランチのmasterへのマージをプロテクトする」だったのですが長すぎたのでコンパクトにしました。ようやく環境がCIっぽくなってきたなと思います。人はミスをする生き物なので、CIのように機械的にミスを検出する仕組みはいいものだと考えています。

やったこと

  • GitHub Actionsの限定パブリックベータへの参加をリクエストした
  • デフォルトワークフローが動作していることを確認した
  • GitHub ActionsでCMakeによるコードのビルドを行った
  • GitHub ActionsでGoogleTestモジュールを実行した
  • GitHubのSettingで失敗ブランチのmasterへのマージをプロテクトした
  • 紆余曲折

パブリックベータへの参加

  1. Sign up for the Beta
  2. Actionsタブが作られていることを確認 スクリーンショット 2019-09-22 10.35.51.png

デフォルトワークフロー

  1. Set up ActionsからSimple workflowを作成
    スクリーンショット 2019-09-22 10.36.17.png

  2. blank.ymlというものが作られる
    スクリーンショット 2019-09-22 10.36.59.png

  3. pushして動作を確認
    スクリーンショット 2019-09-22 10.38.10.png
    Actionsタブから該当push単位でワークフローの実行ログを確認することができる。

CMakeによるコードのビルド

  1. blank.ymlの編集テスト
blank.yml
name: CI

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: label change test1
      run: | 
        pwd
        ls
    - name: label change test2
      run: |
        echo Add other actions to build,
        echo test, and deploy your project.

実行結果
スクリーンショット 2019-09-22 10.50.45.png

  1. CMakeを使ってビルド
blank.yml
(略)
    - name: build
      run: |
        cd C++/helloworld/
        mkdir build/
        cd build/
        cmake ..
        make
(略)

実行結果
スクリーンショット 2019-09-22 11.52.46.png
特に問題なくビルドできていそう

GoogleTestモジュールの実行

blank.yml
(略)
    - name: build
      run: |
        cd C++/helloworld/
        ./build.sh
    - name: test
      run: |
         C++/helloworld/build/test_calc
build.sh
#!/bin/bash

set -eu

pushd third_party/
GOOGLETEST_VERSION=release-1.8.1
wget --quiet https://github.com/google/googletest/archive/${GOOGLETEST_VERSION}.tar.gz
tar -xf ${GOOGLETEST_VERSION}.tar.gz
rm ${GOOGLETEST_VERSION}.tar.gz
mkdir googletest-${GOOGLETEST_VERSION}/build/
cd googletest-${GOOGLETEST_VERSION}/build/
cmake ..
make
#make install
popd

rm -rf build/
mkdir build/
cd build/
cmake ..
make
CMakeLists.txt
add_executable(test_calc
  test/test_main.cpp
  test/test_calc.cpp
  src/calc.cpp)
target_link_libraries(test_calc
  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest-release-1.8.1/build/googlemock/gtest/libgtest.a
  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest-release-1.8.1/build/googlemock/gtest/libgtest_main.a
  pthread)
target_include_directories(test_calc PUBLIC
  include
  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest-release-1.8.1/googletest/include)

紆余曲折あってGoogleTestをsubmoduleではなくwgetで取ってきてます。また、googletestのmake installでGitHub Actions環境内でパーミッションエラーが出たため、ビルドパスをリンクパスにしています。

スクリーンショット 2019-09-22 12.04.27.png
感動の瞬間

失敗ブランチのmasterへのマージをプロテクト

  1. GitHubリポジトリののSettings-Branchesからプロテクト設定を行う
    protect_branch.png
    Include administratorsしておかないと、本人が管理者のためプロテクトの確認を行えませんでした。

  2. 失敗するテストを作成し実行、プロテクトを確認

test_calc.cpp
#include <gtest/gtest.h>

#include "calc.h"

class TestCalc : public ::testing::Test {
};

TEST_F(TestCalc, add) {
    EXPECT_EQ(3,  add(1, 2));
    EXPECT_EQ(-2, add(1, -3));
    // NG
    EXPECT_EQ(0, add(1, 1));
}

スクリーンショット 2019-09-22 12.09.47.png
実行ログから失敗を確認することができる。

checkfailed.png
プロテクトの確認。マージボタンが押せなくなっていることを確認できる。

紆余曲折

  1. GitHub Actionsでgit submoduleが使えなかった これAdd submodule supportが行われれば使えるのかしら。
  2. GitHub Actionsでdocker buildするとcacheが効かないので遅い ローカルと同一環境でビルドしてほしい思いでGitHub Actionsでも独自のDockerfileによるDockerビルドを試み成功させましたが、毎回apt installしていることに気がつく。pushのたびにこれだと遅すぎて使えない・・。

所感

コードやスクショ込みの記事書く予定で材料集めつつ作業を進めていましたが足りないもの多数。記事を書きながら集めるという効率の悪いことをしました。記事も縦に長くなって可読性下がるし、概要だけのほうがいいのかしら・・。

18
10
5

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
18
10