본문 바로가기

Diary/TIL

2024-05-24) github action으로 CI/CD 구현

ec2 서버 배포, 8080 포트 열어두기, 내 ip에서 ssh 22, .pem key 사용해서 접속

 

https://docs.docker.com/engine/install/ubuntu/ 

 

Install Docker Engine on Ubuntu

Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.

docs.docker.com

공식문서를 참고하여 docker 설치

 

docker pull postgres

docker run -d \
  --name local_pgdb \
  --restart always \
  -p 5432:5432 \
  -e POSTGRES_USER={user} \
  -e POSTGRES_PASSWORD={password} \
  -v local_pgdata:/var/lib/postgresql/data \
  postgres

 

 

docker pull dpage/pgadmin4

docker run -d \
  --name pgadmin4_container \
  --restart always \
  -p 8888:80 \
  -e PGADMIN_DEFAULT_EMAIL={user-email} \
  -e PGADMIN_DEFAULT_PASSWORD={password} \
  -v pgadmin-data:/var/lib/pgadmin \
  dpage/pgadmin4

 

docker-compose 설치할랬는데, docker-compose 의 호환이 지원되지 않아 포기

 

추후에 rds로 옮기려한다.

 

# 워크 플로우 이름
name: Java CI with Gradle 

# 워크 플로우가 언제 실행 될지를 정한다.
on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

# 워크 플로우가 깃 레포에 대한 권한을 읽기 만 가능하게 설정한다.
permissions:
  contents: read

# 워크플로우에서 할 작업 정의한다.
jobs:
  # 작업 환경 = 우분투 최신 버전
  build:
    runs-on: ubuntu-latest

    # 깃허브에서 제공하는 checkout 엑션 사용
    steps:
    - uses: actions/checkout@v3

    # JDK 21 설정한당
    # temurin = Adoptium에서 제공하는 JDK
    - name: Set up JDK 21
      uses: actions/setup-java@v3
      with:
        java-version: '21'
        distribution: 'temurin'

    # gradle wrapper 파일에 실행 권한을 부여
    # gradle wrapper = 개발자가 특정 버전의 Gradle을 미리 설치하지 않고도 Gradle 빌드를 실행할 수 있게 해주는 편리한 도구        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew

    # Application.yml 파일에 secret 값 넣어주기
    - name: Set Yaml
      uses: microsoft/variable-substitution@v1
      with:
        files: ./src/main/resources/application.yml 
      env:
        spring.datasource.url: ${{ secrets.DB_URL }} 
        spring.datasource.username: ${{ secrets.DB_USERNAME }} 
        spring.datasource.password: ${{ secrets.DB_PASSWORD }} 
        jwt.secret.key: ${{ secrets.JWT_KEY }}

    # Gradle 빌드 엑션을 이용해서 프로젝트 빌드
    - name: Build with Gradle
      uses: gradle/gradle-build-action@v2.6.0
      with:
        arguments: build -Dspring.profiles.active=dev

    # 빌드해서 생긴 JAR 파일을 깃허브 아티팩트로 업로드!!
    - name: Upload build artifact
      uses: actions/upload-artifact@v2
      with:
        name: SecurePay
        path: build/libs/SecurePay-0.0.1-SNAPSHOT.jar

  # 배포 **
  deploy:
    needs: build
    runs-on: ubuntu-latest

    # 위의 빌드작업한 JAR 파일 = 아티팩트를 다운로드
    steps:
    - name: Download build artifact
      uses: actions/download-artifact@v2
      with:
        name: SecurePay
        path: build/libs/

    # EC2에 배포
    # EC2 SSH 키를 SecurePay.pem 파일로 저장 ( 위치는 GitHub 서버 )
    # SCP를 사용하여 JAR 파일을 EC2 서버로 복사
    # SSH를 사용하여 EC2 서버에 연결하고 현재 실행 중인 Java 프로세스를 종료한 다음 새로운 Java 프로세스 생성 및 실행!!
    ## NLP 적용하면 IP -> 도메인으로 수정 + EC2 늘리면 run 추가
    - name: Deploy to EC2
      run: |
        echo "${{ secrets.EC2_SSH_KEY }}" > SecurePay.pem
        chmod 600 SecurePay.pem
        scp -i SecurePay.pem -o StrictHostKeyChecking=no build/libs/SecurePay-0.0.1-SNAPSHOT.jar ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }}:/home/${{ secrets.EC2_USERNAME }}/SecurePay.jar
        ssh -i SecurePay.pem -o StrictHostKeyChecking=no ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} "pgrep java | xargs kill -9; nohup java -jar /home/${{ secrets.EC2_USERNAME }}/SecurePay.jar --spring.profiles.active=dev > app.log 2>&1 &"
        rm -f SecurePay.pem

 

이런식으로 CI/CD 가능하도록 코드 수정

 

열심히 고쳐서 완료

 

근데 두가지 문제가 있었는데

 

SSH 통신에 github action의 ip를 알 수 없어서 그걸 활용해야되는 것

ip는 일단 보안그룹을 열어줬고, ci 작업이 완료되고 난 이후, 다시 내 ip에서만 접근 가능하도록 수동으로 작업해주었다.(해결방법이 있다고 하지만 러닝커브가 높아보여 보류)

 

java 21을 설치안했던 것, 이 두가지였다.

sudo apt update
sudo apt install openjdk-21-jdk

이걸 안해서 배포가 안되고 있었다.

 

dockerfile을 선호하게 되는 이유를 알 것 같다.

그냥 dockerfile을 사용하여 같이 설치되도록 하면 편할 것 같다.