저번에 도커 컴포즈로 실행하는 것 까지 알아보았습니다. 하지만 매번 이렇게 서버에 접속해서 pull, docker-compose up명령어를 실행하는 것은 너무나도 귀찮기 때문에 이것을 github 에 푸쉬하면 자동으로 위의 명령어들을 실행해 우리의 서버를 실행시켜주는 github action이 있습니다. 이것을 CI/CD라고 합니다
CI/CD (Continuous Integration/Continuous Delivery)는 애플리케이션 개발 단계를 자동화하여 애플리케이션을 더욱 짧은 주기로 고객에게 제공하는 방법입다.
[출처 : https://www.redhat.com/ko/topics/devops/what-is-ci-cd]
github action 말고도 다른 툴들이 있지만 이번에는 github action을 활용해 보도록 하겠습니다. 먼저 github action 파일을 만들어야 합니다.
이렇게 프로젝트에서 .github폴더에다가 넣으면 됩니다.
name: main Workflow
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'adopt'
- name: Set .yml for main
run: |
mkdir -p src/main/resources
echo "${{ secrets.MAIN_DATABASE_YML }}" | base64 --decode > src/main/resources/application.yml
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Run chmod to make gradlew executable
run: chmod +x ./gradlew
- name: Build with Gradle
run: ./gradlew clean build --exclude-task test
## 웹 이미지 빌드 및 도커허브에 push
- name: web docker build and push
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -t ${{ secrets.DOCKER_REPO }} .
docker push ${{ secrets.DOCKER_REPO }}
- name: EC2 docker remove
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.HOST }}
username: ec2-user
key: ${{ secrets.KEY }}
script: |
if [ "$(sudo docker ps -aq)" ]; then
sudo docker stop $(sudo docker ps -aq)
sudo docker rm -f $(sudo docker ps -aq)
fi
if [ "$(sudo docker images -aq)" ]; then
sudo docker rmi -f $(sudo docker images -aq)
fi
- name: Copy file to EC2
uses: appleboy/scp-action@master
with:
host: ${{ secrets.HOST }}
username: ec2-user
key: ${{ secrets.KEY }}
source: ./docker-compose.yaml
target: /home/ec2-user/
## docker compose up
- name: Docker Compose on EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ec2-user
key: ${{ secrets.KEY }}
script: |
# Docker 이미지 다운로드
sudo docker pull ${{ secrets.DOCKER_REPO }}
# Docker Compose 실행
sudo docker-compose up -d
sudo docker-compose logs -f
# 사용하지 않는 Docker 이미지 정리
sudo docker image prune -f
이런식으로 작성하면 됩니다.
간단한 플로우를 설명하자면
1. ubuntu환경에서 java환경을 만들어줍니다
2.스프링 부트의 application.yml파일을 올리지 않을 거기 때문에 github 의 secret을 만들어주고 가져와서 github action이 돌아가는 중간에 파일을 만들어 넣을것입니다. 참고로 여기서 main_database_yml같은 경우는 본인의 application.yml을 base64로 인코딩후 넣어야합니다!.
3. 도커 환경 설정을 합니다
4. gradlew의 권한 설정을 해준다음 build를 해줍니다.
5. 도커에 로그인후 docker image를 빌드 후 push해줍니다
6. 기존에 도커 이미지/컨테이너가 있다면 삭제해줍니다
7. 도커 컴포즈 파일을 ec2서버에 옮깁니다
8. 파일을 pull한 다음에 실행해줍니다.
이런 순서를 통해 배포를 하게 됩니다.
[출처: https://velog.io/@balparang/Github-Secret-%EC%9C%BC%EB%A1%9C-yml-%ED%8C%8C%EC%9D%BC-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0]