Skip to content

태그 푸시(Tag push) 트리거 및 Maven Repository 배포 플로우 누락 #73

Description

@yyubin

배경

현재 CI에서 릴리즈 프로세스를 Git 태그 기반으로 운영하려고 하나,

  • on.push.tags 트리거가 정의되어 있지 않아 태그 푸시 시 워크플로우가 실행되지 않으며,
  • 태그가 잡히더라도 Maven Repository 배포(gradlew publish 등) 단계가 없습니다.

이로 인해 릴리즈 태그를 생성해도 아티팩트가 리포지토리에 배포되지 않습니다.

해야 할 일 (Tasks)

  • GitHub Actions(또는 사용하는 CI)에 태그 트리거 추가: on.push.tags: ['v*.*.*']
  • 태그 푸시 시만 동작하는 배포 job 추가 (if: startsWith(github.ref, 'refs/tags/'))
  • 태그명에서 버전 추출(vX.Y.ZX.Y.Z) 후 Gradle Pversion에 주입
  • ./gradlew clean build./gradlew publish 실행
  • (Maven Central 배포 시) GPG 서명 및 Sonatype 릴리즈 단계 추가
  • (사설 Nexus 사용 시) 서버 크리덴셜/URL 연동
  • Secrets 문서화: MAVEN_USERNAME, MAVEN_PASSWORD, GPG_PRIVATE_KEY, GPG_PASSPHRASE
  • SNAPSHOT 가드: 태그 릴리즈에 SNAPSHOT 버전 금지

수용 기준 (Acceptance Criteria)

  • 태그 v1.2.3 푸시 시 워크플로우가 자동 실행된다.
  • 빌드가 성공하면 Maven Repo에 1.2.3 버전이 배포된다.
  • 실패 시 로그에 버전·리포지토리·아티팩트 식별이 가능하다.
  • SNAPSHOT 버전은 릴리즈 job에서 차단된다.

제안 구현 (GitHub Actions 예시)

name: Release

on:
  push:
    tags:
      - 'v*.*.*'   # e.g. v1.2.3

jobs:
  release:
    if: startsWith(github.ref, 'refs/tags/')
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Set up Java
        uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: '21'
          cache: gradle
          server-id: ossrh            # 사설 Nexus면 nexus 로 변경
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
          gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
          gpg-passphrase: ${{ secrets.GPG_PASSPHRASE }}

      - name: Derive version from tag
        run: |
          echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_ENV
          if [[ "$VERSION" == *"-SNAPSHOT"* ]]; then
            echo "Do not release SNAPSHOT versions from tags"; exit 1
          fi
          echo "Release version: $VERSION"

      - name: Build
        run: ./gradlew -Pversion=$VERSION clean build --stacktrace

      # Maven Central(sonatype) 사용하는 경우
      - name: Publish (Sonatype)
        if: env.VERSION != ''
        run: |
          ./gradlew -Pversion=$VERSION publish closeAndReleaseSonatypeStagingRepository

      # 사설 Nexus 사용하는 경우 (위 단계 대신 이 단계 사용)
      # - name: Publish (Private Nexus)
      #   run: ./gradlew -Pversion=$VERSION publish

    env:
      MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}   # or NEXUS_USERNAME
      MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}   # or NEXUS_PASSWORD

추가 메모

  • 태그 규칙: vMAJOR.MINOR.PATCH (예: v0.5.3)
  • 멀티모듈일 경우 publishing 설정이 각 모듈에 적용되어 있는지 확인
  • Gradle signing/publishing 플러그인 설정이 CI에서도 동작하도록 gradle.properties/환경변수 정리

Metadata

Metadata

Assignees

No one assigned

    Labels

    featurewant a new feature

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions