[우아한 테크코스 3기] LEVEL 3 회고 (163일차)
안녕하세요? 제이온입니다.
오늘은 오전에 면접을 갔다 오고 오후에는 포비와 면담한 이후에 CD 작업을 마무리했습니다.
깃허브 액션을 활용하여 CD 구현하기
오늘은 내일도 면접이 있고 기록할 내용들이 좀 있어서 구현 위주로만 이야기를 하겠습니다. 어제 예고한 대로 오늘은 자동 배포를 위한 코드를 작성하기위해 제리와 합의를 좀 보았습니다. 우선, 제리가 전체적인 인프라 구축을 맡아주었는데, 하나의 웹 서버를 두고 2대의 웹 애플리케이션 서버를 두고, 뒷 단에는 DB용 서버로 이루어졌습니다. 저는 2대의 WAS에 대해 스프링 부트 애플리케이션을 배포만 하면 되었고, 프로젝트 내의 docker-compose가 있었기 떄문에 'docker-compose up --build -d' 명령어만 수행하면 끝이었습니다.
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Java CI with Gradle
on:
push:
branches: [ develop/be ]
pull_request:
branches: [ develop/be ]
jobs:
build:
runs-on: self-hosted
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
token: ${{ secrets.MY_REPO_PAT }}
submodules: recursive
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'adopt'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
working-directory: ./backend
- name: Build with Gradle
run: ./gradlew clean build
working-directory: ./backend
- name: Copy built project
if: success()
uses: appleboy/scp-action@master
env:
GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
GIT_PASSWORD: ${{ secrets.GIT_PASSWORD }}
with:
host: ${{ secrets.EC2_HOST }}, ${{ secrets.EC2_HOST_2 }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
envs: GIT_USERNAME, GIT_PASSWORD
source: '/home/ubuntu/actions-runner/darass_jayon_build_work/2021-darass/2021-darass'
target: '/home/ubuntu'
strip_components: 1
- name: AWS EC2에 ssh로 접속해서 scripts 실행시키기
if: success()
uses: appleboy/ssh-action@master
env:
GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
GIT_PASSWORD: ${{ secrets.GIT_PASSWORD }}
with:
host: ${{ secrets.EC2_HOST }}, ${{ secrets.EC2_HOST_2 }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
envs: GIT_USERNAME, GIT_PASSWORD
script: |
cd /home/ubuntu
sudo rm -rf 2021-darass
mv workspace 2021-darass
cd 2021-darass/backend
docker-compose up --build -d
아무래도 인프라가 확실히 잘 되어 있다 보니, CI/CD를 하는 제 입장에서 굉장히 편했습니다. 오늘도 갓제리를 외쳐 봅니다.
깃허브 액션과 슬랙을 연동하여 알림 기능 구현
현재까지 CI/CD가 잘 동작하지만, 깃허브를 직접 들어가야 CI/CD가 성공했는지 실패했는지 판단할 수 있습니다. 이러한 번거로움을 해소하기 위하여 깃허브 액션과 슬랙을 연동하여 알림 기능을 구현했습니다. 워낙 유명한 작업이라 그런지 양질의 포스팅이 많았습니다. 저는 해당 포스팅을 따라하였습니다.
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Java CI with Gradle
on:
push:
branches: [ develop/be ]
pull_request:
branches: [ develop/be ]
jobs:
build:
runs-on: self-hosted
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
token: ${{ secrets.MY_REPO_PAT }}
submodules: recursive
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'adopt'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
working-directory: ./backend
- name: Build with Gradle
run: ./gradlew clean build
working-directory: ./backend
- name: Copy built project
if: success()
uses: appleboy/scp-action@master
env:
GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
GIT_PASSWORD: ${{ secrets.GIT_PASSWORD }}
with:
host: ${{ secrets.EC2_HOST }}, ${{ secrets.EC2_HOST_2 }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
envs: GIT_USERNAME, GIT_PASSWORD
source: '/home/ubuntu/actions-runner/darass_jayon_build_work/2021-darass/2021-darass'
target: '/home/ubuntu'
strip_components: 1
- name: AWS EC2에 ssh로 접속해서 scripts 실행시키기
if: success()
uses: appleboy/ssh-action@master
env:
GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
GIT_PASSWORD: ${{ secrets.GIT_PASSWORD }}
with:
host: ${{ secrets.EC2_HOST }}, ${{ secrets.EC2_HOST_2 }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
envs: GIT_USERNAME, GIT_PASSWORD
script: |
cd /home/ubuntu
sudo rm -rf 2021-darass
mv workspace 2021-darass
cd 2021-darass/backend
docker-compose up --build -d
- name: build result to slack
uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
fields: repo, message, commit, author, action, eventName, ref, workflow, job, took
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
위와 같이 작성하고 해당 workflow를 작동시키면 아래와 같이 알림이 옵니다.
정리
내일도 면접이 있다 보니 오늘은 여기서 구현을 마무리하려고 합니다. 해당 작업을 완료하고 보니 의문이 하나 생겼습니다. 우리는 feature 브랜치를 생성하고 develop/be에 pr을 날린 후, 문제가 없다면 merge를 하는 방식인데, pr할 때도 CD, merge할 때도 CD를 하여 총 2번 배포를 한다는 것이었습니다. 그래서 내일은 pr할 때는 CI만, merge할 때 비로소 CD를 수행하도록 리팩토링할 예정입니다.
'각종 후기 > 우아한테크코스' 카테고리의 다른 글
[우아한 테크코스 3기] LEVEL 3 회고 (169일차) (0) | 2021.07.20 |
---|---|
[우아한 테크코스 3기] LEVEL 3 회고 (166일차) (0) | 2021.07.17 |
[우아한 테크코스 3기] LEVEL 3 회고 (162일차) (2) | 2021.07.13 |
[우아한 테크코스 3기] LEVEL 3 회고 (161일차) (0) | 2021.07.12 |
[우아한 테크코스 3기] LEVEL 3 회고 (158일차) (2) | 2021.07.10 |
댓글