導入
Go言語の開発において、外部のモジュールをダウンロードする際、通常はGOPROXYなどを経由してインターネット上のソースコードを取得します。しかし、開発環境やCI/CDパイプラインにおいて「外部ネットワークに依存しない完全なクローズド環境」が求められるケースがあります。GOPROXY=offを設定することで、キャッシュのみを利用したビルドが可能になり、ネットワークエラーによるビルド失敗を防ぎ、再現性の高い開発環境を実現できます。
基礎知識
Goのモジュール管理システムは、デフォルトではプロキシサーバー(proxy.golang.orgなど)を通じてパッケージを取得します。GOPROXY環境変数は、Goがどのプロキシを利用するかを指定するものです。これを「off」に設定すると、Goコマンドはリモートのプロキシや直接のソースコード取得を一切試みなくなります。その結果、ローカルのGOMODCACHE(モジュールキャッシュ)のみを参照してビルドが完結するようになります。
実装/解決策
GOPROXY=offを利用するためには、事前に必要な依存パッケージがローカルのキャッシュに存在していることが前提条件となります。一般的な運用フローとしては、以下のステップを踏みます。
1. ネットワーク環境下で事前に go mod download を実行し、必要なライブラリをキャッシュに格納する。
2. ビルド時またはCI実行時に GOPROXY=off を環境変数として指定する。
3. これにより、外部通信を遮断した状態でも、キャッシュ内のソースを使ってビルドが行われる。
サンプルプログラム
以下のコマンドは、実際にオフラインモードでビルドを試みる際の例です。
事前に依存関係をすべてダウンロードしておく(オンライン環境)
go mod download
ネットワークを遮断、あるいはプロキシを無効化してビルドを実行
GOPROXY=off go build -o myapp main.go
正常にビルドできることを確認するためのGoコード例
package main
import (
“fmt”
“rsc.io/quote” // サードパーティパッケージの例
)
func main() {
// 外部ライブラリがキャッシュから読み込まれているか確認
fmt.Println(“オフラインビルド成功:”, quote.Hello())
}
応用・注意点
注意点として、GOPROXY=offを使用する際は「必要な依存関係がキャッシュに存在しない場合、ビルドが即座に失敗する」という点に注意してください。特に、新しいライブラリを追加した直後にオフライン環境でビルドしようとするとエラーになります。
現場での活用術としては、セキュリティが厳格な社内ネットワークや、外部通信が許可されていない隔離されたビルドパイプラインでの利用が推奨されます。また、依存パッケージのバージョンを完全に固定し、将来的にインターネット上のソースが削除された場合でもビルドが再現できるようにするための、長期的な資産管理手法としても非常に有効です。

コメント