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. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Artifact Registry API を有効にします。

    API を有効にする

  5. Google Cloud CLI をインストールします。
  6. gcloud CLI を初期化するには:

    gcloud init
  7. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  8. Google Cloud プロジェクトで課金が有効になっていることを確認します

  9. Artifact Registry API を有効にします。

    API を有効にする

  10. Google Cloud CLI をインストールします。
  11. gcloud CLI を初期化するには:

    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
    

次のステップ