Project/TeamProject(내밀)

cicd 구축(빌드 action에서 처리)

해달's code 2025. 4. 18. 02:58

build를 ec2에서 처리할 경우 아래와 방법이 좀 달라짐 이 게시물은 action에서 빌드

cicd 구축과정 

1. 로컬폴더에 만든 코드나 깃허브에서 클론해옴

git clone git주소

2. 인텔리제이 접속 

3. .github-workflows폴더 생성후 하단에 deploy.yml파일 생성(파일명은 변경 가능)

4. 파일에 코드 작성

name: Deploy to EC2

on:
  push:
    branches:
      - main  # main 브랜치에 push될 때만 실행

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout source #깃허브 액션에 소스코드 복사
        uses: actions/checkout@v3

      - name: Set up JDK #깃허브 액션에 jdk설치
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'zulu'

      - name: Write application.properties #application.properties민갑정보라 따로 작성
        run: |
          echo "${{ secrets.APPLICATION_PROPERTIES }}" > src/main/resources/application.properties

      - name: Build with Gradle #빌드
        run: ./gradlew clean build

      - name: Deploy to EC2 via SCP #EC2로 배송
        uses: appleboy/scp-action@v0.1.6
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu
          key: ${{ secrets.EC2_KEY }}
          source: "build/libs/naemeal-0.0.1-SNAPSHOT.jar" #보낼거 여기서.sh파일 같이 보내도 됌
          target: "/home/ubuntu/naemeal"

#      - name: Upload application.properties   #이건 ec2에서 빌드할때 필요한 코드 or properties파일을 빌드파일 외부에서 설정시
#        uses: appleboy/ssh-action@v1.0.0
#        with:
#          host: ${{ secrets.EC2_HOST }}
#          username: ubuntu
#          key: ${{ secrets.EC2_KEY }}
#          script: |
#            cd /home/ubuntu/naemeal
#            rm -f src/main/resources/application.properties
#            echo "${{ secrets.APPLICATION_PROPERTIES }}" > src/main/resources/application.properties

      - name: SSH and restart server  #서버 재시작
        uses: appleboy/ssh-action@v1.0.0
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu
          key: ${{ secrets.EC2_KEY }}
          script: |
            cd /home/ubuntu/naemeal
            ./start.sh
start.sh코드내용

#!/bin/bash
pkill -f 'naemeal' || true
tmux new-session -d "java -jar /home/ubuntu/naemeal/build/libs/naemeal-0.0.1-SNAPSHOT.jar > /home/ubuntu/naemeal/app.log 2>&1"

흐름구조 : 로컬에서 push > 깃허브 액션이 깃허브에서 코드 가져옴> 깃허브액션환경에 jdk깔음 > application포함해서 빌드> scp로 ec2에 배송 > 기존 ec2에 클론받은 파일에 빌드파일만 변경

ec2에는 .jar파일하고 서버실행용 .sh파일 log파일 3개만 존재

application.properties는 액션에서 처리해서 같이 빌드됌

gradlew파일하고 start.sh 두개 실행권한 부여 필수 chmod +x 파일명

 

첫줄 name : 워크플로우명

on: push: branch: main 부분은 main브랜치로 푸쉬될때만 작동하게 설정부분 여기에 여러 브랜치들로 자동화 가능

jobs : 할 로직들

build-and-deploy : 액션명 마음대로 설정가능

run-on: ec2 개발환경 처음에 생성할때 고른것

step: 차례대로 명령어 수행 리눅스 명령어만 쭉 적어도 됌

-name: 수행할 명령이름

uses : 깃허브액션사용

5. 깃허브 레포지토리에 secret변수 3개 설정

EC2_HOST : ec2연결ip

EC2_KEY : pem키파일안에 비밀키

APPLICATION_PROPERTIES : 로컬 application_properties파일 내용 그대로 복붙(gitignore처리땜에 함)

6. 깃허브에서 변경내용 포함후에 푸쉬

git branch dev
git pull origin dev //최신버전 유지용
git checkout -b feat/my-new-feature  # 새 브랜치 생성 및 이동

git add .
git commit -m "새 기능 추가"
git push origin feat/my-new-feature

git checkout dev
git pull origin dev
git merge feat/my-new-feature
git push origin dev

git checkout main
git pull origin main
git merge dev
git push origin main

개발브런치 배포브런치 나눌경우에 쓰는 방식 아니면 안해도 됌

git status : 깃 캐시 상태 확인 

git rm --cached src/main/resources/application.properties : 만약 ignore했는데도 파일이 잡힐시

7. 깃허브 액션에서 작동로그 확인 성공하면 끝

 

오류상황

깃허브 액션이 .sh파일을 사용하지 않고 nohub 빌드파일 실행을 하면 ssh가 종료되면서 같이 서버도 꺼버리는 현상 발생

깃허브액션의 docker에서 터미널 명령어가 잘 안먹는 다고 함 > 추측 

정확한 이유는 모르겠으나 실행전에 꺼버리는거 아닌가 예상함 그래서 .sh에 스크립트를 넣어서 실행

여기선 session도 나눠볼려고 tmux설치했으나 필요없을수도 있음