배경

Spring 웹 애플리케이션을 Azure App Service에 배포하며, GitHub Actions를 사용해서 자동 배포를 구성하였습니다.

Azure에서 아래와 같이 Java 대상 GitHub Actions 워크플로를 추가하였는데, 실행 과정에서 빌드 실패가 발생하는 문제가 있었습니다. 해당 오류들을 고치면서 스크립트를 수정해보았습니다.

# Docs for the Azure Web Apps Deploy action: <https://github.com/Azure/webapps-deploy>
# More GitHub Actions for Azure: <https://github.com/Azure/actions>

name: Build and deploy JAR app to Azure Web App - freely

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read #This is required for actions/checkout

    steps:
      - uses: actions/checkout@v4

      - name: Set up Java version
        uses: actions/setup-java@v4
        with:
          java-version: '21'
          distribution: 'microsoft'

      - name: Build with Maven
        run: mvn clean install

      - name: Upload artifact for deployment job
        uses: actions/upload-artifact@v4
        with:
          name: java-app
          path: '${{ github.workspace }}/target/*.jar'

  deploy:
    runs-on: ubuntu-latest
    needs: build
    environment:
      name: 'Production'
      url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
    permissions:
      id-token: write #This is required for requesting the JWT
      contents: read #This is required for actions/checkout
  
    steps:
      - name: Download artifact from build job
        uses: actions/download-artifact@v4
        with:
          name: java-app
      
      - name: Login to Azure
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_349486BDDBF649FC992796EF86308187 }}
          tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_2C93FAC04FA4452ABDBAB8CBC43EC36E }}
          subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_AF7627F1181A410DB40BABF53F10BC91 }}

      - name: Deploy to Azure Web App
        id: deploy-to-webapp
        uses: azure/webapps-deploy@v3
        with:
          app-name: 'freely'
          slot-name: 'Production'
          package: '*.jar'
    

Maven을 Gradle로 변경

Java에서는 빌드 시스템으로 Maven과 Gradle이 사용됩니다.

Spring Boot 프로젝트를 생성하는 시점에서 기본값으로 제공되는 빌드 시스템이 Gradle이였기에, 현재 프로젝트는 Gradle을 빌드 시스템으로 사용하고 있습니다.

하지만 워크플로는 Maven을 사용한다고 가정하고 작성되어 있기에, 이를 수정해야 합니다.

프로젝트 내 gradle wrapper를 실행해야 하기 때문에 chmod로 실행 권한을 부여하고, clean build 명령으로 jar 파일을 생성합니다. Linux가 아닌, Windows 플랫폼일 경우, gradlew.bat 파일을 실행하면 됩니다.

# BEFORE
- name: Build with Maven
	run: mvn clean install

# AFTER
- name: Build with Gradle
	run: chmod +x ./gradlew && ./gradlew clean build

Plain JAR 생성 비활성화 시키기

위의 방법으로 Gradle로 빌드가 성공적으로 되나, 일반적으로 빌드 시 build/libs 내 2개의 Jar 파일이 생성됩니다.

Jar 파일이 2개이기 때문에, azure/webapps-deploy 실행 시, 실행해야 할 Jar 파일이 모호해 오류가 발생합니다.

아래 Spring Boot Reference에서 처럼 빌드 시 postfix classifier를 설정하여 bootJar 만을 복사해 artifact로 업로드할 수도 있으나, Azure App Service에서 Java를 실행하는 환경은 실행에 필요한 의존성이 없기에 bootJar 만 생성하도록 build.gradle를 수정하였습니다.

tasks.named('jar') {
	enabled = false
}

Spring Boot Gradle Plugin Reference Guide