GitLabのGoプロキシ
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
- ステータス: 実験的機能
この機能の利用可否は、機能フラグによって制御されます。詳細については、履歴を参照してください。この機能はテストには利用できますが、本番環境での使用には適していません。エピック3043を参照してください。
GitLab用Goプロキシを使用すると、GitLabのすべてのプロジェクトをGoプロキシプロトコルでフェッチできます。
GitLabのGoプロキシは実験であるため、大規模なリポジトリでパフォーマンスの問題が発生する可能性があるため、本番環境での使用には適していません。イシュー218083を参照してください。
Goプロキシが有効になっている場合でも、GitLabはパッケージレジストリにGoモジュールを表示しません。イシュー213770を参照してください。
Goプロキシが使用する特定のAPIエンドポイントのドキュメントについては、Go Proxy APIドキュメントを参照してください。
GoプロキシとしてGitLabを追加
GitLabをGoプロキシとして使用するには、Go 1.13以降を使用する必要があります。
利用可能なプロキシエンドポイントは、プロジェクトごとにモジュールをフェッチするためのものです: /api/v4/projects/:id/packages/go
GitLabからGoモジュールをフェッチするには、プロジェクト固有のエンドポイントをGOPROXYに追加します。
Goはエンドポイントをクエリし、デフォルトの動作に戻ります:
go env -w GOPROXY='https://gitlab.example.com/api/v4/projects/1234/packages/go,https://proxy.golang.org,direct'この設定では、Goは次の順序で依存関係をフェッチします:
- Goは、プロジェクト固有のGoプロキシからフェッチを試みます。
- Goは、
proxy.golang.orgからフェッチを試みます。 - Goは、バージョン管理システムの操作(
git clone、svn checkoutなど)で直接フェッチします。
GOPROXYが指定されていない場合、Goはステップ2と3に従います。これは、GOPROXYをhttps://proxy.golang.org,directに設定することに対応します。GOPROXYにプロジェクト固有のエンドポイントのみが含まれている場合、Goはそのエンドポイントのみをクエリします。
Goの環境変数の設定方法の詳細については、環境変数の設定を参照してください。
プライベートプロジェクトからモジュールをフェッチ
goは、脆弱な接続を介した認証情報の送信をサポートしていません。次の手順は、GitLabがHTTPS用に設定されている場合にのみ機能します:
- GitLab用のGoプロキシからフェッチするときに、HTTP基本認証認証情報を含めるようにGoを設定します。
- パブリックチェックサムデータベースから、プライベートGitLabプロジェクトのチェックサムのダウンロードをスキップするようにGoを設定します。
リクエスト認証を有効にする
apiまたはread_apiのスコープが設定されたパーソナルアクセストークンを作成します。
~/.netrcファイルを開き、次のテキストを追加します。< >の変数を自分の値に置き換えます。
無効なHTTP認証情報でgo getリクエストを行うと、404エラーが表示されます。
NETRCという環境変数を使用すると、Goはその値をファイル名として使用し、~/.netrcを無視します。GitLab CIで~/.netrcを使用する場合は、環境変数名としてNETRCを使用しないでください。
machine <url> login <username> password <token><url>: GitLab URL(例:gitlab.com)。<username>: ユーザー名。<token>: パーソナルアクセストークン。
チェックサムデータベースクエリを無効にする
Go 1.13以降で依存関係をダウンロードすると、フェッチされたソースはチェックサムデータベースsum.golang.orgに対して検証されます。
フェッチされたソースのチェックサムがデータベースのチェックサムと一致しない場合、Goは依存関係をビルドしません。
プライベートモジュールは、sum.golang.orgがプライベートモジュールのソースをフェッチできないため、ビルドに失敗します。そのため、チェックサムを提供できません。
このイシューを解決するには、GONOSUMDBをカンマ区切りのプライベートプロジェクトのリストに設定します。Goの環境変数の設定方法の詳細については、環境変数の設定を参照してください。
たとえば、gitlab.com/my/projectのチェックサムクエリを無効にするには、GONOSUMDBを設定します:
go env -w GONOSUMDB='gitlab.com/my/project,<previous value>'Goの使用
Goでの依存関係の管理、または一般的なGoに慣れていない場合は、次のドキュメントを確認してください:
環境変数を設定する
Goは、環境変数を使用してさまざまな機能を制御します。これらの変数は、通常の方法で管理できます。ただし、Go 1.14では、Goの環境変数は、デフォルトで特別なGo環境ファイルである~/.go/envとの間で読み取りおよび書き込みが行われます。
GOENVがファイルに設定されている場合、Goは代わりにそのファイルとの間で読み取りおよび書き込みを行います。GOENVが設定されておらず、GOPATHが設定されている場合、Goは$GOPATH/envを読み取りおよび書き込みます。
Goの環境変数はgo env <var>で読み取りでき、Go 1.14以降ではgo env -w <var>=<value>で書き込むことができます。例: go env GOPATH、go env -w GOPATH=/go。
モジュールをリリースする
Goモジュールとモジュールのバージョンは、Git、SVN、Mercurialなどのソースリポジトリによって定義されます。モジュールとは、go.modとGoファイルを含むリポジトリのことです。モジュールのバージョンは、バージョン管理システム (VCS) のタグ付けによって定義されます。
モジュールを公開するには、go.modとソースファイルをVCSリポジトリにプッシュします。モジュールのバージョンを公開するには、VCSのタグをプッシュします。