[Jenkins] CI 구성기

Ericamoyed·2021년 1월 6일
1

개발한장

목록 보기
1/22

Jenkins에서 IntegrationTest를 구축하는 방법에 대해 소개한다. 필자는 pod으로 Centos7기반 Jenkins를 운용하였고, Centos7에서 지원하는 Maven 버전이 낮기에, 높은 버전에서 지원하는 여러 기능을 사용할 수 없어 구축에 어려움을 겪었다.

  • 가장 큰 문제는 Jenkins 내에서 upstream, downstream job을 설정할 수는 있으나, trigerring이 by upstream이어야 한다는 것이다. trigerring은 동시에 되고, 단순히 upstream job을 기다리는 식으로 구현이 불가능하다. jenkins에서는 upstream/downstream job을 명시적으로 지정하는 것이 아니라, build after, pre-build, post-build에 job을 선언하면 묵시적으로 upstream/downstream job으로 지정하게 되는 것이다.

  • trigerring이 동시에 되어야 했던 이유는, GitHub Pull Request Builder를 사용했는데 이 경우 TC 결과를 github에 보여주는 Add test result one liner 기능을 지원한다. 하지만 문제는, github pull request builder로 트리거링된 경우가 아니라 pull request trigger -> job A -> job B 이런 식으로 트리거링 되면, job B의 Add test result one liner 기능은 사용할 수 없게 된다.

  • 따라서 첫 설계는 pull request trigger -> Build Test -> Unit Test, Integration Test 였으나 이와 같이 pipeline을 잡고 나니 Unit Test와 Integration Test 결과가 github에 공유되지 않아.. 여러가지 GitHub Pull Request Builder 설정을 조작해보았음에도 불구하고, 무산되었다. pull request builder는 active고 Use github hooks for build triggering를 사용하지 않으면 github에 의한 트리거는 아니지만 연결고리는 있으니까 Test Result가 나오지 않을까? 했지만 Use github hooks for build triggering를 unactive 한 경우 PR의 변화에 따라 랜덤하게 job이 수행되는 불상사가 발생했다. 물론 TC 결과가 github에 연동되지도 않았다.

  • 결론은 trigerring은 github에 의해 동시에 시키되, 이후에 수행시킬 job에 대해서는 pre Steps에 Execute shell - sleep을 주는 방식으로 임시로 해결했다.

  • 다음 문제는 Integration Test였다. 기존에는 -pl api clean install tomcat7:run test tomcat7:shutdown -Dmaven.test.skip=false -Dtest.includes="**/*SuiteTest.java" -Dspring.profiles.active=ci -DforkMode=never -Dmaven.tomcat.fork=true 이와 같은 방식으로, -Dmaven.tomcat.fork=true 옵션을 통해 모듈 Run과 test를 동시에 진행한 듯 했다. fork 옵션은 https://tomcat.apache.org/maven-plugin-2.0/tomcat7-maven-plugin/run-mojo.html#fork run goal을 마친 이후에도, 이후 스크립트가 지속적으로 수행되도록 하는 option이다. 하지만 이 mvn 명령어를 수행하게 되면, api 모듈 Run이 되기 전에 Test가 돌고, Test가 모두 완료된 이후에 api 모듈 Run이 되었다가 Shutdown 하는 것으로 동작하였다. 원인은 모르겠으나, mvn 버전에 따라 동작 방식이 달라진 것으로 추측된다. tomcat7:shutdown을 제일 뒤로 미는 등, 여러가지 시도를 해보았으나 동일하게 동작하였고, 다른 방법을 시도해보기로 하였다.

  • 신규 방법

    • 총 세개의 Project로 구성: Stop Running, Build and Run, Run integrationTest
    • Stop Running
      • Build and Run project를 종료시키는 project
        • upstream project인 Build and Run으로 부터 $BUILD_URL을 전달받아 $PRE_BUILD_URL로 지정
        • jenkins에서 지원하는 RestAPI를 활용하여 Build 단계에서Execute shellsleep {Run integrationTest 예상 가동 시간} curl -XPOST ${PRE_BUILD_URL}stop --user {userId}:{token} 등록
        • sleep은 일정 시간 후에 TC가 완료되면 Build and Run project를 종료하기 위해 필요하다.
    • Build and Run
      • TC에서 찌를 모듈을 Build하고 Run하는 project
      • PreStep에 Stop Running job 을 수행
        • Stop Running job 수행 시 현재 빌드 URL을 parameter로 넘김
        • Predefined ParametersPRE_BUILD_URL=$BUILD_URL 등록
    • Run integrationTest
      • PreStep에 Trigger/call builds on other projects를 활용하여, 앞에서 만든 Build and Run job을 수행하도록 한다.
      • Block until the triggered projects finish their builds는 inactive 한다. active할 시, Run은 끝나지 않으므로 prestep 이후 과정이 아무것도 수행되지 않고 지속적으로 일시정지된 상태로 머무르게 된다.
      • PreStep에 Execute shell을 추가하고, sleep {Build and Run에서 Build가 끝날 충분할 시간}을 등록한다.
        • sleep을 주지 않을 경우, 서버가 Run되지 않은 상태에서 api를 찌르게 되므로 Connection Refused가 뜨게됨
      • 이렇게 되면, Build and Run job이 수행되어, 해당 프로젝트에서는 지정한 포트로 모듈이 running되고 있는 상황이 재현된다.
      • Build 단계에서, 수행하고자 하는 Test에 대한 mvn 명령어 (-pl api test -Dtest=**/*SuiteTest.java) 를 작성하여, running 되고 있는 모듈로의 api call을 성사시킨다.
  • 회사 CI 서버 구축이었기에 사내 젠킨스라 캡처는 하지 못하지만, 추후에도 CI 서버 구축할 일이 있을 것이고, 내가 고생한 만큼 다른 분들은 고생하지 않았으면 해서 포스팅을 공유합니다.

  • 캡처사진이 없어 아마 이해가 어려울텐데, 고생하고 계시는 분들은 코멘트를 남겨주시면 상세히 설명은 가능합니다 (_ _)

profile
꿈많은 개발자, 일상 기록을 곁들인

1개의 댓글

comment-user-thumbnail
2021년 1월 6일

안녕하세요, tech 기업에서 일하는/ 일하기를 희망하는 여성들을 모아서 모임을 만들고 있어요!
자세한 사항은 및 링크 참조바랍니다 :)
https://velog.io/@emilyscone/SheKorea-1%EA%B8%B0-%EB%A9%A4%EB%B2%84%EB%A5%BC-%EB%AA%A8%EC%A7%91%ED%95%A9%EB%8B%88%EB%8B%A4

답글 달기