Golangはじめて物語(第4話: ローカルリポジトリで共通モジュール管理編)


はじめに

Golangシリーズ4回目。
過去の3回はこちら。

さて、Golangの公開ライブラリは import で GitHub から持ってくるのが一般的だが、開発をしていると当然「共通のモジュールを作らないといけないけど、GitHubには社内規約上ソース置いちゃいけないし……」と悩むことが出てくる。色々とツッコみたくなるかもしれないが、出てくると言ったら出てくるのである。

Javaであれば、CodeArtifactとかを使ってローカルリポジトリをAWSに任せることもできるが、Golangには対応していない。というか対応する必要がない。Golangであれば、CodeCommitをそのまま使えば良いのである。

共通モジュール側

CodeCommitで以下のようなディレクトリ構成のモジュールを作る。
今回は、簡単な標準出力するだけのオレオレロガーを作ってみよう。

.
├── mylogger
│   ├── go.mod
│   └── mylogger.go
└── README.md
mylogger.go
package mylogger

import (
    "log"
)

func OutputLog(str string) {
    log.Printf(str)
}
go.mod
module git-codecommit.[リージョン名].amazonaws.com/v1/repos/[リポジトリ名].git/mylogger

go 1.13

require (
)

ポイントは、module のリポジトリ名の後ろに .git を付けておくことだ。
これを忘れると上手く動かない。

呼び出し側

呼び出し側では、以下のように import をする。

main.goなど
import (
    "git-codecommit.[リージョン名].amazonaws.com/v1/repos/[リポジトリ名].git/mylogger"
)

go.mod を使っていれば、ビルド時に

go.mod
require (
    git-codecommit.[リージョン名].amazonaws.com/v1/repos/[リポジトリ名].git/mylogger v0.0.0-20201011112107-e103759ebd6b
)

な感じで良い感じにバージョンを埋めてくれる。
※もちろん、必要に応じてバージョン指定する。

ビルド時は

$ export GOPRIVATE=git-codecommit.[リージョン名].amazonaws.com,direct

としておこう。こうしないと、プライベートリポジトリをうまく見に行ってくれなくてビルドが失敗する。

CodePipeline(CodeBuild)に組み込む場合

これも基本はローカルビルドと変わらない。

Buildspecの環境変数で、プライベートリポジトリを設定してあげる。

buildspec.yml(抜粋)
env:
  variables:
    GOPRIVATE: git-codecommit.[リージョン名].amazonaws.com,direct

また、CodeBuildではCodeCommitに対してIAMロールで認証をするので、pre-build で以下の設定をしておこう。

buildspec.yml(抜粋)
  pre_build:
    commands:
      - git config --global credential.helper '!aws codecommit credential-helper $@'
      - git config --global credential.UseHttpPath true

CodePipelineを使う場合、ソースコードの取得はCodePipeline側で行ってS3バケットに格納したものをCodeBuildに連携してくるため、通常はCodeCommitにアクセスする権限は不要だが、この方法を使う場合は、CodeBuildが直接CodeCommitを見に行くため、Readアクセス権が必要になる。CodeBuildのサービスロールに AWSCodeCommitReadOnly 相当の権限を付与しておこう(絞ろうと思えばもっと絞れると思うが、力尽きた……)

余談ではあるが、CodeBuildのローカルキャッシュを扱う場合、Go言語の場合はデフォルトでは以下のパスになるので設定しておくと良い。

buildspec.yml(抜粋)
cache:
  paths:
    - '/go/pkg/mod/**/*'

これで、共通ライブラリも制約なく自由に作れるようになったぞ!