시작은 배포할 때였다. 매번 jar로 빌드하고 FileZilla로 직접 전달한 후 서비스를 재부팅하는 과정이 번거로워서 시작하게 되었다. 수많은 방법중에 사용한 방법이 github action과 AWS의 codeDeploy를 활용하여 github에 소스를 올리고 push하기만 해도 알아서 반영이되고 서비스가 재부팅 되도록 하는 것이 목표였다. 결론부터 말하면 할 수가 없었다.
github의 해당 Repository에는 민감한 DB 테이블 정보가 존재했고 private권한으로 하는 것도 생각했지만 만약 사람들이 API를 사용한다면 설명서가 적혀있는 곳이 Repository 하나만 있기 때문에 private로 한다면 확인이 불가능하다. 또한 이력서에 해당 서비스의 repository주소를 적어놓았기 때문에 인사담당자들이 확인하고 접속이 안되는 일이 발생할 수도 있다.
처음으로 CI/CD를 도입해보는거라 공부할 것이 많아서 머리가 많이 아팠다. 비록 파이프라인을 구축하지 못했지만 좋은 공부가 되었다.
Github Action은 repository에서 바로 소프트웨어 개발 워크플로를 자동화, 사용자 지정 및 실행하는 기능을 가지고 있다, Github Action을 하기위해서는 yml파일을 생성하여 미리 작업을 만들어 주어야한다.
name: mlist build
on:
push:
branches:
- master
workflow_dispatch:
env:
AWS_REGION: ap-northeast-2
AWS_S3_BUCKET: mlists3
AWS_CODE_DEPLOY_APPLICATION: michelin-list-dev
AWS_CODE_DEPLOY_GROUP: mlist-dev-group
jobs:
build:
name: dev build
runs-on: windows-latest
steps:
- name: 브랜치 이동
uses: actions/checkout@v3
with:
ref: main
- name: JDK 17 설치
uses: actions/setup-java@v3
with:
java-version: '17'
Distribution: 'corretto'
- name: Install zip
run: choco install zip
- name: gradlew에 실행 권한 부여
run: chmod +x ./gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew clean build
- name: Make zip file
run: zip -r ./${{ github.sha }}.zip .
shell: bash
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.DEV_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.DEV_SECRET_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Upload to S3
run: aws s3 cp --region ${{ env.AWS_REGION }} ./${{ github.sha }}.zip s3://${{ env.AWS_S3_BUCKET }}/${{ github.sha }}.zip
- name: EC2에 배포
run: aws deploy create-deployment
--application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }}
--deployment-config-name CodeDeployDefault.AllAtOnce
--deployment-group-name ${{ env.AWS_CODE_DEPLOY_GROUP }}
--s3-location bucket=${{ env.AWS_S3_BUCKET }},key=${{ github.sha }}.zip,bundleType=zip
위의 yml 스크립트는 내가 시도한 스크립트이다.
여기서 어려웠던 점은 내가 참고한 게시글들 대부분이 ubuntu환경에서 테스트 및 빌드를 진행했다. 하지만 나의 경우에는 gradlew파일을 window에서 만들어서 그런지 계속 빌드가 안되었다. 계속 빌드를 시도해도 나오는 건 파일포맷이 잘못 되었다 라는 메세지 뿐이었다.
dev build
ubuntu 리눅스 환경이 아닌 window로 세팅하고 실행해보니 빌드가 되었다.
Install zip
ubuntu에는 zip이라는 명령어가 존재해 zip파일을 만드는 것이 가능하지만 window에는 기본적으로 zip 명령어가 없기 때문에 설치해주어야 한다.
gradlew에 실행 권한 부여
gradlew파일에 chmode로 실행권한을 안주면 권한이 부족하다는 에러가 나온다.
Upload to S3
예시에서는 $GITHUB_SHA환경변수를 사용했다, 하지만 사용방법이 변경되었는지 ${{ github.sha }}를 사용하라고 했다.
Amazon S3는 간단히 말하면 클라우드 저장소인데 프로젝트를 업로드하고 확장성이 뛰어나기 때문에 AWS의 다른 서비스와 연계하여 사용할 수 있다.
위의 github action 작업을 하고 우여곡절 끝에 S3에 프로젝트를 업로드 할 수 있었다.
하지만 이상하게 배포하는 족족 실패하는데 원인을 열심히 찾아보는 중이다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/action
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ec2-user
group: ec2-user
hooks:
ApplicationStart:
- location: scripts/deploy.sh
timeout: 60
runas: ec2-user
appspec.yml파일은 codeDeploy에서 배포관리 목적으로 사용되는 파일이다.
CI/CD 파이프라인 작업을 처음 시도해보는 것 인데 생각보다 힘든 작업이었다. 글 중간에 결국 운영중인 서비스에 도입하는 것은 포기 했지만 개발서버 상에서 파이프라인을 구축해보고 앞으로 만들 서비스에 도입해볼 생각이다.
만약 다른 서비스를 만들어 볼일이 있으면 github 저장소 권한을 private로 지정하고 제작해야겠다.
https://devlog-wjdrbs96.tistory.com/361
https://devlog-wjdrbs96.tistory.com/362
https://velog.io/@juhyeon1114/실전-Github-actions-AWS-Code-deploy로-Spring-boot-배포-자동화하기