プロジェクトをGo言語パッケージとして使用する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
前提要件:
- サブグループ内のプライベートプロジェクトをGoパッケージとして使用するには、Goリクエストを認証する必要があります。認証されていないGoリクエストがあると、
go getが失敗します。サブグループにないプロジェクトのGoリクエストを認証する必要はありません。
プロジェクトをGoパッケージとして使用するには、go getとgodoc.orgのディスカバリリクエストを使用します。メタヘッダーは以下を使用できます:
無効なHTTP認証情報でgo getリクエストを行うと、404エラーが表示されます。HTTP認証情報は、~/.netrc (MacOSおよびLinux)または~/_netrc (Windows)にあります。
プライベートプロジェクトへのGoリクエストの認証
前提要件:
- お使いのGitLabインスタンスは、HTTPSでアクセスできる必要があります。
read_apiスコープを持つパーソナルアクセストークンが必要です。
Goリクエストを認証するには、次の情報を含む.netrcファイルを作成します:
machine gitlab.example.com
login <gitlab_user_name>
password <personal_access_token>Windowsでは、Goは~/_netrcの代わりに~/.netrcを読み取ります。
goコマンドは、脆弱な接続を介して認証情報を送信しません。Goによって行われたHTTPSリクエストは認証しますが、Gitを介して行われたリクエストは認証しません。
Gitリクエストを認証
Goがプロキシからモジュールをフェッチできないバージョン、Gitを使用します。Gitは.netrcファイルを使用してリクエストを認証しますが、他の認証方法を設定できます。
次のいずれかのGitを設定します:
認証情報をリクエストURLに埋め込みます:
git config --global url."https://${user}:${personal_access_token}@gitlab.example.com".insteadOf "https://gitlab.example.com"HTTPSの代わりにSSHを使用します:
git config --global url."git@gitlab.example.com:".insteadOf "https://gitlab.example.com/"
プライベートプロジェクトのGoモジュールのフェッチを無効にします
モジュールまたはパッケージをフェッチするには、Goは環境変数を使用します:
GOPRIVATEGONOPROXYGONOSUMDB
フェッチを無効にする手順:
GOPRIVATEを無効にします:- 1つのプロジェクトのクエリを無効にするには、
GOPRIVATE=gitlab.example.com/my/private/projectを無効にします。 - GitLab.comのすべてのプロジェクトのクエリを無効にするには、
GOPRIVATE=gitlab.example.comを無効にします。
- 1つのプロジェクトのクエリを無効にするには、
GONOPROXYでプロキシクエリを無効にします。GONOSUMDBでチェックサムクエリを無効にします。
- モジュール名またはそのプレフィックスが
GOPRIVATEまたはGONOPROXYにあるバージョン、Goはモジュールプロキシにクエリを実行しません。 - モジュール名またはそのプレフィックスが
GOPRIVATEまたはGONOSUMDBにあるバージョン、Goはチェックサムデータベースにクエリを実行しません。
プライベートサブグループへのGitリクエストを認証します
Goモジュールがgitlab.com/namespace/subgroup/go-moduleのようなプライベートサブグループにあるバージョン、Git認証は機能しません。これは、go getがリポジトリパスを検出するために、認証されていないリクエストを行うために発生します。.netrcファイルを使用したHTTP認証がないバージョン、GitLabは認証されていないユーザーに対してプロジェクトの存在を公開するセキュリティリスクを防ぐために、gitlab.com/namespace/subgroup.gitで応答します。その結果、Goモジュールをダウンロードできません。
残念ながら、Goは.netrc以外にリクエスト認証の手段を提供していません。将来のバージョン、Goは任意の認証ヘッダーのサポートを追加する可能性があります。詳細については、golang/go#26232を参照してください。
回避策: モジュール名で.gitを使用します
go getリクエストをスキップして、Git認証を直接使用するようにGoに強制する方法がありますが、モジュール名の変更が必要です。Goのドキュメントから:
モジュールパスにVCS修飾子(
.bzr、.fossil、.git、.hg、.svnのいずれか)がパスコンポーネントの最後にあるバージョン、goコマンドは、そのパス修飾子までのすべてをリポジトリURLとして使用します。たとえば、モジュールexample.com/foo.git/barのバージョン、goコマンドはGitを使用してexample.com/foo.gitでリポジトリをダウンロードし、barサブディレクトリにモジュールがあることを期待します。
- プライベートサブグループ内のGoモジュールの
go.modに移動します。 - モジュール名に
.gitを追加します。たとえば、module gitlab.com/namespace/subgroup/go-moduleをmodule gitlab.com/namespace/subgroup/go-module.gitに名前変更します。 - このコミットとプッシュの変更。
- このモジュールに依存するGoプロジェクトにアクセスして、
import呼び出しを調整します。たとえばimport gitlab.com/namespace/subgroup/go-module.gitなどです。
この変更後、Goモジュールは正しくフェッチされるはずです。たとえばGOPRIVATE=gitlab.com/namespace/* go mod tidyなどです。
GeoのセカンダリサイトからGoモジュールをフェッチします
Geoを使用して、セカンダリGeoサーバー上のGoモジュールを含むGitリポジトリにアクセスします。
SSHまたはHTTPを使用して、Geoセカンダリサーバーにアクセスできます。
SSHを使用してGeoセカンダリサーバーにアクセスします
SSHを使用してGeoセカンダリサーバーにアクセスするには:
クライアントでGitを再設定して、プライマリからセカンダリにトラフィックを送信します:
git config --global url."git@gitlab-secondary.example.com".insteadOf "https://gitlab.example.com" git config --global url."git@gitlab-secondary.example.com".insteadOf "http://gitlab.example.com"gitlab.example.comの場合は、プライマリサイトのドメイン名を使用します。gitlab-secondary.example.comの場合は、セカンダリサイトのドメイン名を使用します。
クライアントがGitLabリポジトリへのSSHアクセス用にセットアップされていることを確認します。これはプライマリでテストでき、GitLabは公開キーをセカンダリにレプリケートします。
go getリクエストは、プライマリGeoサーバーへのHTTPトラフィックを生成します。モジュールのダウンロードが開始されるバージョン、insteadOf設定は、トラフィックをセカンダリGeoサーバーに送信します。
HTTPを使用してGeoセカンダリにアクセスする
セカンダリサーバーにレプリケートする永続アクセストークンを使用する必要があります。CI/CDジョブトークンを使用して、HTTPでGoモジュールをフェッチすることはできません。
HTTPを使用してGeoセカンダリサーバーにアクセスするには:
クライアントでGit
insteadOfリダイレクトを追加します:git config --global url."https://gitlab-secondary.example.com".insteadOf "https://gitlab.example.com"gitlab.example.comの場合は、プライマリサイトのドメイン名を使用します。gitlab-secondary.example.comの場合は、セカンダリサイトのドメイン名を使用します。
パーソナルアクセストークンを生成し、クライアントの
~/.netrcファイルに認証情報を追加します:machine gitlab.example.com login USERNAME password TOKEN machine gitlab-secondary.example.com login USERNAME password TOKEN
go getリクエストは、プライマリGeoサーバーへのHTTPトラフィックを生成します。モジュールのダウンロードが開始されるバージョン、insteadOf設定は、トラフィックをセカンダリGeoサーバーに送信します。