개인 GitHub 패키지 레지스트리에서 GitHub 워크플로우 및 Maven Dependencies 사용

17557 단어 cicdgithubjava
GitHhub 패키지 저장소는 GitHub 프로젝트 간에 의존항(예를 들어 Maven 작업)을 공유하는 간단한 방법을 제공합니다.GitHub 작업을 통해 자동으로 새 부품을 GitHub 패키지 저장소에 발표할 수 있습니다.
2019년 5월GitHub introduced the GitHub Package Registry: 전통적인 가방 등록의 대체품, 예를 들어Sonatype Nexus.그 동안 나는 그것에 대해 아무런 소용이 없었다. 왜냐하면 우리의 모든 내부 의존 관계는 우리의 개인 회사인 Artifactory의 실례에 저장되어 있기 때문이다.
곧 2020년: 연초에 우리는 개인적으로 ninkik 일을 시작했다.GitHub 및 GitHub 작업은 처음부터 저장소를 저장하고 CI/CD 작업을 수행하는 데 사용되었습니다.GitHub Actions CI 프로세스에는 Dellcompany’s Artifactory의 일부 Maven 의존 항목이 포함되어 있습니다.

프로젝트 재편 필요


2020년 11월에 우리는 어쩔 수 없이 닌키크의 프로젝트 구조를 재조직했다.
  • Maven 프로젝트는 다중 모듈 Maven 프로젝트로 분해해야 합니다.
  • 장기적으로 볼 때 저희 내부 라이브러리(라이브러리 A)는 Jenkins와 Artifactory에서 GitHub Actions와 GitHub Package Registry로 넘어가야 합니다.

  • Maven 가공소재를 GitHub 패키지 레지스트리에 게시


    저희 라이브러리 A에 대해 간단한 스크립트가 있습니다.Artifactory를 위해 새로운 스크립트를 준비했습니다.나는 이러한 과정을 마벤트 목표release:preparerelease:perform로 전환하고 싶지 않다고 분명히 밝혔다.
    반대로, 나는 단지 우리의 스크립트와 deploy:deploy 목표를 사용하여 모든 구축에 GitHub 패키지 등록 센터에 새로운 부품을 발표하고 싶을 뿐이다.

    pom 조정.세일즈 관리에 사용되는 xml

    deploy:deploy 대상을 사용하려면 distributionManagement 탭에 새 저장소를 설정해야 합니다.예를 들어, Maven 구성 파일을 사용하여 추가 저장소를 활성화하기로 결정했습니다.
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.dreitier</groupId>
        <artifactId>library-a-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>
        <!-- ... -->
        <profiles>
            <profile>
                <id>github</id>
                <distributionManagement>
                    <repository>
                        <id>github</id>
                        <name>GitHub Packages</name>
                        <url>https://maven.pkg.github.com/dreitier/library-a</url>
                    </repository>
                </distributionManagement>
            </profile>
        </profiles>
        <!-- ... -->
    </project>
    
    Maven의 pom.xml 명령줄 파라미터를 사용합니다. 현재 Maven 개요 파일 -P 을 사용할 수 있습니다.로컬에서 구성을 테스트하려면 GitHub acocount에 대해 Personal Access Token를 생성해야 합니다.
    GitHub 패키지 레지스트리에 가공소재를 업로드하려면 개인 액세스 토큰에 다음 범위github가 있어야 합니다.

    Mavenwrite:packages에 개인 액세스 토큰을 추가해야 합니다.
    <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                          http://maven.apache.org/xsd/settings-1.0.0.xsd">
        <servers>
            <server>
                <id>github</id>
                <username>your-username</username>
                <password>your-personal-access-token</password>
            </server>
        </servers>
    </settings>
    
    로컬에서 현재 사용 가능
    mvn -Pgithub deploy
    

    GitHub 운영 워크플로우


    GitHub 작업 흐름에서 이 부품을 발표하는 것은 매우 간단합니다.settings.xml에 몇 줄만 추가하면 됩니다.
    on:
      push:
        branches: ["**"]
    
    jobs:
      build:
    
        runs-on: ubuntu-latest
    
        steps:
          - uses: actions/checkout@v2
          - name: Set up JDK 11.0.2
            uses: actions/setup-java@v1
            with:
              java-version: 11.0
    
          - name: Deploy
            run: mvn -B -Pgithub deploy
            env:
              GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    
    .github/workflows/maven.yml Maven 설정은 자동으로 설정되지 않습니다.적당한 배치 설정이 있는 xml입니다.그것은 actions/setup-java 변수를 인용한다.${env.GITHUB_TOKEN}는 개인 영패로 자동으로 사용할 수 있으며 현재 GitHub 작업 흐름의 저장소에 권한을 분배한다.
    경고
    등록표에 있는 오래된 소프트웨어 패키지를 정리해야 합니다.제출률과 패키지 크기에 따라 저장소가 패키지 등록표의 할당량에 도달합니다.
    현재 최신 n 버전을 제외하고는 발표된 모든 패키지를 버릴 수 있는 사용자 정의 작업이 없습니다.actions/delete-package-versions 현재 최신 버전 n개만 포기할 수 있습니다.
    다음 GitHub 작업 빌드에서는 가공소재가 게시되고 저장소의 대시보드에서 팝업됩니다.

    GitHub 패키지 레지스트리의 가공소재에 따라 다름


    ninkik에서, 나는 어쩔 수 없이 GitHub 패키지 등록표로 낡은 Artifactory Maven 등록표를 교체해야 한다.이전 단계에서 Maven GITHUB_TOKEN 프로필을 로컬에서 가져왔습니다.내 예에서는 Ninkikgithub에 GitHub 패키지 등록 라이브러리를 추가했습니다.
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.dreitier</groupId>
        <artifactId>ninkik-parent</artifactId>
        <packaging>pom</packaging>
    
        <profiles>
            <profile>
                <id>github</id>
                <repositories>
                    <repository>
                        <id>central</id>
                        <url>https://repo1.maven.org/maven2</url>
                        <releases><enabled>true</enabled></releases>
                        <snapshots><enabled>true</enabled></snapshots>
                    </repository>
                    <repository>
                        <id>github</id>
                        <name>GH dreitier</name>
                        <url>https://maven.pkg.github.com/dreitier/library-a</url>
                        <snapshots><enabled>true</enabled></snapshots>
                        <releases><enabled>true</enabled></releases>
                    </repository>
                </repositories>
            </profile>
        </profiles>
        <modules>
            <!-- ... -->
    </project>
    
    이러한 설정이 있으면 로컬 기계의 일반 mvn 패키지가 작동할 수 있습니다.필요한 모든 Depdenency는 Maven Central 또는 GitHub 패키지 레지스트리에서 다운로드할 수 있습니다.
    GitHub 작업 흐름에서 GitHub 패키지 레지스트리 저장소 사용
    위의 GitHub 작업 흐름도 nkik를 수정하지 않은 상태에서 사용할 수 있기를 바랍니다.하지만 GitHub 작업에서 다음 오류가 발생했습니다.
    [INFO] Downloading from github: https://maven.pkg.github.com/dreitier/library-a/library-a.jar
    [DEBUG] Writing tracking file /home/runner/.m2/repository/com/dreitier/library-a/library-a.jar.lastUpdated
    [INFO] ------------------------------------------------------------------------
    [INFO] Reactor Summary for ninkik-parent 0.0.1-SNAPSHOT:
    [INFO] 
    [INFO] ninkik-parent ...................................... SUCCESS [  0.007 s]
    [INFO] ninkik api spec .................................... FAILURE [  4.620 s]
    [INFO] ...
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  23.400 s
    [INFO] Finished at: 2020-12-16T21:34:31Z
    [INFO] ------------------------------------------------------------------------
    Error:  Failed to execute goal on project ninkik-api-spec: Could not resolve dependencies for project com.dreitier:ninkik-api-spec:jar:0.0.1-SNAPSHOT: Could not find artifact com.dreitier.library-a-data-commons:jar:0.0.38-SNAPSHOT in central (https://repo1.maven.org/maven2) -> [Help 1]
    org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal on project ninkik-api-spec: Could not resolve dependencies for project com.dreitier:ninkik-api-spec:jar:0.0.1-SNAPSHOT: Could not find artifact com.dreitier.library-a-data-commons:jar:0.0.38-SNAPSHOT in central (https://repo1.maven.org/maven2)
        at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies (LifecycleDependencyResolver.java:269)
    The resolution of the library-a depdenency could neither be found in Maven Central (that’s correct) nor in the GitHub Package Registry.
    
    한층 더 읽은 후에 나는 원인을 찾았다.
  • 위에서 설명한 바와 같이 pom.xml 현재 GitHub 작업 흐름의 저장소에는 권한이 있지만 다른 조직이나 사용자의 저장소에는 권한이 없습니다.
  • 본문을 작성할 때(2020년 12월) GitHub 패키지 등록 센터는 확실히 not allow unauthenticated가 공공 저장소를 방문했다.
    a 도서관은 당시에 개인적이었지만 나는 머지않아 대중에게 개방할 것이다.
  • 즉, 개인 액세스 토큰을 사용해야 합니다.
    3.1 개인 액세스 토큰은 특정 저장소에 한정할 수 없습니다.PAT에서는 GitHub 작업 워크플로우를 통해 모든 개인 게시 패키지에 액세스할 수 있습니다.
    3.2 귀하는 프로젝트와 라이브러리에 대한 권한을 가진 비허가 GitHub 사용자를 만들고 이 전용 사용자를 위한 개인 접근 카드를 만들 수 있습니다.
  • 테스트 목적으로 GitHub 계정의'설정 > 개발자 설정 > 개인 방문 영패'아래에 추가 개인 방문 영패를 만들 수 있습니다.개인 방문 영패는 반드시 작용역이 있어야 한다GITHUB_TOKEN.

    주요 프로젝트의 비용read:packages은 다음과 같이 조정해야 합니다.
    on:
      push:
        branches: ["**"]
    
    jobs:
      build:
    
        runs-on: ubuntu-latest
    
        steps:
          - uses: actions/checkout@v2
          - name: Set up JDK 11.0.2
            uses: actions/setup-java@v1
            with:
              java-version: 11.0
              server-id: github # value of repository/id field of the pom.xml
              server-username: GITHUB_USER_REF  # env variable name for username
              server-password: GITHUB_TOKEN_REF # env variable name for GitHub Personal Access Token
    
          - name: Build with Maven
            run: mvn -B -Pgithub package --file pom.xml
            env:
              GITHUB_USER_REF: ${{ secrets.GH_PACKAGE_REPO_USERNAME }}
              GITHUB_TOKEN_REF: ${{ secrets.GH_PACKAGE_REPO_PASSWORD }}
    
    기밀.github/worfklows/maven.ymlGH_PACKAGE_REPO_USERNAME는 사용자 이름 및 이전에 생성된 개인 액세스 토큰입니다.
    저장소의 설정 > Confidential 페이지에 두 가지 Confidential을 추가해야 합니다.

    총결산하다


    이 블로그 글은 GitHub 패키지 등록표에 Maven 부품을 발표하고, 다른 Maven 또는Gradle 기반 프로젝트에서 이러한 의존항과 GitHub 조작을 사용할 수 있도록 GitHub 작업 흐름을 설정하는 방법을 보여 줍니다.

    좋은 웹페이지 즐겨찾기