전체 보기
1️⃣

GithubActions로 CICD구축-GCP편 (with Springboot) (BeachCombine프로젝트)

작성일자
2023/02/26
태그
INFRA
HIGHLIGHT
프로젝트
BeachCombine
책 종류
1 more property

1. 환경변수 설정

1) Settings-Security-Sercrets and variables-Actions 탭 들어가기

2) New Repository secret 클릭

3) env.properties 혹은 application.yml(properties) 내용 등 github에 올리지 않았던 파일 내용 작성

이름은 대문자로 해주세요
Secret 안의 내용은 생성하고 싶은 파일 내용을 그대로 넣으면 됩니다.

3) Repository secrets 생성 완료

2. CI 구축

CI: Github에 올라와있는 자바 프로젝트를 jar 파일로 빌드하는 작업을 자동화할 것입니다.

1) Actions - Java with Gradle의 Configure 선택

2) Deploy.yml 아래와 같이 작성

name: Deploy on: push: branches: [ "develop" ] pull_request: branches: [ "develop" ] permissions: contents: read jobs: build: runs-on: ubuntu-latest steps: # 기본 체크아웃 - name: Checkout uses: actions/checkout@v3 # Gradlew 실행 허용 - name: Run chmod to make gradlew executable run: chmod +x ./gradlew # JDK 11 세팅 - name: Set up JDK 11 uses: actions/setup-java@v3 with: java-version: '11' distribution: 'temurin' # 환경 변수 설정 - name: Set environment values run: | cd ./src/main/resources touch ./env.properties echo "${{ secrets.ENV }}" > ./env.properties shell: bash # Gradle build (Test 제외) - name: Build with Gradle uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1 with: arguments: clean build -x test
YAML
복사

3) 새 브랜치 파서 커밋 날리기

혹시, PR 안쓰는 프로젝트라면 그냥 develop으로 커밋 날려주세요.

4) PR 생성하기

아래 문장에 의해 PR 날리면 테스트 가능합니다.
on: push: branches: [ "develop" ] pull_request: branches: [ "develop" ]
YAML
복사

5) Actions 탭으로 들어가서 build 되는지 확인하기

3. CD 구축

CD: 앞서 빌드한 jar 파일을 바탕으로 docker image를 생성하고, docker hub에 푸시했다가 ec2 혹은 gcp vm instance 환경에서 해당 이미지를 pull 받아와 배포하는 작업을 자동화할 것입니다.
docker와 docker-compose를 사용할 예정인데, 이 부분을 아직 프로젝트에 적용하지 않으신 분들은 아래 포스팅을 참고해주세요. Docker 부분만 보셔도 좋습니다.

[1] docker image 생성하고 docker hub에 푸시하는 작업 자동화

주의할 점!
도커 허브 리포지토리는 꼭 Private으로 생성해주세요!
만일 public으로 생성하고 싶으시다면, github secret을 사용하지 않고 docker secret을 적용해줘야 하는 데 해당 블로그는 그 부분 내용까지 포함하고 있지 않습니다.

1) docker username, password 환경변수에 추가하기

아래 그림처럼 생성되면 됩니다

2) deploy.yml 작성

아까 적던 코드에 이어서 아래 docker build 부분을 입력해주세요
# Gradle build (Test 제외) - name: Build with Gradle uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1 with: arguments: clean build -x test # Docker build - name: Docker build run: | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_PASSWORD }} docker build -t 리포지토리이름 . docker tag 리포지토리이름 유저네임/리포지토리이름:${GITHUB_SHA::7} docker push 유저네임/리포지토리이름:${GITHUB_SHA::7}
YAML
복사

3) 커밋 날린 후 도커허브에 가서 이미지 제대로 들어왔는지 확인

[2] gcp vm instance 환경에서 해당 이미지 pull 받아와 배포하는 작업 자동화

1) Puttygen 사용해서 SSH 키 생성

Generate 를 클릭한 후 마우스를 마구 흔들어 위 화면처럼 키를 생성합니다.
Key comment에 root, ec2-user 등과 같은 적당한 이름 적어주시고,
Key passphrase는 선택사항이긴 하지만 보안을 위해 원하시는 비밀번호로 적어줍니다.
Save private key를 눌러 로컬의 원하는 폴더에 저장합니다. (추후에 써야하니 해당 폴더 위치는 기억합니다.)
Conversions 탭을 눌러 Export OpenSSH key를 눌러 로컬의 원하는 폴더에 저장합니다. 저는 private key와 같은 폴더에 저장해줬습니다.

2) GCP에 key 정보 입력해주기

Compute Engine -> 메타데이터를 클릭
SSH키 탭을 누르고 수정을 누르고, 제일 밑에 있는 ”+ 항목 추가” 를 누르기
PuttyGen에서 복사한 public key 내용을 그대로 붙여넣기 (public key는 위에 puttygen 사진에서 제가 가려놓은 부분입니다.)

3) putty에서 key 제대로 만들어졌는지 ssh 접속 테스트해보기

위의 Keycomment내용@GCPvm외부ip 를 Host name에 적어줍니다.
예를 들면 root@35.232.22.73 과 같이 적어줍니다.
Connection-SSH-Auth 탭으로 들어가 Browse를 클릭해 아까 로컬에 저장해둔 private key파일을 택합니다.
하단에 Open을 누릅니다.
passphrrase를 입력하란 문구가 나오면, 아까 puttyGen에서 입력했던 passphrase를 입력해줍니다.
정상적으로 들어와졌습니다.

4) deploy.yml 파일에 아래 코드를 추가해줍니다.

# Deploy - name: Deploy uses: appleboy/ssh-action@master with: host: vm 인스턴스 외부ip username: ${{ secrets.SSH_USERNAME }} key: ${{ secrets.SSH_PRIVATE_KEY }} passphrase: ${{ secrets.SSH_PASSPHRASE }} envs: GITHUB_SHA script: | sudo docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_PASSWORD }} sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPOSITORY }}:${GITHUB_SHA::7} sudo docker tag ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPOSITORY }}:${GITHUB_SHA::7} 이미지이름 sudo docker-compose up -d
YAML
복사
이미지 이름(beachcombine_spring)은 Docker-compose.yml 파일의 application.image에 지정해둔 것입니다.

5) github에 ssh keys 등록

GitHub 계정 설정에서 "SSH and GPG keys" 탭으로 이동하여, "New SSH key" 버튼을 클릭
title은 원하는 이름으로 넣어주세요. 저는 프로젝트 이름으로 넣어줬습니다.
Key 부분에 PuttyGen에서 복사한 public key 내용을 그대로 붙여넣기 (public key는 위에 puttygen 사진에서 제가 가려놓은 부분입니다.)

6) github에 환경변수 등록

SSH_PRIVATE_KEY라는 이름으로 아까 로컬에 저장해둔 openSSHkey 파일의 내용을 그대로 복사해와 붙여 넣어줍니다. (중요,,,,)
SSH_USERNAME라는 이름으로 아까 Key comment 내용을 넣어줍니다. ex) root
SSH_PASSPHRASE라는 이름으로 Key passphrase 내용을 넣어줍니다.

7) 커밋을 날려 제대로 배포되는지 확인합니다.

저는 7트에 성공했네요,,,, 이 정도면 저번에 했을 때에 비하면 선방한 거 같습니다^^
뭐가 저를 애먹였냐면,, SSH_PRIVATE_KEY에 openSSHKEY를 안넣고 그냥 public key를 넣어서 문제가 발생한 걸 모르고 다른 걸 계속 고쳤어요,,