GitHub Actions를 사용해 보았습니다.

소개



타이틀은 사실은 「GitHub Actions로 GoogleTest를 사용한 테스트 모듈을 실행시켜, 그것이 실패했을 경우 해당 브랜치의 master에의 병합을 프로텍트한다」이었지만 너무 길었기 때문에 컴팩트하게 했습니다. 드디어 환경이 CI 같아졌다고 생각합니다. 사람은 실수를 하는 생물이므로, CI와 같이 기계적으로 실수를 검출하는 구조는 좋은 것이라고 생각하고 있습니다.

했던 일


  • GitHub Actions의 제한된 공개 베타에 가입 요청
  • 기본 워크 플로가 작동하는지 확인했습니다
  • GitHub Actions에서 CMake로 코드 빌드
  • GitHub Actions에서 GoogleTest 모듈 실행
  • GitHub 설정에서 실패 지점의 master에 병합을 보호했습니다
  • 우여곡절

  • 퍼블릭 베타 참여


  • Sign up for the Beta
  • Actions 탭이 만들어졌는지 확인


  • 기본 워크플로


  • Set up Actions에서 Simple workflow 만들기
  • blank.yml이라는 것이 만들어진다.
  • 푸시하여 동작 확인

    Actions 탭에서 해당 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에서 보호 설정하기

    Include administrators 해 두지 않으면, 본인이 관리자를 위해 프로텍트의 확인을 실시할 수 없었습니다.
  • 실패한 테스트를 만들고 실행하고 보호 확인

  • 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 때마다 이것이라고 너무 늦어서 사용할 수 없다 ··.

  • 소감



    코드나 스쿠쇼 포함의 기사 쓸 예정으로 재료 모으면서 작업을 진행하고 있었습니다만 부족한 것 다수. 기사를 쓰면서 모으는 효율의 나쁜 일을 했습니다. 기사도 세로로 길어져 가독성 내려가, 개요만 쪽이 좋은 것일까··.

    좋은 웹페이지 즐겨찾기