0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CodeArtifactはMaven Centralのプロキシにもなる、というAWSネイティブCI/CDの発見

0
Posted at

背景

CodeCommit・CodeBuild・CodeDeploy・CodePipeline(Code 4兄弟)とCodeArtifactを組み合わせて、GitHubに一切依存しない完全AWS内CI/CDパイプラインを構築するハンズオンをやりました。CodeArtifactが単なる社内ライブラリ置き場ではなく、Maven Central自体のプロキシとしても機能する点が発見でした。

1. CodeArtifactは社内ライブラリと外部ライブラリを同じリポジトリで扱う

mvn package
  └─ CodeArtifact (my-cp-libs)
       ├── 社内ライブラリ: com.example:common-utils:1.0.0  ← CodeBuildがpublish
       └── 外部ライブラリ: org.springframework.boot:*      ← Maven Centralから透過的に取得

社内で管理する共通ライブラリと、Spring BootなどのMaven Central上の外部ライブラリが、同じCodeArtifactリポジトリ経由で取得されます。外部依存関係も一度取得されるとCodeArtifact内にキャッシュされるため、2回目以降のビルドはインターネット接続なしでも再現性高く完了します。

2. buildspec.ymlはCodeArtifactの認証トークンを毎回取得する

pre_build:
  commands:
    - CODEARTIFACT_TOKEN=$(aws codeartifact get-authorization-token ...)
    - CODEARTIFACT_URL=$(aws codeartifact get-repository-endpoint ...)

CodeArtifactの認証トークンは12時間有効な一時トークンです。buildspec.ymlのpre_buildフェーズで毎回取得する設計になっているため、トークンの有効期限切れを人間が管理する必要がありません。次のビルド実行時に自動的に新しいトークンが取得されます。

3. pom.xmlにURLを直書きせず、実行時に-Dオプションで渡す

<!-- pom.xml: プレースホルダーのまま -->
<url>${codeartifact.url}</url>
# buildspec.yml: 実行時に値を注入
- mvn deploy -f common-lib/pom.xml -Dcodeartifact.url="$CODEARTIFACT_URL"
- mvn package -f app/pom.xml -DskipTests -Dcodeartifact.url="$CODEARTIFACT_URL"

CodeArtifactのリポジトリエンドポイントはアカウントやリージョンによって変わる動的な値のため、pom.xmlにハードコードせずプレースホルダーのままにしておき、buildspec.yml側から-Dcodeartifact.url=で実行時に注入します。pom.xmlを環境ごとに編集する必要がありません。

4. git-remote-codecommitでAWS CLI認証のままCodeCommitにpushする

pip install git-remote-codecommit
git clone codecommit::ap-northeast-1://my-cpapp %TEMP%\my-cpapp

CodeCommitへのpush用に別途Git認証情報を作る必要はありません。git-remote-codecommitをインストールするとcodecommit::というプレフィックス付きURLが使えるようになり、既存のAWS CLI認証情報がそのままGit操作に流用されます。認証プロンプトも一切出ません。

5. CodeArtifactのドメイン削除にはパッケージの事前削除が必要

aws codeartifact delete-package-versions --domain my-domain --repository my-libs --format maven --namespace com.example --package common-utils --versions 1.0.0
aws codeartifact delete-package --domain my-domain --repository my-libs --format maven --namespace com.example --package common-utils

CodeArtifactにパッケージが1つでも登録された状態だと、CloudFormationスタックの削除(ドメイン削除を含む)が失敗します。S3バケットを空にしてから削除するのと同様、CodeArtifactもパッケージバージョン→パッケージの順に手動削除してからスタック削除に進む必要があります。

まとめ

CodeArtifactが社内ライブラリの配布だけでなくMaven Centralのプロキシとしても機能する点と、git-remote-codecommitによるAWS CLI認証のままのGit操作が、このハンズオンでの大きな発見でした。GitHub Actionsを使う構成と比べ「すべてがAWS内で完結する」という設計思想を実際のコマンドで体感できます。

→ EC2 + CodePipeline(Code 3兄弟)で WebアプリをCI/CDデプロイする(ブログ)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?