GitLab用のGoプロキシ

  • GitLab 13.1で導入されました。
  • フィーチャーフラグで有効・無効を切り替えることができ、デフォルトでは無効になっています。
  • GitLab.comでは無効になっています。
  • GitLabセルフマネージドインスタンスで使うには、GitLab管理者に頼んで有効にしてもらいましょう。
  • 13.3でGitLab PremiumからGitLab Freeへ移行
caution
GitLab用のGoパッケージレジストリは開発中であり、機能が限られているため実運用にはまだ対応していません。このエピックでは、本番環境で使えるようにするための残りの作業とスケジュールについて詳しく説明します。

GitLab用のGoプロキシを使えば、GitLabのすべてのプロジェクトをGoプロキシプロトコルで取得することができます。

Go プロキシが使用する特定の API エンドポイントのドキュメントについては、Go プロキシ API ドキュメントを参照してください。

Go プロキシを有効にします。

GitLab 用の Go プロキシは開発中のもので、大規模リポジトリでのパフォーマンスにイシューが発生する可能性があるため、本番環境での使用にはまだ対応していません。

機能フラグの後ろにデプロイされており、_デフォルトでは無効になって_います。

GitLab RailsコンソールにアクセスできるGitLab管理者は、インスタンスでこれを有効にすることができます。

有効にするには:

Feature.enable(:go_proxy) # or

無効化するには:

Feature.disable(:go_proxy)

特定のプロジェクトで有効または無効にします:

Feature.enable(:go_proxy, Project.find(1))
Feature.disable(:go_proxy, Project.find(2))
note
有効にしていても、GitLabはパッケージレジストリにGoモジュールを表示しません。詳しくはこのイシューに従ってください。

GitLab を Go プロキシとして追加します。

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 は依存関係をこの順序で取得します:

  1. Go はプロジェクト固有の Go プロキシから取得しようとします。
  2. Go はproxy.golang.org から取得しようとします。
  3. Goはバージョン管理システムのオペレーションで直接フェッチします(git clonesvn checkout など)。

GOPROXY 指定されていない場合、Go はステップ 2 と 3 に従います。これは GOPROXY https://proxy.golang.org,directGOPROXY 設定することに対応 GOPROXYします。GOPROXY にプロジェクト固有のエンドポイントだけが含まれている場合、Go はそのエンドポイントだけをクエリします。

Go 環境変数の設定方法の詳細については、環境変数の設定を参照してください。

GOPROXYの設定の詳細については、Go > Proxies の依存プロキシ管理を参照してください。

非公開プロジェクトからのモジュールの取得

go は、安全でない接続での認証情報の送信をサポートしていません。以下の手順は、GitLab が HTTPS 用に設定されている場合にのみ機能します:

  1. GitLab 用の Go プロキシから取得するときに HTTP 基本認証クレデンシャルを含めるように Go を設定します。
  2. 公開チェックサムデータベースから非公開 GitLab プロジェクトのチェックサムのダウンロードをスキップするように Go を設定します。

リクエスト認証の有効化

スコープをapi またはread_api に設定した個人アクセストークンを作成します。

~/.netrc ファイルを開き、以下のテキストを追加します。< > の変数をあなたの値に置き換えてください。

caution
NETRC という環境変数を使用する場合、Go はその値をファイル名として使用し、~/.netrc.NET は ~/.netrc無視します。GitLab CI~/.netrc使用する場合は ~/.netrcNETRC を環境変数名として使用しないでください。
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環境変数の設定の詳細については、環境変数の設定を参照してください。Go のこの機能を無効にする方法については、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/env (デフォルト) との間で Go 環境変数の読み書きを行います。

  • 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 タグをプッシュします。

有効なモジュールやモジュールのバージョンの構成について詳しくは、Go > Versioning の Dependency Managementを参照してください。