[CI/CD] 프로젝트 Docker, Github Action, EC2로 배포하기 - (2)

Sunwu Park·2024년 2월 2일
0

Cloud & CI/CD

목록 보기
5/17

저번에 도커 컴포즈로 실행하는 것 까지 알아보았습니다. 하지만 매번 이렇게 서버에 접속해서 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]

0개의 댓글

관련 채용 정보