반응형
최종 목표 : CI/CD 구축해서 메인브렌치에 커밋하면 자동 배포되도록 설정하기
CI / CD란?
CI (Continuous Integration- 지속적 통합)
코드 버전 관리를 하는 VCS 시스템(Git, SVN 등)에 PUSH 되면 자동으로 테스트와 빌드가 수행되어 안정적인 배포파일을 만드는 과정
CD (Continuous Deployment - 지속적인 패보)
빌드 결과를 자동으로 운영서버에 무중단 배포까지 진행되는 과정
CI / CD 의 필요성
CI 가 없을 경우: 여러명의 개발자가 동시에 작업을 할 경우 각자가 원격 저장소로 푸시될 때 마다 코드를 병합하고, 테스트 코드와 빌드가 수행되는지 수동으로 체크해야한다.
CD 가 없을 경우: 역시 한두대의 서버에 개발자가 수동으로 배포를 할 수 있지만, 여러대의 서버에 배포를 해야하거나 긴박하게 당장 배포를 해야하는 상황이 오면 수동으로 배포할 수가 없다.
-> 이 과정을 자동화 함으로써 개발자들이 개발에만 집중하고 안정적인 서비스 운영이 가능하게 되었다.
CI 연결하기
GitHub Actions
- GitHub 에서 제공하는 서비스로 빌드,테스트,배포 파이프라인을 자동화 할 수있는 CI/CD 플랫폼이다
- YAML포맷을 사용해서 가독성이 높다
YAML(야믈)
- .yml 파일 확장자
- json에서 괄호를 제거한 것
github secret 설정
application.properties 파일은 보안정보가 저장되어 있기 때문에 github 저장소에 올리지 않는다.
하지만 프로젝트를 테스트하고 배포할 경우에는 해당 정보가 있어야 하므로 github에서 제공하는 secret 를 이용해서 별도로 저장한다.
github repository > settings> secrets and variables>actions>new repository secret
AWS S3 연동하기
S3란?
- AWS 에서 제공하는 파일 서버
- 이미지 파일을 비롯한 정적 파일들을 관리하거나 배포파일들을 관리하는 등의 기능을 지원
- 보통 이미지 업로드를 구현한다면 S3를 이용하는 경우가 많음
💡 도커컨테이너 레지스트리에는 docker hub, AWS ECR 등 이 있다.
docker hub는 무료로 사용할 수 있지만, 배포된 이미지가 공개되기 때문에 누구나 다운받을 수 있는 단점이 있다.
AWS Key 발급
IAM
일반적으로 AWS 서비스에 외부 서비스가 접근할 수 없다. 그래서 접근권한을 가진 key를 생성해서 사용해야한다.
aws에서는 인증과 관련된 기능을 하는 IAM(identity and Access Menagement) 서비스를 제공한다.
- iam 검색
- 사용자 생성
- 액세스 키 저장
github secret 에 엑세스 키 등록
Github repository → Settings → Secrets → Actions 에 등록
Github actions 생성 (java with gradle)
github repository > Actions>New workflow > Java with Gradle
- main 브랜지에 push 되거나 pull_request가 생성되었을 때 동작한다.
- application properties 파일을 생성한다.
- gradlew 실행권한을 주고 빌드한다.
- code deploy는 Jar 파일은 인식하지 못하므로 압축 파일을 생성한다.
- 압축 파일을 S3에 복사한다.
- S3 버킷에 파일이 업로드 되었는지 확인한다.
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- run: mkdir ./src/main/resources
- run: touch ./src/main/resources/application.properties
- run: echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application.properties
- run: cat ./src/main/resources/application.properties
- name: Run chmod to make gradlew executable
run: chmod +x ./gradlew
- name: Build with Gradle
uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0
with:
arguments: build
- name: Before deploy
run: |
mkdir -p deploy
cp ./build/libs/*.jar ./deploy
zip -r ./springboot-githubactions.zip ./deploy
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@0e613a0980cbf65ed5b322eb7a1e075d28913a83
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
aws-region: ap-northeast-2
- name: Upload to S3
run: aws s3 cp ./springboot-githubactions.zip s3://memore-springboot-build
참고
반응형
'Study > 기타' 카테고리의 다른 글
웹 애플리케이션 개발 프로젝트 회고(1) 프로젝트 협업 도구 (0) | 2024.01.18 |
---|---|
springboot 프로젝트 AWS 프리티어로 배포하기(2) CodeDeploy, EC2 연동하기 (0) | 2024.01.17 |
[spring, intellij] 테스트 코드 실행 오류 (0) | 2023.11.30 |
[github] main 브랜치 보호하기 ( commit, merge 금지 ) (0) | 2023.11.30 |
[mysql] 컬럼 순서 변경, 컬럼 설정 변경 (0) | 2023.11.30 |