본문 바로가기

의식의 흐름

의식의 흐름대로 작성한 CodeShip 튜토리얼 1

1. 코드쉽이 뭔가?


코드쉽을 이해하려면 일단 CI/CD에 대한 개념부터 짚고 넘어가야 한다.


1.1 CI/CD 개념


Wikipedia 에서는 CI/CD를 다음과 같이 정의하고 있다.


In software engineeringCI/CD or CICD may refer to the combined practices of continuous integration and continuous delivery.


continuous integration과 continuous delivery는 그럼 뭐냐?

continuous integration (CI) is the practice of merging all developer working copies to a shared mainline several times a day.

해석하면 CI는 여러 개발자들의 작업 내용을 하루에도 몇번씩 '공유된 메인라인'에 병합하는 것. 

공유된 메인라인이라는게 뭔지 모르겠다. git이 이미 하고 있는 것 아닌가..?? -_-;


Continuous delivery (CD) is a software engineering approach in which teams produce software in short cycles, ensuring that the software can be reliably released at any time.[1] It aims at building, testing, and releasing software with greater speed and frequenc

해석하면 CD는 팀이 짧은 사이클로 소프트웨어를 생산하여 언제든지 소프트웨어를 안정적으로 출시 할 수 있도록하는 소프트웨어 엔지니어링 방식이며, 더 빠른 속도와 빈도로 소프트웨어를 구축, 테스트 및 출시하는 것을 목표로 하는 것.

웹프로젝트인 경우 빌드-배포하는 과정에서 신경 쓸 것도 많고 골치 아픈 일도 많이 생길텐데, 이 부분을 도와주는 것으로 이해하면 될까?


코드쉽은 이 CI/CD 과정을 간편하게 할 수 있도록 도와주는 툴이라고 한다.

하지만... 여전히 잘 모르겠다. 

그래서 그냥 튜토리얼 보고 따라해보기로 한다.




2. 베이직 튜토리얼 따라해보기 feat.python - Test


그냥 개념만 봐서는 이해가 안 가니 일단 따라해보자. 

https://codeship.com/ 에 접속한다. (아래 스샷들은 2018/04/27 기준이다)



코드쉽 홈페이지 화면 하단에 보면, pro 버전과 basic 버전을 선택할 수 있다. 

일단 무료 버전인 codeship basic features를 클릭해서 들어가서 따라해보자. 

제품 설명이 잘 나와있다.

해당 페이지에서 signup for free를 클릭해서, 계정을 만들자.


계정을 만들고 로그인하면, 새로운 조직을 만들라는 페이지가 뜬다. 




조직을 만들고 나면, 새로운 프로젝트를 할지, 팀을 초대할지 고를 수 있는데 새 프로젝트 만들어야겠지 일단?



SCM(Source control management인듯)을 선택해야 한다. gitHub나 bitBucket, gitLab등 자신이 쓰고 있는 서비스를 선택하자.

나는 gitHub를 선택했다.


gitHub url을 연결해야 한다. 타겟이 될 저장소 url을 입력해주자.



다시 한번 pro를 쓸지 basic 버전을 쓸지 선택 가능하다.



사용하는 언어와 프레임웍을 선택한다. 선택에 따라 그에 맞는 Setup commands를 자동으로 생성해준다. 

Setup commands란 테스트와 배포를 하기 위해 필요한 명령어들이다. 

예를 들면 의존성(라이브러리 등) 가져오기 및 데이터베이스 시드(디폴트 데이터 입력)같은 것들 말이다.

Python으로 테스트 예정이므로 Python을 선택해준다.


그리고 Test Pipeline이라는게 있다.

이는 CI/CD 파이프라인에서 실행하기를 원하는 테스트이며 여러개 추가가 가능하다.

모든 배포될 소스는 이 테스트를 통과해야 빌드와 배포가 이뤄진다.


이건 언제든 수정 가능하니 부담 갖지 말고, 저장 후 대쉬보드로 간다. 



모든 설정이 끝나면 저장소에 push를 해달라는 메세지가 뜬다. push를 하면 자동으로 첫번째 빌드가 실행된다는데 오호... 얼른 push를 해보자.


README.md 파일 생성 후 push했다.


그리고 코드쉽 대쉬보드를 새로고침하니 아래처럼 FAILED가 뜬다. 뭐지?


클릭해서 상세 내용을 보자.

requirements.txt 파일이 없어서 진행이 안된다. 

pip install -r requirements.txt 이 명령어는 아까 전에 Setup commands 설정에서 Python을 선택해서 자동으로 추가된 명령어다.

그런데 requirements.txt 파일이 없으니 당연히 에러가 날 수밖에...

그렇다면 Setup commands 설정을 수정해보자. 

우측 상단의 Project Settings를 클릭해서 들어가면 수정이 가능하다.



문제가 되는 pip install -r requirements.txt 라인을 주석처리해보자.

그리고 다시 대시보드로 돌아와서, failed 버튼 옆에 화살표를 클릭해서 restart build를 클릭하면 빌드를 다시 한다.



그럼 짜잔! Success로 상태가 바뀌었다.


근데 지금은 아무런 의미가 없다.

왜냐면 테스트 코드가 없기 때문이다.

테스트 코드로 올라온 소스들을 검증한 뒤, 아무 이상이 없다면 빌드하고, 문제가 있는 경우 빌드하지 말아야 한다.

그게 이 코드쉽의 목적인 것 같다.

근데 굳이 테스트안하고 배포만 빨리빨리 하고 싶은 경우라면... 그냥 쓰는 것도 나름 유용할듯?


아무튼 일단 테스트 코드를 만들자.

파이썬에서는 테스트를 도와주는 라이브러리가 여럿 있는 것 같은데

그 중에서 unittest 라이브러리를 이용해 tests.py라는 테스트 코드를 만들었다.


import unittest

import TestServer

class MyTest(unittest.TestCase):
def testPort(self):
self.assertEqual(TestServer.PORT_NUMBER,9000) #port는 9000이어야 한다.

이런식으로 작성하고,


$python -m unittest [파일명(여기서는 tests)]


이렇게 실행하면, 

unittest의 TestCase 클래스를 상속한 클래스를 찾은 후, 

그 안에 있는 함수 중에서 test로 시작하는 함수들을 실행하면서 테스트를 진행한다.

여기서는 TestServer.py 의 PORT_NUMBER가 9000일때 True 를, 9000이 아니면 False를 리턴하게 되어있다.

포트가 9000일때만 배포하게 하고 싶다고 가정한 것이다.


이제 이 소스를 깃헙에 올리고, 

테스트 파이프라인에 테스트 코드를 돌리는 명령어를 넣어보자.


확실한 테스트를 위해, 테스트 파일을 두개 만들었다.

Port8000Test.py 파일에서는 포트가 8000일때 True를 리턴하고,

Port9000Test.py 파일에서는 포트가 9000일때 True를 리턴하도록 했다.

그리고 테스트 파이프라인에서는 일단 포트 8000번 테스트를 수행했다.

이렇게 해놓으면 포트가 8000인지 체크할 것이다. 

PORT_NUMBER가 9000으로 정의되어 있으므로 에러가 나야 한다.



에러가 났다! 

그런데 기대했던 에러가 아니다. http.server 라이브러리가 없다는 에러다... 

파이썬 버전이 2.7이라서 발생하는 것 같다. 이런... 프로젝트 셋팅에 가서 Setup Commands를 수정해주자.

default로 2.7이 잡혀있다.

pyenv local 3.6 명령어로 파이썬 버전을 바꿔주자.


그리고 Restart Build 하면


테스트가 정상 수행됐고, AssertionError가 발생했다! 성공이다. 

이제 Port8000Test가 아닌 Port9000Test를 하는 것으로 Test Pipeline을 수정하고, 다시 빌드해보자.



Port9000Test가 잘 수행됐고, 통과까지 했다. 

빌드 성공이다.


파이프라인을 여러개 추가해서 병렬로 테스트를 진행해서 더 빠른 속도로 테스트를 진행하는 것도 가능한 것 같다. 

이건 나중에 해보기로 하고 넘어간다.




그런데 지금까지는 뭔가 특별히 좋은 점을 모르겠다.

테스트는 로컬에서도 충분히 할 수 있는 것 아닌가..???

테스트를 자동으로 해준다는 것에서 장점이 있긴 하겠다만은.. 

아직은 잘 모르겠다.

일단 다음 단계로 넘어가자. 

'의식의 흐름' 카테고리의 다른 글

의식의 흐름대로 작성한 CodeShip 튜토리얼 2  (0) 2018.04.28