SCM & CI,CD

[GitHub Actions]war 파일 빌드/배포하기

  • -
반응형

농실농실 서비스를 운영하면서 매번 빌드/배포를 수동으로 하고 있었는데 언젠가 이 작업을 자동으로 바꾸고 싶었습니다. 해당 서비스는 Cafe24의 Tomcat 호스팅 서비스를 사용하고 있습니다. 자주는 아니었지만 서비스에 기능이 수정되거나 버그를 고칠때면 로컬에서 빌드 후 war 파일을 FTP로 올려주고 있었습니다.

오늘은 GitHub에서 제공하는 Git Actions을 통해 빌드된 war 파일을 Cafe24 서버로 배포하는 과정에 대해 알아보겠습니다.

 

※ 테스트 환경
  • Spring Boot
  • JDK 1.8
  • Gradle

GitHub Actions

GitHub Actions는 GitHub에서 공식적으로 제공하는 빌드, 테스트 및 배포 파이프라인 자동화 도구입니다. 이를 통해 저장소에 특정 이벤트(Push, Pull Request)를 트리거하여 워크 플로우를 구성할 수 있습니다.

워크 플로우는 yml파일에 의해 구성되며 빌드, 테스트, 배포 등 기능에 따라 여러 개의 플로우를 만들 수도 있습니다. 

 

1. Git Actions 설정

저장소에서 Actions - Java with Gradle 클릭합니다.

 

2. yml 파일 작성

 

영역 부분에 아래 코드를 붙여넣습니다.

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle

name: Java CI with Gradle

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:

    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
    - uses: actions/checkout@v4
    - name: Set up JDK 1.8
      uses: actions/setup-java@v4
      with:
        java-version: '8.0.432+6'
        distribution: 'temurin'
        
    # Make properties
    - run: touch ./src/main/resources/application.properties
    - run : echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application.properties    
    - uses: actions/upload-artifact@v4
      with:
        name: application.properties
        path: ./src/main/resources/application.properties

    - name: Execute permission for gradlew
      run: chmod +x ./gradlew

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

    - name: Show war file
      run: ls -ahl ./build/libs/*.war

    # Deploy
    - name: Deploy file
      uses: SamKirkland/FTP-Deploy-Action@v4.3.5
      with:
        server: ${{ secrets.HOST }}
        username: ${{ secrets.USERNAME }}
        password: ${{ secrets.PASSWORD }}               
        local-dir: "./build/libs/"
        server-dir: ${{ secrets.REMOTE_DIR }}

 

각 플로우를 하나씩 살펴보겠습니다.

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
  • on.push.branches : 특정 브랜치에 푸쉬가 발생하면 워크플로우가 실행
  • on.pull_request.branches : 특정 브랜치에 병합될 때 워크플로우가 실행

 

jobs:
  build:

    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
    - uses: actions/checkout@v4
    - name: Set up JDK 1.8
      uses: actions/setup-java@v4
      with:
        java-version: '8.0.432+6'
        distribution: 'temurin'
  • jobs : 하나 이상의 단계로 구성된 작업
    • runs-no : job이 실행될 환경을 정의
    • permissions.contents : read - 저장소에 대한 읽기 권한만 부여
  • steps : 빌드, 테스트, 배포 과정을 수행하는 액션으로 구성
  • uses : 각 단계별 사용되는 액션 
    • with : 해당 액션에 정의되는 파라미터
    • actions/checkout@v4 : 저장소의 코드를 체크아웃
    • actions/setup-java@v4 : Java 개발에 필요한 도구를 설치
  • name : 단계의 이름 설정(선택사항)

uses 액션에는 GitHub 마켓플레이스에 등록된 액션들을 사용할 수 있습니다.

 

# Make properties
- run: touch ./src/main/resources/application.properties
- run : echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application.properties    
- uses: actions/upload-artifact@v4
  with:
    name: application.properties
    path: ./src/main/resources/application.properties
  • run : 커맨드 실행
  • touch ./src/main/resouces/application.properties / echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application.properties : properties 파일 생성 후 secrets에 저장된 값을 복사

보통 properties 파일은 저장소에 보관되지 않기 때문에 환경변수로 등록한 후 배포시 파일을 생성/추가하는 방식으로 관리가 가능합니다. 환경변수 등록방법은 글 아래 3번을 확인해 주세요.

 

- name: Execute permission for gradlew
  run: chmod +x ./gradlew

# Build
- name: Build with Gradle
  run: ./gradlew clean build
  • chmod +x ./gradlew : gradlew 파일 실행 권한을 부여
  • ./gradle clean build : 빌드 실행

 

- name: Show war file
  run: ls -ahl ./build/libs/*.war
  • ls -ahl ./build/libs/*.war : 생성된 war 파일 확인

 

# Deploy
- name: Deploy file
  uses: SamKirkland/FTP-Deploy-Action@v4.3.5
  with:
    server: ${{ secrets.HOST }}
    username: ${{ secrets.USERNAME }}
    password: ${{ secrets.PASSWORD }}               
    local-dir: "./build/libs/"
    server-dir: ${{ secrets.REMOTE_DIR }}
  • SamKirkland/FTP-Deploy-Action@v4.3.5 : 마켓플레이스에 등록된 FTP 액션을 사용
    • server : 호스팅 서버(카페24주소) 
    • username : 아이디
    • password : 패스워드
    • local-dir : 업로드할 로컬 폴더 경로
    • server-dir : 원격 폴더 경로

 

3. 환경변수 설정

저장소에서 Settings - Secrets and variables - Actions을 통해 환경변수를 등록합니다.

 

 

4. Cafe24 설정

FTP를 통해 업로드되는 서버는 Cafe24입니다. Deploy 부분에서 몇번의 오류가 있었는데 오류의 원인은 Cafe24의 접속 설정을 수정함으로써 해결할 수 있었습니다. 해당 부분의 접속 제한을 해제합니다.

 

5. 테스트

이제 main 브랜치로 Push가 발생하게 되면 아래와 같이 build가 실행됩니다.

 

ROOT.war 파일이 정상적으로 전송된 것을 확인할 수 있습니다.

 

 

카페24에서 제공하는 호스팅 서비스는 기본적으로 ROOT.war 파일을 실행하게 됩니다. 따라서 build.gralde 파일에 아래와 같이 파일명을 ROOT로 만들수 있도록 수정했습니다.

war {
    archiveBaseName = 'ROOT'
    archiveFileName = 'ROOT.war'
    archiveVersion = '0.0.0'
}

 

 

참고문서
 

GitHub - SamKirkland/FTP-Deploy-Action: Deploys a GitHub project to a FTP server using GitHub actions

Deploys a GitHub project to a FTP server using GitHub actions - SamKirkland/FTP-Deploy-Action

github.com

반응형

'SCM & CI,CD' 카테고리의 다른 글

[Slack]Jenkins + Slack 연동  (0) 2024.10.08
[Jenkins]Git 연동  (0) 2023.03.16
[Jenkins]SFTP를 이용해 배포하기  (0) 2022.08.11
[Jenkins]Linux 환경 젠킨스 설치  (0) 2021.12.20
.gitignore 관리하기  (0) 2020.12.22
Contents

포스팅 주소를 복사했습니다.

이 글이 도움이 되었다면 공감 부탁드립니다.