🏄‍♂️

Github ActionsからCodeArtifactに公開する

2023/07/03に公開

社内限定で利用できる共有のパッケージを公開する運用を楽にするために、公開のフローを自動化することがあると思います。
GithubActionから共有のリポジトリの公開するならGitHub Package Registryを選択することが多いかと思いますが、CodeArtifactを利用する機会があったので、その時のワークフローを紹介したいと思います。
現時点ではかなりミニマムな状態での実装となりますので、参考にしていただける場合はそれぞれの運用に沿って編集していただけると幸いです。

ワークフローの紹介

https://github.com/tongari07/code-artifact-sample/blob/main/.github/workflows/publish.yml

バージョンを自動で更新

修正を行った時に手動でpackages.jsonのversionを更新してもいいですが、それだと更新忘れとかもあるので、GithubActions上で自動でバージョンが上がっていくようにしてみました。
ここでは npm version minor コマンドを利用して、現在の状態からマイナーバージョンを1あげるコミットを作成し、pushするようにしました。

- name: Bump version and push changes
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  run: |
    git config --local user.email "action@github.com"
    git config --local user.name "GitHub Action"
    npm version minor -m "Bump version to %s"
    git push

このままだとgit pushの時点で403エラーが発生してしまいますので、Github Actionからのpushを許可するためにGithub Actionsのパーミッションを Read and write permissions に変更します。

Code and automation > Actions > General > Workflow permissions

Workflow permissions

AWS CodeArtifactにログイン

AWS CLIを使ってCodeArtifactにログインします。

まずAWS CLIのセットアップを行います。
AWSから提供されているaws-actions/configure-aws-credentials@v1を使うと認証の設定等が楽です。
AWS_ACCESS_KEY_IDとAWS_ACCESS_KEY_IDはGithub上でActions secrets and variablesで事前に設定しておきます。(ここら辺の説明は省きますので、ドキュメントを読んでください。)

- name: Set up AWS CLI
  uses: aws-actions/configure-aws-credentials@v1
  with:
    aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
    aws-secret-access-key: ${{ secrets.AWS_ACCESS_KEY_ID }}
    aws-region: ap-northeast-1

残念ながらCodeArtifact用のアクションは用意されていないため、普通にコマンドを実行してログインします。
--domain-ownerにはAWSのアカウントIDを指定するので、認証情報と同じくSecretsに設定するといいと思います。

- name: Login to AWS CodeArtifact
  run: |
    aws codeartifact login --tool npm --repository <リポジトリ名> --domain <ドメイン名> --domain-owner ${{ secrets.AWS_ACCOUNT_ID }} --region <リージョン>

これでmainにpushされる度にマイナーバージョンが1つ上がった状態で自動でCodeArtifactにpublishされるようになりました!!

(おまけ)今後取り組みたいこと

とりあえずミニマムで自動公開されるようにはなりましたが、まだ色々と取り組みたい課題があるのでここに記載しておきます。
今後対応が出来次第更新していきたいなと思っています。

Branch Protectionの設定

mainブランチへの直接のpush等を制限したい時にBranch Protectionを設定すると思いますが、そうするとGithub Actionsからのバージョンアップのコミットのpushもできなくなってしまいます。
バージョンの自動更新とCodeArtifactへの公開のフローを分けて、一度バージョンアップのPRを作ってそれをmergeしたら公開されようにしたり、TagとReleaseを使ったりする必要があるのかなとなんとなく思っていますが、まだ試せていません。
何か知見がある方がいましたら、コメントいただけると幸いです。

メジャー、マイナー、パッチの切り替え

現時点ではマイナーバージョンを1ずつ上げることしかできないので、バージョンの管理としてはイマイチだと思います。上記にも書いたように、TagとReleaseの機能を使ったりして適したバージョン管理をしたいなと思っています。

新しいバージョンの通知

現時点ではパッケージのバージョンが上がったら、利用しているリポジトリ内それぞれで手動でバージョンを上げてpushする必要があります。各リポジトリでrenovateやdependabot等を利用している場合でも、AWS CodeArtifactのトークンを取得しないとバージョンが上がったことを検知できないようなので、認証エラーが発生してしまいうまくいきませんでした。
なんとか別の方法でバージョンが上がったら自動でPRを立てる みたいなことができたらいいなと思っています。

GitHubで編集を提案

Discussion