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 받아와 배포하는 작업을 자동화할 것입니다.
[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를 넣어서 문제가 발생한 걸 모르고 다른 걸 계속 고쳤어요,,