Go モジュールを Artifact Registry に保存する

非公開の Artifact Registry Go リポジトリを設定し、そこにモジュールをアップロードして、モジュールを依存関係として使用します。

準備

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry API.

    Enable the API

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Artifact Registry API.

    Enable the API

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Go 1.15 以降をインストールします。
  13. package-go-module gcloud CLI アドオンをインストールします。
    gcloud components install package-go-module

リポジトリを作成する

新しいリポジトリを作成して構成する手順は、次のとおりです。

  1. 次のコマンドを実行して新しいリポジトリを作成します。

    gcloud artifacts repositories create REPOSITORY \
        --repository-format=go \
        --location=LOCATION \
        --description=DESCRIPTION
    

    以下を置き換えます。

    • REPOSITORY はリポジトリの名前です。 プロジェクト内のリポジトリの場所ごとに、リポジトリ名は一意であることが必要です。
    • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。デフォルトを設定している場合は、このフラグを省略できます。 サポートされているリポジトリのロケーションの一覧を表示するには、コマンド gcloud artifacts locations listを実行します。
    • DESCRIPTION は、リポジトリの省略可能な説明です。 リポジトリの説明は暗号化されないため、機密データは含めないでください。
  2. 次のコマンドを実行して、リポジトリの詳細を表示します。

      gcloud artifacts repositories describe --location=LOCATION REPOSITORY
    

    出力は次のようになります。

      Encryption: Google-managed key
      Repository Size: 0.000MB
      createTime: '2022-06-03T20:20:01.644813Z'
      format: GO
      mode: STANDARD_REPOSITORY
      name: projects/my-project/locations/us-west1/repositories/my-repo
      updateTime: '2022-06-03T20:20:01.644813Z'
    

gcloud コマンドのデフォルトを設定する

プロジェクト、リポジトリ、ロケーションの値のデフォルトを構成することで、gcloud CLI コマンドを簡素化できます。デフォルトを構成すると、タグ --project--location--repository は不要です。

Go モジュールをパッケージ化してアップロードする

package-go-module gcloud CLI アドオンを使用すると、Go モジュールがパッケージ化されます。これにより、gcloud コマンドを使用して Artifact Registry をバージョニングしてアップロードできます。

Go モジュールを作成する

まず、リポジトリにアップロードするシンプルな Go モジュールを作成します。

  1. ホーム ディレクトリで、モジュール用に「foo」というディレクトリを作成します。

    mkdir foo
    
  2. ディレクトリをモジュールのディレクトリに変更し、go mod init を実行してモジュールの go.mod ファイルを作成します。

      cd foo \
      go mod init example.com/foo
    

    example.com/foo は、モジュールパスに置き換えます。詳細については、Go モジュールのリファレンスをご覧ください。

  3. foo ディレクトリに、次の内容の foo.go ファイルを作成します。

    
    package foo
    
    const HelloWorld = "Hello World!"
    

モジュールをパッケージ化してアップロードする

モジュールをパッケージ化して、リポジトリにアップロードします。

  gcloud artifacts go upload --project=PROJECT \
      --repository=REPOSITORY \
      --location=LOCATION \
      --module-path=example.com/foo \
      --version=VERSION \
      --source=SOURCE_LOCATION

以下を置き換えます。

  • PROJECT は、Google Cloud プロジェクト ID に置き換えます。
  • REPOSITORY は、パッケージが保存されるリポジトリの名前に置き換えます。
  • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションに置き換えます。
  • example.com/foo は、モジュールパスに置き換えます。詳細については、Go モジュールのリファレンスをご覧ください。
  • VERSION は、vX.Y.Z 形式のモジュールのセマンティック バージョンに置き換えます。ここで、X はメジャー バージョン、Y はマイナー バージョン、Z はパッチ バージョンです。
  • SOURCE_LOCATION は、Go モジュールのルート ディレクトリへのパスに置き換えます。--source フラグを省略した場合のデフォルト値は現在のディレクトリです。

モジュールが Artifact Registry にアップロードされます。

Go モジュールの作成方法について詳しくは、こちらのチュートリアルをご覧ください。

モジュールを一覧表示する

デフォルト値が構成されているときに、次のコマンドを実行して、デフォルトのプロジェクト、リポジトリ、ロケーションにあるアップロードされた Go モジュールを検査します。

  gcloud artifacts packages list

出力は次のようになります。

  Listing items under project my-project, location us-west1, repository my-repo.

  PACKAGE                   CREATE_TIME          UPDATE_TIME
  example.com/foo           2022-06-03T20:43:39  2022-06-20T20:37:40

モジュール バージョンの詳細を表示する

デフォルト値が構成されているときに、次のコマンドを実行して、デフォルトのプロジェクト、リポジトリ、ロケーションにあるモジュールのバージョンを表示します。

  gcloud artifacts versions list --package=MODULE_PATH

出力は次のようになります。

  Listing items under project my-project, location us-west1, repository my-repo, package example.com/foo.

  VERSION  DESCRIPTION  CREATE_TIME          UPDATE_TIME
  v0.1.0                2022-06-03T20:43:39  2022-06-03T20:43:39
  v0.1.1                2022-06-20T20:37:40  2022-06-20T20:37:40

モジュールをダウンロードする

Artifact Registry に格納されているモジュールをインポートするには、Go に Artifact Registry から依存関係を検索するよう指示し、チェックサム データベースをバイパスする必要があります。

Go 環境を設定する

  1. Artifact Registry、公開 Go モジュール プロキシ、ソースを次の順序でダウンロードするように Go に指示します。

      export GOPROXY=https://LOCATION-go.pkg.dev/PROJECT/REPOSITORY,https://proxy.golang.org,direct
    

    以下を置き換えます。

    • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
    • PROJECT は、Google Cloud プロジェクト ID です。
    • REPOSITORY は、パッケージが保存されるリポジトリの名前です。
  2. 公開チェックサム データベースを使用してモジュールがチェックされないように除外します。

      export GONOSUMDB=MODULE_PATH_REGEX
    

    複数のモジュールを除外する場合は、MODULE_PATH_REGEX をモジュールパスまたは正規表現に置き換えます。

    公開チェックサム データベースを使用してモジュール example.com/foo がチェックされないようにするには、次のコマンドを実行します。

      export GONOSUMDB=example.com/foo
    

    example.com で始まるモジュールパスを持つすべてのモジュールが公開チェックサム データベースを使用したチェックから除外されるようにするには、次のコマンドを実行します。

      export GONOSUMDB=example.com/*
    

Artifact Registry に対して認証する

パッケージ化された Go モジュールをダウンロードして Artifact Registry から依存関係として使用すると、Go バイナリは netrc ファイル内の認証情報を使用して Artifact Registry に対する認証を行います。認証プロセスを簡素化するには、Go 認証ヘルパーを使用して、Artifact Registry への認証用の netrc ファイル内のトークンを更新します。

netrc ファイルの場所は、netrc 環境変数で設定できます。NETRC 変数が設定されていない場合、go コマンドは UNIX に似たプラットフォームでは $HOME/.netrc、Windows では %USERPROFILE%\_netrc を読み取ります。

Artifact Registry では、次の認証方法がサポートされています。

有効期間が短い認証情報(推奨)
Artifact Registry の Go 認証ヘルパーツールを使用して、netrc ファイル内の認証トークンを更新します。
サービス アカウント キーを使用する

このオプションは、環境で認証に認証情報を使用できない場合に使用します。暗号化されていないサービス アカウントキーを netrc ファイルに追加します。

Go 認証ヘルパーを GONOPROXY に追加する

Go 認証ヘルパーを使用する前に、これを Go が GitHub から直接ダウンロードするように、GONOPROXY リストに追加する必要があります。ソースから直接ダウンロードしたい他のモジュールがある場合は、次の例のように、カンマ区切りのリストで追加できます。

  export GONOPROXY=MODULE_PATH1, MODULE_PATH2

ここで、MODULE_PATH1 と MODULE_PATH2 は、ソースからダウンロードするモジュールのモジュールパスです。

Go 認証ヘルパーを GONOPROXY リストに追加し、それを実行して認証情報を設定する手順は、次のとおりです。

  1. Go 認証ヘルパーを GONOPROXY に追加する

      export GONOPROXY=github.com/GoogleCloudPlatform/artifact-registry-go-tools
    
  2. 次のコマンドを実行して、Go モジュール パッケージ ツールで Artifact Registry の認証情報を netrc ファイルに追加します。

      GOPROXY=proxy.golang.org \
          go run github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0 \
          add-locations --locations=LOCATION \
          [--json_key=path/to/service/account/key.json]
    

    ここで、LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。複数の場所を追加する場合は、カンマ区切りのリストとして入力します。

    Go 認証ヘルパーは、Artifact Registry の認証用の設定を netrc ファイルに追加します。--json_key フラグを渡すと、キーが netrc ファイルに追加され、パスワード認証が行われます。

モジュールを依存関係として使用する

  1. Artifact Registry の認証に有効期間の短い認証情報を使用している場合は、次のコマンドを実行して OAuth トークンを更新する必要があります。

      GOPROXY=proxy.golang.org \
      go run github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0 refresh
    
  2. ホーム ディレクトリで、「bar」という名前のディレクトリを作成します。

      mkdir bar
    
  3. ディレクトリをモジュールのディレクトリに変更し、go mod init を実行してパッケージの go.mod ファイルを作成します。

      cd bar \
      go mod init example.com/bar
    

    example.com/bar は、モジュールパスに置き換えます。詳細については、Go モジュールのリファレンスをご覧ください。

  4. Artifact Registry に格納されている foo のバージョンを要求するには、go.mod ファイルを次のように編集します。

    
    module example.com/bar
    
    go 1.19
    
    require example.com/foo v0.1.0
    

    以下を置き換えます。

    • example.com/foo は、必要なモジュールのモジュールパスです
    • v0.1.0 は Artifact Registry に保存されているバージョンです
  5. bar ディレクトリに、次の内容の main.go ファイルを作成します。

      
      package main
    
      import (
        "fmt"
    
        foo "example.com/foo"
      )
    
      func main() {
        fmt.Println(foo.HelloWorld)
      }
    
      
    
  6. go mod tydy を実行して、foo パッケージを含む依存関係をダウンロードします。

      go mod tidy
    
  7. bar モジュールを実行します。

      go run .
    

    出力は次のようになります。

      Hello World!
    

クリーンアップ

このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。リポジトリを削除する前に、保持する必要があるモジュールが別の場所で使用可能であることを確認してください。

  1. リポジトリを削除するには、次の手順を行います。

      gcloud artifacts repositories delete \
          --location=LOCATION \
          --project=PROJECT \
          REPOSITORY
    

    以下を置き換えます。

    • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションに置き換えます。
    • PROJECT は、Google Cloud プロジェクト ID に置き換えます。
    • REPOSITORY はリポジトリの名前に置き換えます。
  2. アクティブな gcloud 構成のデフォルトのリポジトリとロケーション設定を削除するには、次のコマンドを実行します。

      gcloud config unset artifacts/repository
      gcloud config unset artifacts/location
    

次のステップ