Django 프로젝트에 Travis-CI
를 연동하는 방법과 각종 Secret Key를 Travis-CI에서 인식할 수 있도록 암호화, 복호화하는 방법을 다뤄보겠습니다.
먼저 CI
가 무엇인지 살펴보면, Continuous Integration
의 약자로 배포나 빌드 할 때 문제를 미리 파악할 수 있도록 이상이 없는지 자동으로 확인해주는 기술입니다. 즉 github에 push할 때마다 정해놓은 test를 통과하는지 자동으로 검증을 해줍니다.
혹은 오픈소스의 master branch를 관리할 때 이 기술을 이용하면 수많은 pull request
들에 대해 하나하나 test 검증을 할 필요가 없기 때문에 상당히 편리합니다.
Travis-CI
는 CI
서비스 중 하나입니다. 기본적으로 github 공개 Repository와 연동하는 것은 무료, 비공개 Repository와 연동하는 것은 유료이며 사이트 주소도 다릅니다.
우선 test 해보는 과정이므로 무료로 이용해보겠습니다.
먼저 https://travis-ci.org 사이트에 접속해서 가입한 후, github과 연동해줍니다.
기존 프로젝트가 있다면 따로 Repository를 만들 필요없이 그대로 사용하시면 되며, 없는 경우엔 만들어줍니다.
저는 아래와 같이 test
라는 Repository를 만들었고, 프로젝트 폴더와 연결했습니다.
Secret Key를 숨겨야하기 때문에 아직 push는 잠시 보류해주세요!
Github에 올라가선 안되는 각종 Secret Key들을 따로 폴더를 만들어 관리해줍니다.
아직까진 Secret Key가 Django 기본 SECRET_KEY
만 있는 상태이므로, 이것만 다른 폴더로 빼서 관리해보겠습니다.
먼저 루트 폴더와 동일한 위치에 .secrets
폴더를 생성해주고, 안에 base.json
파일을 만들어줍니다.
settings.py
파일에 있는 Django SECRET_KEY
를 base.json
파일에 옮겨줍니다.
.secrets/base.json
{
"SECRET_KEY": "각자의 SECRET_KEY 입력해주세요"
}
외부 폴더에 있는 SECRET_KEY
를 불러올 수 있도록 settings.py
을 수정해줍니다.
app/config/settings.py
import json
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
ROOT_DIR = os.path.dirname(BASE_DIR)
SECRETS_DIR = os.path.join(ROOT_DIR, '.secrets')
SECRETS_BASE = os.path.join(SECRETS_DIR, 'base.json')
secrets_base = json.loads(open(SECRETS_BASE, 'rt').read())
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = secrets_base['SECRET_KEY']
...
Github에 .secrets
폴더가 올라가는 것을 방지하기 위해 gitignore 파일에 추가해줍니다.
# Custom
/.secrets
...
설치된 pip list를 Travis-CI에서 확인할 수 있도록 requirements.txt
파일을 만들어줍니다.
$ pip freeze > requirements.txt
다시 Travis-CI 사이트로 돌아와 my profile
에서 Sync account
누른 후 새로고침을 하면 아까 생성했던 Repository가 보일 것입니다. 그럼 아래처럼 버튼을 눌러 연결해줍니다.
Django 프로젝트 루트 폴더에 .travis.yml
파일을 작성해줍니다.
(python 버전은 프로젝트에 맞게 바꿔주세요!)
language: python
python:
- "3.6"
install:
- pip install -r requirements.txt
script:
- python app/manage.py test
최종 tree 구조
는 아래와 같습니다.
travis-ci-test
├── .git
├── .gitignore
├── .python-version
├── .travis.yml
├── .secrets
│ └── base.json
└── app
├── config
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
이제 준비가 끝났으니 프로젝트를 git에 push 해줍니다.
$ git add .
$ git commit -m 'first commit'
$ git push -u origin master
Travis-CI 사이트로 넘어와서 프로젝트를 눌러보면 아래와 같이 에러가 발생한 것을 확인 할 수 있습니다. 에러의 내용은 다음과 같습니다.
FileNotFoundError: [Errno 2] No such file or directory: '/home/travis/build/rainsound-k/test/.secrets/base.json'
즉 gitignore에 .secrets
폴더를 넣어놨기 때문에 settings.py
에서 SECRET_KEY
값을 참조할 수 없다는 내용입니다. 이 에러를 아래서 해결해보겠습니다.
SECRET_KEY
값을 참조할 수 있도록 .secrets
폴더를 압축 -> 암호화 -> 업로드 -> 복호화 -> 압축해제
하는 방법으로 에러를 해결해보겠습니다.
아래 명령어로 .secrets
폴더를 .secrets.tar
파일로 압축해줍니다.
$ tar -cvf secrets.tar .secrets
$ gem install travis
(위의 gem 명령어가 안 먹힌다면 ruby를 설치해주세요!)
$ travis login
(Username은 github의 Username 입니다.)
$ travis encrypt-file secrets.tar --add
위의 과정을 마치면 secrets.tar
, secrets.tar.enc
파일이 프로젝트 폴더에 생긴 것을 확인할 수 있습니다.
secrets.tar
파일은 github에 올라가면 안되므로 gitignore에 추가해줍니다.
# Custom
/.secrets
secrets.tar
...
.travis.yml
파일을 다시 열어보면, 아래처럼 before_install
에 명령어가 자동으로 추가된 것을 확인할 수 있습니다. 이는 travis에 코드를 올리면 secrets.tar.enc
파일을 secrets.tar
파일로 복호화 하라는 명령어입니다.
하지만 파일을 복호화한다해도 여전히 압축파일로 남아있기 때문에, 압축해제 명령어를 before_install
에 추가해줍니다.
before_install:
...
- tar xvf secrets.tar
모든 준비는 끝났습니다. 이제 github에 push 했을때 에러가 발생 안하는지 확인하면 됩니다. 아래 명령어로 다시 push 해주고 에러 없는 것을 확인하면 끝입니다!
$ git add .
$ git commit -m '~~~'
$ git push -u origin master
개인 공부하면서 작성한 글이라 잘못된 내용이 있을 수 있습니다. 잘못된 내용은 편하게 말씀해주시면 수정하겠습니다:)
Django 프로젝트에 Travis-CI 연동 및 Secret Key 암호화 | 2018. 05. 14 |
---|---|
EC2 인스턴스 세팅과 Nginx + uWSGI로 Django 앱 배포하기 (2/2) | 2018. 05. 02 |
EC2 인스턴스 세팅과 Nginx + uWSGI로 Django 앱 배포하기 (1/2) | 2018. 04. 25 |