-
[CI/CD] Django + GithubAction + EC2Software engineer/Infra 2023. 6. 1. 14:15

https://blog.testproject.io/2021/04/22/ci-cd-benefits-challenges-best-practices-for-your-team/ CI/CD
CI/CD란 지속적인 통합(CI, Continuous Integration)과 지속적인 제공(CD, Continuous Delivery/Deployment)의 약자로서, 개발자들이 열심히 개발한 프로그램을 최종 소비자들에게 지속적으로 좋은 서비스를 제공하기 위해 필요한 요소입니다.
지속적인 통합(CI)
개발자들이 코드를 공유 저장소에 푸시할 때마다 자동으로 코드의 빌드, 테스트, 정적 분석 등을 수행하는 것을 의미합니다. 이를 통해 개발자들은 빠른 피드백을 받을 수 있으며, 코드의 품질을 유지하고 문제를 조기에 발견할 수 있습니다.
지속적인 제공(CD)
CI의 결과물을 자동으로 운영 환경으로 제공하고, 필요한 테스트, 배포, 환경 설정 등을 수행하는 것을 의미합니다. CD는 개발자들이 개발한 기능을 빠르게 사용자에게 제공하고, 소프트웨어의 변경 사항을 신속하게 배포하여 사용자들에게 지속적인 가치를 제공합니다.이런 CI/CD 작업들의 흐름을 CI/CD 파이프라인이라 합니다. 이는 소프트웨어 개발과 배포를 효율적이고 신속하게 수행하기 위해 사용됩니다.
CI/CD 파이프라인의 장점- 빠른 피드백: 코드 변경 사항에 대한 자동화된 빌드, 테스트, 분석은 개발자에게 신속한 피드백을 제공하여 오류를 조기에 발견하고 수정할 수 있도록 도와줍니다.
- 품질 유지: CI/CD 파이프라인은 표준화된 빌드, 테스트 및 배포 절차를 갖추고 있으므로 코드의 품질을 일관되게 유지할 수 있습니다
- 자동화: 개발자들은 반복적이고 번거로운 작업을 자동화하여 시간과 노력을 절약할 수 있습니다.
- 신속한 배포: CI/CD 파이프라인은 자동화된 배포 과정을 통해 소프트웨어를 신속하게 사용자에게 제공하므로 개발주기를 단축하고 경쟁력을 향상합니다.
- 안정성: CI/CD는 표준화된 프로세스를 통해 배포의 안정성을 높여 오류 가능성을 줄이고, 롤백 및 복구 기능을 제공하여 시스템의 안정성을 유지합니다.
CI/CD 파이프라인을 구축하고 유지하는 데에는 일정한 노력과 비용이 필요합니다. 또한 초기 설정이나 변경에는 시간과 리소스가 소요될 수 있습니다. 그러나 장기적으로는 개발과 배포 프로세스를 개선하고 개발자 생산성을 향상하는 데에 큰 이점을 제공합니다.
따라서 현대적인 소프트웨어 개발 방법론에서는 CI/CD 파이프라인은 필수적인 요소로 간주되며, 효율적이고 신속한 개발과 배포를 위해 적극적으로 도입되고 활용됩니다.구현
간단하게 Django 프로젝트를 구현하여 GithubAction을 통해 빌드 및 EC2에 배포하는 CI/CD 파이프라인을 구현해보려 합니다.
작업순서
- Django
- EC2에 Django 운영환경 구축
- GithubAction을 통해 빌드 및 EC2로 zip파일 업로드
- 배포 script 작성
1. Django
Github: https://github.com/dev-jhjoo/practice-django
Django 프로젝트로 CI/CD 테스트를 위해 간단하게 작업했습니다.
2. EC2에 Django 운영환경 구축
Django 프로젝트를 업로드할 EC2 인스턴스를 만들고 실행 가능한 환경이 필요합니다.
EC2인스턴스에 pip 설치
참고 : https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/eb-cli3-install-linux.html
Linux에 Python, pip 및 EB CLI 설치 - AWS Elastic Beanstalk
Linux에 Python, pip 및 EB CLI 설치 EB CLI에는 Python 2.7, 3.4 또는 그 이상이 필요합니다. 배포가 Python과 함께 제공되지 않았거나 이전 버전과 함께 제공된 경우 pip 및 EB CLI를 설치하기 전에 Python을 설치
docs.aws.amazon.com
curl -O https://bootstrap.pypa.io/get-pip.py python3 get-pip.py --user pip3 install -r requirements.txt3. GithubAction을 통해 빌드 및 EC2로 zip파일 업로드
일단 Github repository에 접속 후 Action 탭으로 이동합니다.

저는 Django 기본 템플릿으로 정하고 아래와 같이 workflow를 구성했습니다.
해당 workflow는 Django 프로젝트 전체를 zip파일로 압축, EC2 인스턴스에 업로드, 배포 스크립트 실행 순서로 작성되어 있습니다.
name: Django CI on: push: branches: [ "main" ] jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: [3.8] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v3 with: python-version: ${{ matrix.python-version }} - name: Install Dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Run Tests run: | python manage.py test - name: Zip Release uses: TheDoctor0/zip-release@0.7.1 with: filename: release.zip path: . directory: . type: zip - name: copy file via ssh key uses: appleboy/scp-action@v0.1.4 with: host: ${{ secrets.EC2_HOST }} username: ${{ secrets.USERNAME }} port: ${{ secrets.EC2_PORT }} key: ${{ secrets.JH_PEM }} source: "release.zip" target: /home/ec2-user - name: ssh command uses: appleboy/ssh-action@v0.1.10 with: host: ${{ secrets.EC2_HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.JH_PEM }} port: ${{ secrets.EC2_PORT }} script: /home/ec2-user/deploy.sh3. 배포 script 작성
EC2 폴더 구조
ec2-user ├── deploy.sh ├── practice-django │ ├── README.md │ ├── actuator │ ├── board │ ├── db.sqlite3 │ ├── manage.py │ ├── practice_django │ └── requirements.txt ├── release.zip ├── run.pid ├── start.sh └── stop.shstart.sh 작성
#!/bin/bash nohup python3 ./practice-django/manage.py runserver 0.0.0.0:8000 >/dev/null 2>&1 & # Wait for the server to start sleep 3 now_pid=$(lsof -i :8000 -t) echo server on pid:$now_pid echo $now_pid > ./run.pid프로젝트를 백그라운드에서 시작합니다.
추후 실행 중인 프로젝트를 kill 할 수 있도록 현재 실행된 프로젝트의 pid를 run.pid 파일에 저장합니다.
stop.sh 작성
#!/bin/bash now_pid=$(cat /home/ec2-user/run.pid) echo server stop pid:$now_pid kill -9 $now_pid저장된 pid를 통해 서비스를 종료합니다.
deploy.sh 작성
#!/bin/bash ./stop.sh sleep 0.5 rm -rf ./practice-django/* sleep 0.5 unzip -o release.zip -d /home/ec2-user/practice-django/ sleep 0.5 pip3 install -r ./practice-django/requirements.txt sleep 0.5 ./start.shstart.sh, stop.sh을 통해 배포
이렇게 Django프로젝트가 GithubAction을 통해 빌드 후에 EC2에 배포되는 CI/CD 파이프라인을 구축해 봤습니다.
'Software engineer > Infra' 카테고리의 다른 글
[AWS] ACM(SSL/TLS 인증서 발급) (2) 2023.06.12 [CI/CD] GithubAction에서 Docker 이미지 빌드 (4) 2023.06.07 [AWS] #5 VPC 구축 실습 4(ELB) (2) 2023.05.19 [AWS] #4 VPC 구축 실습 3(Auto Scaling) (1) 2023.05.19 [AWS] #3 VPC 구축 실습 2(Bastion Host, NAT Gateway) (3) 2023.05.18 - 빠른 피드백: 코드 변경 사항에 대한 자동화된 빌드, 테스트, 분석은 개발자에게 신속한 피드백을 제공하여 오류를 조기에 발견하고 수정할 수 있도록 도와줍니다.