배포 자동화 과정
배포 자동화 과정은 다음 게시글에서 확인할 수 있다.
[Docker] Github Actions, Docker, AWS EC2 사용한 CI/CD (Spring Boot)
0. 환경 Spring Boot 3.xx Java17 JDK corretto17 1. AWS EC2 인스턴스 생성 1) 이름 입력, Amazon Linux 선택 2) 키페어 생성 생성한 키페어는 따로 저장해서 보관해두자 3) 스토리지 구성 프리티어 기준 최대 용량인
yeon-dev.tistory.com
💻문제점1
ssh -i ~/.ssh/my-ec2-key.pem 유저명@퍼블릭IPv4
AWS EC2 리눅스에 접속하기 위해서 처음에는 우분투 접속하는 것 처럼 ssh -i ~/my-ec2-key.pem 퍼블릭IPv4 형식으로 입력했는데 안돼서 리눅스 접속 방식을 찾아봤다. 퍼블릭IPv4 입력 전에 유저명도 입력해야 한다길래 내 계정을 입력했다. 그랬더니 다음과 같은 오류가 발생했다.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
📃문제점1-시도
인바운드 규칙에 내 IP를 추가해봤다.
🔍문제점1-해결
오류 문구를 리서치해보니 유저명에 내 계정이 아니라 ec2-user 를 입력해야 했다.
💻문제점2
## Build Gradle
- name: Build with Gradle
run: ./gradlew build
gradle을 빌드하는 과정에서 다음 오류가 발생했다.
./gradlew: Permission denied
🔍문제점2-해결
해당 문제는 gradlew 스크립트에 대한 실행 권한이 없어서 발생한다.
Github에서 이 파일을 다운 받을 때 파일 권한이 변경되거나, 실행 권한 없이 커밋될 수도 있다고 한다.
그래서 에러와 같이 허용 거부 오류가 발생하면 다음으로 해결하면 된다.
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
- chmod: 파일 권한을 변경하는 리눅스 명령어
- +x: 파일에 실행(x) 권한을 추가
- ./gradlew: 현재 디렉토리의 graldew 파일을 대상으로 지정
💻문제점3
다음 부분에서 계속 오류가 발생했다.
- name: Docker build & push to Hub
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/sample .
docker push ${{ secrets.DOCKER_USERNAME }}/sample
line 1: syntax error near unexpected token `)'
🔍문제점3-해결
해당 라인에는 secrets.DOCKER_PASSWORD가 있다. 이 Secrets의 value에는 특수문자가 들어있는데, 이게 문제였다.
몇가지 특수 문자는 상황에 따라 Shell 스크립트에 오류를 발생시킨다. 나만해도 구문 오류가 발생했으니 ㅠㅠ
나 같은 경우는 닫는 괄호가 있어서 문제가 발생했던 것 같다.
비밀번호에 특수문자가 있었던 것이 문제일 줄이야.
간단하게 해당 부분을 " " 따옴표로 감싸주었다.
- name: Docker build & push to Hub
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p "${{ secrets.DOCKER_PASSWORD }}"
docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/sample .
docker push ${{ secrets.DOCKER_USERNAME }}/sample
성공 했다!
혹시 env 사용해도 됐을까?? 시도해보자
PASSWORD만 env에 등록했다.
env:
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
- name: Docker build & push to Hub
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p $DOCKER_PASSWORD
docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/sample .
docker push ${{ secrets.DOCKER_USERNAME }}/sample
이렇게 해도 성공적으로 수행된다.
💡느낀점
항상 CI/CD를 해보고 싶었지만,, 다른 기능을 담당하거나 개발 시간도 부족해서 자동화 구축에 시간을 쏟을 수가 없었다. 배포 후에 변경 사항이 있으면 최소 3번 각 20분 이상은 걸렸는데 CI/CD 파이프라인을 구축하니까 5분도 안된다. 배포 시간을 많이 줄여서 개발에 더 집중할 수 있는 것 같다.
'TIL' 카테고리의 다른 글
[TIL-20231222] Illegal pop() with non-matching JdbcValuesSourceProcessingState (0) | 2023.12.22 |
---|---|
[TIL-20231220] 리플렉션을 사용한 private 필드 접근 및 값 설정 (0) | 2023.12.20 |
[커뮤 프로젝트] 영상 파일 삭제 로직 (동기, 비동기 처리) (0) | 2023.07.04 |
[커뮤 프로젝트] 서버 아키텍처 변경을 통한 성능 개선 (0) | 2023.07.02 |
[TIL - 20230628] 후원 비관적 락 -> Redis 분산 락 변경 (동시성) (0) | 2023.06.29 |