SCM & CI,CD

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

  • -
반응형

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

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

 

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

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

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

 

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

 

 

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

# 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 : 원격 폴더 경로(카페24의 경우 /tomcat/webapps/ 또는 /tomcat/webapps-javaee/로 지정하면 됩니다) 

 

*테스트 관련 코드가 없는 경우 빌드시 아래와 같은 오류가 발생할 수 있습니다. 테스트 코드를 주석처리합니다.

> Task :test MarrymeApplicationTests > contextLoads() FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:98 Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800 Caused by: org.springframework.beans.factory.BeanCreationException at ConstructorResolver.java:658 Caused by: org.springframework.beans.BeanInstantiationException at SimpleInstantiationStrategy.java:185 Caused by: org.springframework.beans.factory.BeanCreationException at ConstructorResolver.java:658 Caused by: org.springframework.beans.BeanInstantiationException at SimpleInstantiationStrategy.java:185 Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException at DataSourceUtils.java:83 Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException at SQLError.java:174 Caused by: com.mysql.cj.exceptions.CJCommunicationsException at NativeConstructorAccessorImpl.java:-2 Caused by: java.net.ConnectException at PlainSocketImpl.java:-2 1 test completed, 1 failed > Task :test FAILED
@SpringBootTest class MarrymeApplicationTests { // @Test // void contextLoads() { // } }

 

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

 

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

 

이제 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

반응형

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

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