# Gradle을 사용하여 Java 패키지 게시

이 자습서에서는 Gradle을 사용하여 CI(연속 통합) 워크플로의 일부로 레지스트리에 Java 패키지를 게시하는 방법을 알아봅니다.

## 소개

이 가이드에서는 GitHub Packages 및 Maven 중앙 리포지토리에 Java 패키지를 게시하는 워크플로를 만드는 방법을 보여 줍니다. 단일 워크플로를 사용하면 패키지를 단일 리포지토리 또는 여러 리포지토리에 게시할 수 있습니다.

> \[!WARNING] 이 가이드에 사용된 예제는 레거시 OSSRH 서비스를 참조하세요. Maven 중앙 리포지토리 문서의 [게시](https://central.sonatype.org/faq/what-is-different-between-central-portal-and-legacy-ossrh/#publishing)를 참조하세요.

## 필수 조건

워크플로 파일 및 구성 옵션을 기본적으로 이해하는 것이 좋습니다. 자세한 내용은 [워크플로 작성](/ko/enterprise-server@3.22/actions/how-tos/write-workflows)을(를) 참조하세요.

Gradle을 사용하여 Java 프로젝트에 대한 CI 워크플로를 만드는 방법에 대한 자세한 내용은 [Gradle을 사용하여 Java 빌드 및 테스트](/ko/enterprise-server@3.22/actions/tutorials/build-and-test-code/java-with-gradle) 참조하세요.

또한 다음 사항을 기본적으로 이해하는 것이 유용할 수 있습니다.

* [Apache Maven 레지스트리 작업](/ko/enterprise-server@3.22/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry)
* [변수에 정보 저장](/ko/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables)
* [GitHub Actions에서 비밀 사용](/ko/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)
* [워크플로에서 인증에 GITHUB\_TOKEN 사용](/ko/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token)

## 패키지 구성 정보

필드 `groupId` 및 `artifactId`는 `MavenPublication` 파일의 \_\_ 섹션에 있으며, 레지스트리가 패키지를 특정 레지스트리에 연결하는 데 사용하는 고유 식별자를 만듭니다. Maven `groupId` 및 `artifactId` 필드는 *pom.xml* 파일의 해당 필드와 유사합니다. 자세한 내용은 Gradle 설명서의 [Maven 게시 플러그 인](https://docs.gradle.org/current/userguide/publishing_maven.html)을 참조하세요.

*build.gradle* 파일에는 Gradle에서 패키지를 게시할 배포 관리 리포지토리에 대한 구성도 포함되어 있습니다. 각 리포지토리에는 이름, 배포 URL, 인증을 위한 자격 증명이 있어야 합니다.

## Maven 중앙 리포지토리에 패키지 게시

새 릴리스를 만들 때마다 워크플로를 트리거하여 패키지를 게시할 수 있습니다. 아래 예제의 워크플로는 `release` 이벤트가 `created` 형식으로 트리거될 때 실행됩니다. 이 워크플로는 CI 테스트를 통과할 경우 Maven 중앙 리포지토리에 패키지를 게시합니다.
`release` 이벤트의 자세한 내용은 [워크플로를 트리거하는 이벤트](/ko/enterprise-server@3.22/actions/reference/workflows-and-actions/events-that-trigger-workflows#release)을(를) 참조하세요.

패키지 리포지토리를 가리키는 *build.gradle* 파일의 게시 블록에서 새 Maven 리포지토리를 정의할 수 있습니다. 예를 들어 OSSRH 호스팅 프로젝트를 통해 Maven 중앙 리포지토리에 배포하는 경우 \_build.gradle\_에서 이름이 `"OSSRH"`인 리포지토리를 지정할 수 있습니다.

```groovy copy
plugins {
  ...
  id 'maven-publish'
}

publishing {
  ...

  repositories {
    maven {
      name = "OSSRH"
      url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
      credentials {
        username = System.getenv("MAVEN_USERNAME")
        password = System.getenv("MAVEN_PASSWORD")
      }
    }
  }
}
```

이 구성을 사용하면 `gradle publish` 명령을 실행하여 Maven 중앙 리포지토리에 패키지를 게시하는 워크플로를 만들 수 있습니다. 배포 단계에서 Maven 리포지토리에 인증하는 데 사용하는 사용자 이름과 암호 또는 토큰의 환경 변수를 설정해야 합니다. 자세한 내용은 [GitHub Actions에서 비밀 사용](/ko/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)을(를) 참조하세요.

```yaml copy

# 이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.
# 작업은 타사에서 제공하며
# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.
# 참조하세요.

# 커밋 SHA에 작업을 고정하는 것이 좋습니다.
# 최신 버전을 얻으려면 SHA를 업데이트해야 합니다.
# 태그 또는 분기를 참조할 수도 있지만 경고 없이 작업이 변경될 수 있습니다.

name: Publish package to the Maven Central Repository
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Set up Java
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'

      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@017a9effdb900e5b5b2fddfb590a105619dca3c3 # v4.4.2

      - name: Publish package
        run: ./gradlew publish
        env:
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
```

이 워크플로는 다음 단계를 수행합니다.

1. 프로젝트 리포지토리의 복사본을 체크 아웃합니다.
2. Java JDK를 설정합니다.
3. Gradle 환경을 설정합니다. 이 [`gradle/actions/setup-gradle`](https://github.com/gradle/actions) 작업은 워크플로 실행 간의 캐싱 상태를 처리하고 모든 Gradle 실행에 대한 자세한 요약을 제공합니다.
4. Gradle `publish` 작업을 실행하여 `OSSRH` Maven 리포지토리에 게시합니다.
   `MAVEN_USERNAME` 환경 변수는 `OSSRH_USERNAME` 비밀의 내용으로 설정되고, `MAVEN_PASSWORD` 환경 변수는 `OSSRH_TOKEN` 비밀의 내용으로 설정됩니다.

   워크플로에서 비밀을 사용하는 방법에 대한 자세한 내용은 [GitHub Actions에서 비밀 사용](/ko/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)을(를) 참조하세요.

## GitHub Packages에 패키지 게시

새 릴리스를 만들 때마다 워크플로를 트리거하여 패키지를 게시할 수 있습니다. 아래 예제의 워크플로는 `release` 이벤트가 `created` 형식으로 트리거될 때 실행됩니다. 워크플로는 CI 테스트가 통과하면 GitHub Packages 패키지를 게시합니다.
`release` 이벤트의 자세한 내용은 [워크플로를 트리거하는 이벤트](/ko/enterprise-server@3.22/actions/reference/workflows-and-actions/events-that-trigger-workflows#release)을(를) 참조하세요.

\_를 가리키는 build.gradle\_의 게시 블록에서 새 Maven 리포지토리를 정의할 수 있습니다GitHub Packages. 해당 리포지토리 구성에서 CI 워크플로 실행에 설정된 환경 변수를 활용할 수도 있습니다.
`GITHUB_ACTOR` 환경 변수를 사용자 이름으로 사용할 수 있으며, `GITHUB_TOKEN` 비밀로 `GITHUB_TOKEN` 환경 변수를 설정할 수 있습니다.

`GITHUB_TOKEN` 비밀은 워크플로의 작업이 시작될 때마다 리포지토리에 대한 액세스 토큰으로 설정됩니다.
`contents` 권한에 대한 읽기 권한을 부여하고 `packages` 권한에 대한 쓰기 권한을 부여하려면 워크플로 파일에서 이 액세스 토큰에 대한 사용 권한을 설정해야 합니다. 자세한 내용은 [워크플로에서 인증에 GITHUB\_TOKEN 사용](/ko/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token)을(를) 참조하세요.

예를 들어 조직의 이름이 "octocat"이고 리포지토리의 이름이 "hello-world" GitHub Packages 인 경우 *build.gradle* 의 구성은 아래 예제와 유사합니다.

```groovy copy
plugins {
  ...
  id 'maven-publish'
}

publishing {
  ...

  repositories {
    maven {
      name = "GitHubPackages"
      url = "https://maven.pkg.github.com/octocat/hello-world"
      credentials {
        username = System.getenv("GITHUB_ACTOR")
        password = System.getenv("GITHUB_TOKEN")
      }
    }
  }
}
```

이 구성을 사용하면 GitHub Packages 명령을 실행하여 패키지를 `gradle publish`에 게시하는 워크플로를 만들 수 있습니다.

```yaml copy

# 이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.
# 작업은 타사에서 제공하며
# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.
# 참조하세요.

# 커밋 SHA에 작업을 고정하는 것이 좋습니다.
# 최신 버전을 얻으려면 SHA를 업데이트해야 합니다.
# 태그 또는 분기를 참조할 수도 있지만 경고 없이 작업이 변경될 수 있습니다.

name: Publish package to GitHub Packages
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@017a9effdb900e5b5b2fddfb590a105619dca3c3 # v4.4.2

      - name: Publish package
        run: ./gradlew publish
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

이 워크플로는 다음 단계를 수행합니다.

1. 프로젝트 리포지토리의 복사본을 체크 아웃합니다.
2. Java JDK를 설정합니다.
3. Gradle 환경을 설정합니다. 이 [`gradle/actions/setup-gradle`](https://github.com/gradle/actions) 작업은 워크플로 실행 간의 캐싱 상태를 처리하고 모든 Gradle 실행에 대한 자세한 요약을 제공합니다.
4. `publish`에 게시하기 위해 Gradle GitHub Packages 작업을 실행합니다.
   `GITHUB_TOKEN` 환경 변수는 `GITHUB_TOKEN` 비밀의 내용으로 설정됩니다.
   `permissions` 키는 `GITHUB_TOKEN` 비밀이 허용하는 액세스를 지정합니다.

   워크플로에서 비밀을 사용하는 방법에 대한 자세한 내용은 [GitHub Actions에서 비밀 사용](/ko/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)을(를) 참조하세요.

## Maven 중앙 리포지토리에 패키지 게시 및 GitHub Packages

GitHub Packages 파일에서 각각을 구성하여 Maven Central Repository와 \_\_ 모두에 패키지를 게시할 수 있습니다.

*build.gradle* 파일에 GitHub 리포지토리와 Maven Central Repository provider 모두에 대한 리포지토리가 포함되어 있는지 확인하세요.

예를 들어 OSSRH 호스팅 프로젝트를 통해 중앙 리포지토리에 배포하는 경우 `name`이 `OSSRH`로 설정된 배포 관리 리포지토리에서 지정하는 것이 좋습니다.
GitHub Packages에 배포하는 경우, `name`을 `GitHubPackages`(으)로 설정한 배포 관리 리포지토리에서 이를 지정하는 것이 좋습니다.

조직 이름이 “octocat”이고 리포지토리 이름이 “hello-world”인 경우 \_build.gradle\_의 구성은 아래 예제와 유사합니다.

```groovy copy
plugins {
  ...
  id 'maven-publish'
}

publishing {
  ...

  repositories {
    maven {
      name = "OSSRH"
      url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
      credentials {
        username = System.getenv("MAVEN_USERNAME")
        password = System.getenv("MAVEN_PASSWORD")
      }
    }
    maven {
      name = "GitHubPackages"
      url = "https://maven.pkg.github.com/octocat/hello-world"
      credentials {
        username = System.getenv("GITHUB_ACTOR")
        password = System.getenv("GITHUB_TOKEN")
      }
    }
  }
}
```

이 구성을 사용하면 GitHub Packages 명령을 실행하여 패키지를 Maven Central 리포지토리와 `gradle publish` 모두에 게시하는 워크플로를 만들 수 있습니다.

```yaml copy

# 이 워크플로는 GitHub에서 인증되지 않은 작업을 사용합니다.
# 작업은 타사에서 제공하며
# 별도의 서비스 약관, 개인정보처리방침, 지원 설명서에서 규정됩니다.
# 참조하세요.

# 커밋 SHA에 작업을 고정하는 것이 좋습니다.
# 최신 버전을 얻으려면 SHA를 업데이트해야 합니다.
# 태그 또는 분기를 참조할 수도 있지만 경고 없이 작업이 변경될 수 있습니다.

name: Publish package to the Maven Central Repository and GitHub Packages
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v6
      - name: Set up Java
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@017a9effdb900e5b5b2fddfb590a105619dca3c3 # v4.4.2

      - name: Publish package
        run: ./gradlew publish
        env: 
          MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

이 워크플로는 다음 단계를 수행합니다.

1. 프로젝트 리포지토리의 복사본을 체크 아웃합니다.
2. Java JDK를 설정합니다.
3. Gradle 환경을 설정합니다. 이 [`gradle/actions/setup-gradle`](https://github.com/gradle/actions) 작업은 워크플로 실행 간의 캐싱 상태를 처리하고 모든 Gradle 실행에 대한 자세한 요약을 제공합니다.
4. Gradle `publish` 작업을 실행하여 `OSSRH` Maven 리포지토리와 GitHub Packages에 게시합니다.
   `MAVEN_USERNAME` 환경 변수는 `OSSRH_USERNAME` 비밀의 내용으로 설정되고, `MAVEN_PASSWORD` 환경 변수는 `OSSRH_TOKEN` 비밀의 내용으로 설정됩니다.
   `GITHUB_TOKEN` 환경 변수는 `GITHUB_TOKEN` 비밀의 내용으로 설정됩니다.
   `permissions` 키는 `GITHUB_TOKEN` 비밀이 허용하는 액세스를 지정합니다.

   워크플로에서 비밀을 사용하는 방법에 대한 자세한 내용은 [GitHub Actions에서 비밀 사용](/ko/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)을(를) 참조하세요.