CodePipelineこんにちは!松田です!寒暖差についていけておりませんでしたが、いよいよ風邪をひきました。複数のレポジトリから単一のビルド成果物を得たい(コンテナイメージなど)場合、ビルド環境からどうやってそれぞれのレポジトリにアクセスすれば良いかについてまとめます。Codeシリーズを利用して、CI/CDパイプラインの設計/実装を行いました。そのパイプラインにて、2つのレポジトリからそれぞれでビルド処理などを行い、1つのコンテナイメージにする必要がありました。雑ですが、以下の図がやりたいことのイメージです。1つのレポジトリからビルドなどを行って、それを1つのコンテナイメージにして、ECRにプッシュして.....というパイプラインは今までいくつも作ってきました。イメージの元になるレポジトリが2つというパイプライン構成は、今回が初めてでした。以下のようなステージ、アクション構成にしました。buildなどを行います。buildspec.ymlを作成していたところ、「あれ?それぞれのレポジトリのファイルってどのパスにあるんだ?」という疑問が生まれました。結論から申し上げますが、ビルド環境の環境変数を利用すれば良いです。ドキュメント(ユーザーガイド)に記載されています。ドキュメントをきちんと読む前に、独自に確認してしまいました。その確認の過程についても記載いたします。パイプライン構成(詳細)もう少しだけパイプライン構成について補足します。パイプライン全体のステージとアクション構成は以下の通りです。(本記事ではAWSリソースに対する操作はマネジメントコンソールから行っています)Sourceステージのアクションは2つあり、それぞれ別のCodeCommitレポジトリに紐づいている形です。1つ目のレポジトリはバックエンドのコードを管理するレポジトリです。ここでは出力アーティファクトを「backend」と定義しています。2つ目のレポジトリはフロントエンドのコードを管理するレポジトリです。ここでは出力アーティファクトを「frontend」と定義しています。Buildアクションでは入力アーティファクトを「backend」と「frontend」としています。これによりビルド環境からSourceアクションで指定した各レポジトリにアクセス可能になります。PrimarySourceというパラメータがあり、これを「backend」としています。確認してみたパイプラインを実装したのでbuildspec.ymlを作成していましたが、「あれ?ビルド環境のカレントディレクトリってどこになるんだ?」や「それぞれのレポジトリのパスってどこだ?」という疑問が出てきました。そこでbuildspec.ymlに調査用コマンドを埋め込み、実行して確認しました。シンプルに現在のカレントディレクトリを確認しました。lspwdコマンドの実行結果は以下の通りでした。pwd/codebuild/output/src1981/src/s3/00s3ディレクトリ内の最初の通し番のディレクトリがカレントディレクトリになっているようです。lsコマンドで中身を確認しましたが、backendのレポジトリでした。カレントディレクトリはbackendレポジトリのルートのようです。BuildアクションのPrimarySourceに指定した入力アーティファクトに紐づいていると思われます。次に以下のコマンドを実行しました。01s3ディレクトリ配下には00と01の2つのディレクトリがあるようです。00はbackendのディレクトリで、01はfrontendのディレクトリであることが確認できました。確認できたことをまとめるとカレントディレクトリはPrimarySourceに指定したアーティファクトに紐づくBuildアクションで指定した入力アーティファクトは/codebuild/output/src1981/src/s3/配下に00からはじまるディレクトリとして置かれていく「/codebuild/output/src1981/src/s3/00」と「/codebuild/output/src1981/src/s3/01」がbackendとfrontendのレポジトリに該当するパスになるため、このパスを直接利用すればいいのか?と考えましたが、src1981という一意じゃなさそうな値が含まれているパスを直接利用するのは困難だと思いました。相対パスを指定するのもイマイチだなと思い、ここでようやくドキュメントをちゃんと読むことにしました。fileを配置するソースとのことです。このことから、ビルド環境のカレントディレクトリはこのソースのルートになるで間違いないと考えられます。sample.https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.htmlCODEBUILD_SRC_DIRという環境変数に、ソースのディレクトリパスが定義されている。2つ目以降のソースのディレクトリパスはCODEBUILD_SRC_DIR_(入力アーティファクト名)という環境変数に定義される。試しにbuildspec.ymlにてenvコマンドを仕込んで確認してみました。CODEBUILD_SRCCODEBUILD_SRC_DIR=/codebuild/output/src3799/src/s3/00CODEBUILD_SRC_DIR_frontend=/codebuild/output/src3799/src/s3/00ありますね!そのため、この変数を利用してそれぞれのレポジトリにアクセスすれば良さそうです!(srcXXXXの通し番号はやはり一意ではなく、ビルドの実行ごとに採番されるようです)結論ビルド環境においてソース(レポジトリ)のパスは環境変数CODEBUILD_SRC_DIRもしくはCODEBUILD_SRC_DIR_(入力アーティファクト名)に定義されている最初からオフィシャルなドキュメントを読もう今年の目標はドキュメントドリブンの徹底です。啓佑が書いた記事xfacebookはてなブックマークpocketお客様のご要望に柔軟に対応いたします。お気軽にご相談ください。cloudpackは、アイレット株式会社が提供するクラウド支援サービスです。問い合わせまでトータルサポート!お問い合わせはこちらアイレットでは、様々な職種で一緒に働ける仲間を募集しています。インフラエンジニア、開発エンジニア、クリエイティブ職、営業職など、様々な職種で一緒に働ける仲間を募集しています。アイレット公式サイト採用情報をご覧ください。採用情報プライバシーポリシークラウド導入のご相談、お見積り、サービスについてのご質問などお気軽にお問い合わせください。最新情報が得られるメルマガ登録はこちら。