서버배포 3단계) 에자일 개발방식이 가능한 CI/CD GitHub Actions 서버 배포 자동화 ABC
깃허브 서버 자동배포는 GitHub Actions를 사용하여 구현할 수 있는 CI/CD(지속적 통합/지속적 배포) 프로세스입니다.
이 방식을 통해 개발자는 코드 변경사항을 GitHub에 푸시하면 자동으로 서버에 배포할 수 있습니다.
주요 특징
- 자동화: 코드 변경 시 자동으로 빌드, 테스트, 배포 과정이 실행됩니다.
- 효율성: 수동 배포 과정을 줄여 개발자의 시간과 노력을 절약합니다.
- 일관성: 항상 동일한 프로세스로 배포되어 인적 오류를 줄입니다.
인텔리제이 설정
application 파일은 항상 개발용, 배포용, 기본용 3개 준비하기
설정은 사용하는 의존성과 필요에 맞춰 설정
spring:
profiles:
active: dev
naver:
api:
client-id:
client-secret:
url: https://openapi.naver.com/v1/search/news.json
application-prod.yml 는 포트 80 사용
server:
port: 80
로컬에서 테스트 먼저, 정상작동하면 깃허브에 커밋과 푸시
깃허브 환경변수 기본설정
EC2를 접속하기위한 설정
EC2 아이디, 호스트, private key가 필요
배포하고자하는 Repository > Setting > Secrets and variables > New repository secret
HOST 와 USERNAME 설정
.pem파일은 워드프로세서에서 내용 확인이 가능합니다.
.pem도 설정
환경변수 설정 완료!
서버를 ec2로 푸쉬하고 실행 명령 하기
Actions
Set up a workflow
name: Deploy to EC2
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
env:
ACTIONS_STEP_DEBUG: true
steps:
- uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'adopt'
- name: Build with Maven
run: mvn clean package -DskipTests
- name: Copy JAR to EC2
env:
PRIVATE_KEY: ${{ secrets.EC2_SSH_KEY }}
HOST: ${{ secrets.EC2_HOST }}
USER: ${{ secrets.EC2_USERNAME }}
run: |
echo "$PRIVATE_KEY" > private_key && chmod 600 private_key
scp -o StrictHostKeyChecking=no -i private_key target/*.jar ${USER}@${HOST}:~/app.jar
- name: ssh to ec2
uses: appleboy/ssh-action@master
with:
key: ${{ secrets.EC2_SSH_KEY }}
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
script: |
PIDS=$(pgrep -f "java -jar -Dspring.profiles.active=prod app.jar")
if [ $(echo "$PIDS" | wc -l) -gt 1 ]; then
kill $(echo "$PIDS" | head -n 1) || true
fi
sudo nohup java -jar -Dspring.profiles.active=prod app.jar > app.log 2>&1 &
워크플로우 이해하기
name: Deploy to EC2
on:
push:
branches: [ main ]
// 푸쉬할때마다 [main] branches에 아래 일을 해라
jobs:
deploy:
runs-on: ubuntu-latest
env:
ACTIONS_STEP_DEBUG: true
// 최신 리눅스 우분투 준비
steps:
- uses: actions/checkout@v2
// 내 소스코드를 우분투에 옮겨라
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'adopt'
// JDK 17 설치해라
- name: Build with Maven
run: mvn clean package -DskipTests
// Maven 설치하고 클린, 패키지해서 .jar 생성 해라
// -DskipTests 테스트는 하지 말고 만들어라
- name: Copy JAR to EC2
// jar를 ec2에 보냄, 아래는 위에서 설정한 환경변수에 따른 접속정보
env:
PRIVATE_KEY: ${{ secrets.EC2_SSH_KEY }}
HOST: ${{ secrets.EC2_HOST }}
USER: ${{ secrets.EC2_USERNAME }}
run: |
echo "$PRIVATE_KEY" > private_key && chmod 600 private_key
scp -o StrictHostKeyChecking=no -i private_key target/*.jar ${USER}@${HOST}:~/app.jar
// scp 파일카피 ${USER}@${HOST} 에 >> EC2에 Jar 파일 복사함
- name: ssh to ec2
uses: appleboy/ssh-action@master
with:
key: ${{ secrets.EC2_SSH_KEY }}
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
script: |
PIDS=$(pgrep -f "java -jar -Dspring.profiles.active=prod app.jar")
if [ $(echo "$PIDS" | wc -l) -gt 1 ]; then
kill $(echo "$PIDS" | head -n 1) || true
// 기존 서버는 중단한다.
fi
sudo nohup java -jar -Dspring.profiles.active=prod app.jar > app.log 2>&1 &
// 서버실행 명령어 app.log 2>&1 & 로그는 여기 저장됨
이제부터는 GithubDesktop에서 커밋 하면 깃허브에서 위 Workflow에 따라 jar파일을 ec2서버에 푸쉬 후 실행하게 됩니다.
서버배포 자동화를 통해 에자일 개발이 실현할 수 있습니다
에자일 개발방식이란?
소프트웨어 개발 및 프로젝트 관리에서의 접근 방식으로, 변화에 유연하게 대응하고 고객과의 협력을 강조하는 방법론입니다. 애자일 개발의 핵심 원칙과 특징은 다음과 같습니다
1. 고객 중심
고객의 요구사항을 최우선으로 하며, 고객과의 지속적인 소통을 통해 제품을 개선합니다. 고객 피드백을 반영하여 개발 과정을 조정합니다.
2. 반복적 및 점진적 개발
개발 과정을 여러 단계로 나누어 반복적으로 진행합니다. 각 반복 주기(스프린트)마다 기능을 추가하고 개선하여 최종 제품을 완성해 나갑니다.
3. 팀워크와 협업
팀원 간의 협업을 중요시하며, 자율적인 팀 환경을 조성합니다. 팀원들은 서로의 의견을 존중하고, 공동의 목표를 위해 협력합니다.
4. 변화에 대한 유연성
프로젝트 진행 중에 발생하는 변화에 빠르게 대응할 수 있도록 설계되어 있습니다. 요구사항이 변경되더라도 이를 수용할 수 있는 구조를 갖추고 있습니다.
5. 지속적인 개선
각 스프린트 후에 회고를 통해 팀의 작업 방식을 검토하고, 개선할 점을 찾아내어 다음 스프린트에 반영합니다.
6. 작동하는 소프트웨어 우선
문서화보다 작동하는 소프트웨어를 우선시하며, 실제 제품이 고객에게 가치를 제공할 수 있도록 합니다.
7. 자율성과 책임
팀원들에게 자율성을 부여하고, 각자의 역할에 대한 책임감을 강조합니다. 이를 통해 팀원들이 더 큰 동기부여를 느끼게 됩니다.
애자일 개발 방식은 스크럼(Scrum), 칸반(Kanban), XP(Extreme Programming) 등 다양한 프레임워크와 기법으로 구체화될 수 있으며, 각 팀이나 프로젝트에 맞는 방법론을 선택하여 적용할 수 있습니다. 이러한 접근 방식은 특히 변화가 잦고 불확실성이 큰 환경에서 효과적으로 작동합니다.