[AppService] Azure DevOps를 통해 SpringBoot 앱 배포
시나리오
- Spring-Music Sample(SpringBoot) 소스코드를 이용하여 Azure Devops CI/CD Pipeline을 통해 Azure App Service에 앱을 배포하는 시나리오
- 금번 시나리오에서 사용하는 Spring-Music Sample 코드는 Java11, Gradle을 사용
- 해당 시나리오에 대한 테스트는 다음 Azure Decs 내용을 참고
필수 준비 사항
- Azure App Service 배포
- Azure Devops Project
Azure App Service 배포
런타임 스택: Java11 / Java 웹 서버 스택: Java SE / 운영체제: Linux를 사용하는 App Service를 배포합니다.
Azure DevOps Project 생성
Azure Devops 서비스를 사용하여 App Service에 배포 자동화를 구성하기 위해서는 Devops Project 생성을 선행 해야 합니다.
1. Azure Devops Service > New Project > Create를 통해 Private한 환경의 프로젝트를 하나 생성합니다.
2. Project 생성이 완료되면 Github에 존재하는 소스코드를 import하기 위해서 Repos > Import repository > Clone URL에 Github 주소 삽입 > Import를 진행합니다.
3. Private Github Repository를 Import하는 경우 ‘Requires authorization’을 체크하고, Username(관리 권한을 가진 계정), Password 또는 PAT을 기입 후 Import합니다.
해당 작업을 수행하기 위해서는 Azure Devops 프로젝트 내에서 프로젝트 관리자 권한이 필요합니다.
SpringBoot App Build & App Service Deploy
Azure Devops Pipeline을 이용하여 SpringBoot앱을 Gradle Build하고 Azure App Service에 배포하는 작업을 진행합니다.
1. Pipelines > New Pipeline > Azure Repos Git > Import한 Repo를 선택합니다.
2. Spring-Music 앱은 Gradle 사용함에 따라 Gradle Pipeline Template을 선택합니다.
3. Gradle Pipeline Template을 소스코드 앱 환경에 맞게 수정합니다. 템플릿에 대한 자세한 설명은 다음 링크에서 확인 가능합니다.
# Gradle
# Build your Java project and run tests with Gradle using a Gradle wrapper script.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/java
trigger:
- master
pool:
vmImage: ubuntu-latest
steps:
- task: Gradle@2
inputs:
# Gradle 빌드를 실행할 작업 디렉터리 지정, 지정되지 않은 경우 repo root directory 사용
workingDirectory: ''
# 빌드에 사용할 gradle wrapper의 위치를 지정
gradleWrapperFile: 'gradlew'
# JVM을 시작하기 위해 command-line 인수를 보내는데 사용되는 GRADLE_OPTS 환경 변수 설정
gradleOptions: '-Xmx3072m'
# 특정 JDK 버전을 선택하거나 수동으로 JAVA_HOME 경로를 지정
javaHomeOption: 'JDKVersion'
# JDK 버전 지정
jdkVersionOption: '1.11'
jdkArchitectureOption: 'x64'
# Gradle Build에서 생성한 Junit 결과를 Azure Pipeline에 게시 여부
publishJUnitResults: true
testResultsFiles: '**/TEST-*.xml'
tasks: 'build'
4. Gradle Build에 대한 템플릿 작성이 완료되면 동일한 Pipeline내 App Service에 애플리케이션을 배포하는 템플릿을 작성해봅시다.
우측에 ‘Show assistant’를 선택합니다.
5. ‘Azure App Service deploy’ task를 선택합니다.
6. 기존에 만들어두었던 App Service(Webapp)을 선택하고 ‘Package or folder’란에 Gradle Build를 통해 생성된 jar 파일 경로를 삽입한 뒤 Add 합니다.
7. Add를 하고 나면 다음과 같이 Template이 완성됩니다.
# Gradle
# Build your Java project and run tests with Gradle using a Gradle wrapper script.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/java
trigger:
- master
pool:
vmImage: ubuntu-latest
steps:
- task: Gradle@2
inputs:
workingDirectory: ''
gradleWrapperFile: 'gradlew'
gradleOptions: '-Xmx3072m'
javaHomeOption: 'JDKVersion'
jdkVersionOption: '1.11'
jdkArchitectureOption: 'x64'
publishJUnitResults: true
testResultsFiles: '**/TEST-*.xml'
tasks: 'build'
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: '<Azure Subscription ID>'
appType: 'webAppLinux'
WebAppName: 'awesome-test2'
packageForLinux: '$(System.DefaultWorkingDirectory)/build/libs/*.jar'
RuntimeStack: 'JAVA|11-java11'
8. CI/CD Pipeline 작성이 완료되면 우측에 있는 ‘Save and run’을 통해 저장 및 실행합니다.
9. Pipeline 실행이 정상적으로 완료되면 다음과 같은 화면을 확인할 수 있습니다.
10. 이번엔 Azure App Service에 애플리케이션이 정상적으로 배포되었는지 알아보기 위해 만들어둔 App Service로 이동합니다. 해당 화면에서 기본 도메인에 접속해보면 아래와 같은 화면을 볼 수 있습니다.
추가 참고 사항
만약 WebApp의 고급 도구 방화벽이 ‘거부’되어 있는 경우, Azure Devops에서 배포 시 아래와 같은 에러가 발생할 수 있습니다.
이로 인해 배포 시 방화벽을 허용해줘야 합니다.