はじめに
タイトルは本当は「GitHub ActionsでGoogleTestを使ったテストモジュールを実行させ、それが失敗した場合該当ブランチのmasterへのマージをプロテクトする」だったのですが長すぎたのでコンパクトにしました。ようやく環境がCIっぽくなってきたなと思います。人はミスをする生き物なので、CIのように機械的にミスを検出する仕組みはいいものだと考えています。
やったこと
- GitHub Actionsの限定パブリックベータへの参加をリクエストした
- デフォルトワークフローが動作していることを確認した
- GitHub ActionsでCMakeによるコードのビルドを行った
- GitHub ActionsでGoogleTestモジュールを実行した
- GitHubのSettingで失敗ブランチのmasterへのマージをプロテクトした
- 紆余曲折
パブリックベータへの参加
- Sign up for the Beta
- Actionsタブが作られていることを確認
デフォルトワークフロー
- Set up ActionsからSimple workflowを作成
- blank.ymlというものが作られる
- pushして動作を確認
CMakeによるコードのビルド
- 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.
- CMakeを使ってビルド
blank.yml
(略)
- name: build
run: |
cd C++/helloworld/
mkdir build/
cd build/
cmake ..
make
(略)
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環境内でパーミッションエラーが出たため、ビルドパスをリンクパスにしています。
失敗ブランチのmasterへのマージをプロテクト
- GitHubリポジトリののSettings-Branchesからプロテクト設定を行う
- 失敗するテストを作成し実行、プロテクトを確認
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));
}
紆余曲折
- GitHub Actionsでgit submoduleが使えなかった
これAdd submodule supportが行われれば使えるのかしら。 - GitHub Actionsでdocker buildするとcacheが効かないので遅い
ローカルと同一環境でビルドしてほしい思いでGitHub Actionsでも独自のDockerfileによるDockerビルドを試み成功させましたが、毎回apt installしていることに気がつく。pushのたびにこれだと遅すぎて使えない・・。
所感
コードやスクショ込みの記事書く予定で材料集めつつ作業を進めていましたが足りないもの多数。記事を書きながら集めるという効率の悪いことをしました。記事も縦に長くなって可読性下がるし、概要だけのほうがいいのかしら・・。