はじめに
Golangシリーズ4回目。
過去の3回はこちら。
- Golangはじめて物語(APIGateway+Lambdaといっしょ編)
- Golangはじめて物語(第2話: Gin+ECS+Fargateといっしょ編)
- Golangはじめて物語(第3話: CodePipeline+SAM+LambdaでCI/CD編)
さて、Golangの公開ライブラリは import
で GitHub から持ってくるのが一般的だが、開発をしていると当然「共通のモジュールを作らないといけないけど、GitHubには社内規約上ソース置いちゃいけないし……」と悩むことが出てくる。色々とツッコみたくなるかもしれないが、出てくると言ったら出てくるのである。
Javaであれば、CodeArtifactとかを使ってローカルリポジトリをAWSに任せることもできるが、Golangには対応していない。というか対応する必要がない。Golangであれば、CodeCommitをそのまま使えば良いのである。
共通モジュール側
CodeCommitで以下のようなディレクトリ構成のモジュールを作る。
今回は、簡単な標準出力するだけのオレオレロガーを作ってみよう。
.
├── mylogger
│ ├── go.mod
│ └── mylogger.go
└── README.md
package mylogger
import (
"log"
)
func OutputLog(str string) {
log.Printf(str)
}
module git-codecommit.[リージョン名].amazonaws.com/v1/repos/[リポジトリ名].git/mylogger
go 1.13
require (
)
ポイントは、module
のリポジトリ名の後ろに .git
を付けておくことだ。
これを忘れると上手く動かない。
呼び出し側
呼び出し側では、以下のように import
をする。
import (
"git-codecommit.[リージョン名].amazonaws.com/v1/repos/[リポジトリ名].git/mylogger"
)
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の環境変数で、プライベートリポジトリを設定してあげる。
env:
variables:
GOPRIVATE: git-codecommit.[リージョン名].amazonaws.com,direct
また、CodeBuildではCodeCommitに対してIAMロールで認証をするので、pre-build
で以下の設定をしておこう。
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言語の場合はデフォルトでは以下のパスになるので設定しておくと良い。
cache:
paths:
- '/go/pkg/mod/**/*'
これで、共通ライブラリも制約なく自由に作れるようになったぞ!