티스토리 뷰

반응형

최근에는 CI(continuous integration) 라는 기술이 매우 발전하고 있고, 실제로 많은 프로젝트에서 해당 기술을 접목시키고 있다.


이는, 빌드 시 발생할 수 있는 문제를 미리 파악하고 대처를 하기 위한 방법으로써


매번 서비스를 배포하고 빌드 테스트를 하고 이상이 없는지 확인 하는 것을 자동화해주는 아주 유용한 기술이라고 할 수 있다.


소프트웨어 공학에서, 지속적 통합(continuous integration, CI)은 지속적으로 퀄리티 컨트롤을 적용하는 프로세스를 실행하는 것이다. - 작은 단위의 작업, 빈번한 적용. 지속적인 통합은 모든 개발을 완료한 뒤에 퀄리티 컨트롤을 적용하는 고전적인 방법을 대체하는 방법으로서 소프트웨어의 질적 향상과 소프트웨어를 배포하는데 걸리는 시간을 줄이는데 초점이 맞추어져 있다. 대표적인 CI 툴에는 젠킨스(Jenkins)가 있다.

from wiki


일단, 가장 유명한 CI로써는

  • Jenkins
  • Travis(github)
  • bamboo
  • codeship

등이 있는데, 매번 순위가 유동적으로 바뀌는만큼, 서로 간 경쟁이 치열하다.


동작 원리를 보면 위와 같은데, 개발자들은 소스를 소스 저장소(git, svn)에 커밋을 하게 되면(1)
버전 관리 시스템에서는 해당 변경사항을 fetching을 하게 된다(2)

--
여기서부터 CI가 동작하는 부분인데, 

CI에서는 해당 변경사항이 생긴 빌드를 빌드하고(3)
테스트를 하며(4) -> 이건 CI 솔루션에 따라 진행이 될 수도, 안될수도 있는 부분
성공/실패 여부를 판단한다(5)

그리고 구성된 환경에 따라 개발자들에게 Slack, telegram 등의 오픈소스 메신저나 메일, SMS등의 여러 방법으로 인지할 수 있게 통지를 해준다.

사실상 이러한 단계가 자동화가 되지 않으면 서비스를 배포하고 테스트할때마다 많은 비용이 들게 된다.

누군가(QA) 는 해당 빌드에 대한 테스트를 해야 하고, 그에 대한 테스트 결과 및 빌드 결과를 리포팅을 해줘야 하기 때문이다.

해서..

github에 올라가는 대부분의 오픈소스 솔루션들은 travis 라는 CI를 사용하고 있는데, 너무 간단한 사용법을 지닌 반면에 강력한 기능을 지원해주므로
사용법에 대해 알아보려고 한다. (물론 기능에 따라 솔루션을 구매해야 할 수도 있는 부분이지만, 간단한 빌드 테스트정도는 지원해준다)



1. travis에 가입을 한다(?)

 - 사실상 github 계정으로 travis에 가입을 하는 것만으로도, github에 등록된 본인의 프로젝트들을 수동으로 등록할 필요가 없이 자동으로 프로젝트를 찾아서 등록을 해주게 된다.


2. .travis.yml 파일을 프로젝트 최상단 루트에 등록한다.

 - 해당 파일에는 프로젝트 언어, 빌드 설정 및 빌드에 필요한 환경 변수들을 세팅하는 파일로써, 반드시 등록을 해줘야 하는 파일이다.


travis 설정 파일은 아래와 같이 구성되어 있다.


env:
  global:
    # Set at the root level as this is ignored when set under matrix.env.
    - GCC_VERSION="4.9"
matrix:
  include:
    - language: cpp
      os:
      - linux
      - osx
      
      compiler:
        - gcc
        #- clang
      
      env:
        matrix:
          - BUILD_TYPE=Debug BIICODE=false
          - BUILD_TYPE=Release BIICODE=false
          # biicode .deb files no longer available.
          # - BUILD_TYPE=Release BIICODE=true
          # - BUILD_TYPE=Debug BIICODE=true
      
      before_install:
      - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi
      - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update -qq; fi
      - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq g++-$GCC_VERSION; fi
      - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq gcc-$GCC_VERSION; fi
      - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo ln -s -v -f $(which g++-$GCC_VERSION) /usr/bin/g++; fi
      - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo ln -s -v -f $(which gcc-$GCC_VERSION) /usr/bin/gcc; fi
      
      script:
      - if [ "$BIICODE" == "false" ]; then cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE . && make && make test; fi
      - if [ "$BIICODE" == "true" ] && [ "$TRAVIS_OS_NAME" == "linux" ]; then ./biicode/support/bii-travis.sh $BUILD_TYPE; fi

    - language: android
      sudo: true
      android:
        components:
          - tools
          - platform-tools
          - build-tools-25.0.2
          - android-25
          - extra-android-m2repository
      compiler:
        - gcc
      before_install:
        - git clone https://github.com/urho3d/android-ndk.git $HOME/android-ndk-root
        - export ANDROID_NDK_HOME=$HOME/android-ndk-root
        # Setup environment for Linux build which is required to build the sample.
        - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi
        - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update -qq; fi
        - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq g++-$GCC_VERSION; fi
        - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq gcc-$GCC_VERSION; fi
        - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo ln -s -v -f $(which g++-$GCC_VERSION) /usr/bin/g++; fi
        - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo ln -s -v -f $(which gcc-$GCC_VERSION) /usr/bin/gcc; fi
      script:
        - for build_gradle in $(git ls-files | grep build.gradle); do ( cd "$(dirname "${build_gradle}")" && ./gradlew build ); done

(해당 설정은 google flatbuffer github에서 가져온 설정의 예시이다)


사실 저 무지막지한 옵션들은 빌드와 컴파일이 복잡할 경우 저렇게 되는 것이고..


실제 사용은 아래와 같이 한줄만 적어도 빌드 테스트가 가능하다




language: java


언어 설정만 기재를 하게 되면 해당 언어로 기본 설정을 가지고 빌드를 하게 된다.

구체적인 빌드 옵션에 대한 설정은 아래 페이지에 있다


여튼 이렇게 travis yml 파일의 작성이 끝났다면 commit 후 push를 해주자.

그렇게 되면 travis 대시보드에서 해당 commit을 감지하고 빌드 테스트를 진행하게 된다.

필자의 대시보드 화면인데.. (진짜 올려두고 개발하는게 쉬운 일이 아니란걸 매번 깨닫는다.. 오픈소스 기여란 참..)


여기서 커밋을 하게 되면 build started 라는 메세지와 함께 빌드 로그가 보여지게 된다.



위와 같이 가상머신에서 소스를 가지고 빌드를 하게 되며, 빌드 성공 시, passed 실패 시 failed가 뜨게 된다.


그리고 저 이미지가 변경이 되게 되는데

이 이미지는 

https://travis-ci.org/Gompangs/GNetServer.svg?branch=master

와 같은 URL을 가지고 있으며, 매 빌드할때 마다 이미지가 변경이 된다(성공 / 실패 / 진행중)


이를 gitbug README.md 파일에 올려주게 되면 프로젝트 메인 페이지에서 해당 프로젝트의 빌드 상태를 확인할 수 있다


![Travis CI status](https://travis-ci.org/Gompangs/GNetServer.svg?branch=master)


와 같이 기재를 하게 되면 CI 상태를 프로젝트 README 화면에서 볼 수 있다

(위 한 줄의 코드는 마크업 언어의 이미지 가져오는 구문이다) 

반응형
댓글
댓글쓰기 폼