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?

More than 1 year has passed since last update.

KINTO Technologies - トヨタ車のサブスク「KINTO」開発中!Advent Calendar 2021

Day 23

Gradleプラグインを使用して、AWS CodeArtifactを使いやすくする

Last updated at Posted at 2021-12-23

KINTO Technologies Advent Calendar 2021 - Qiita の23日目の記事です。

なぜCodeArtifactを使用するのか?

弊社のように、多くの企業は毎日内部使用のためにアーティファクトを生成しているため、インハウスのMavenレポジトリを用意する必要があります。いくつかの代替ソリューションを検討し、最終的にCodeArtifactを選択しました。これは主に、ほとんどのシステムがすでにAWSでホストされており、追加のメンテナンスが必要ないためです。

日常の使用上の問題は?

CodeArtifactでは、ユーザーはAWSクレデンシャルを使用して認証トークンを作成する必要があります。トークンの有効期間はわずか12時間であるため、ローカル環境とCI環境で手動で頻繁にトークンを取得することはプログラマーにとって厄介なことです。ほとんどのプロジェクトはGradleを使用しているため、CodeArtifactに対して自動的に認証され、必要なトークンを使用してリポジトリにアクセスできるプラグインを探しました。

プラグインの使い方は?

  • プラグインを使用する前に、AWS CLIがローカルにインストールされていることを確認してください。そして、次のコマンドを使用して、AWSクレデンシャルをローカルプロファイルに設定します。
    aws config --profile your-profile-name

  • 次に、上記のyour-profile-nameを環境変数CODEARTIFACT_PROFILEに設定します。

  • 次に、build.gradleに次のコンテンツを追加するだけです。

plugins {
  //Latest version on https://plugins.gradle.org/plugin/ai.clarity.codeartifact
  id 'ai.clarity.codeartifact' version '0.0.12' 
}

repositories {
  maven {
    //Your CodeArtifact repository's endpoint  
    url 'https://domain-id.d.codeartifact.eu-central-1.amazonaws.com/maven/repository/' 
  }
}

publishing {
  repositories {
    maven {
      //Your CodeArtifact repository's endpoint
      url 'https://domain-id.d.codeartifact.eu-central-1.amazonaws.com/maven/repository/' 
    }
  }
}

プラグインのソースコードは次から参照できます。
https://github.com/clarityai-eng/codeartifact-gradle-plugin

CodeArtifactからGradleカスタムプラグインを取るにはどうすればいいの?

AWS CodeArtifactリポジトリでホストされているGradleカスタムプラグインを使用する場合は、個別対応が必要です。 カスタムプラグインのMavenライブラリは通常、setting.gradlepluginManagementで設定されます。 Gradleによるプラグインの分析は他の依存関係よりもはるかに早く行われるため、上記のai.clarity.codeartifactプラグインをbuild.gradleに適用しても、pluginManagementでカスタムプラグインのMavenリポジトリ(CodeArtifact)を利用することはできません。

したがって、setting.gradleを解析する前に、トークンを取得して設定する必要があります。 次のコードをinit.gradleに追加したら、CodeArtifactのトークンを取得し、pluginManagementに設定することできます。
~/.gradle/init.gradle

initscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.amazonaws:aws-java-sdk-codeartifact:1.12.108'
    }
}


import com.amazonaws.services.codeartifact.AWSCodeArtifactClient;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.codeartifact.model.GetAuthorizationTokenRequest;
def setAuthorizationToken = {mavenArtifactRepository ->
    def profile = System.getenv("CODEARTIFACT_PROFILE")
    println "aws profile for codeartifact: [$profile]"
	def domainLevels = mavenArtifactRepository.url.getHost().split('\\.')
	def artifactDomain = domainLevels[0].substring(0,domainLevels[0].lastIndexOf("-"))
	def artifactOwner = domainLevels[0].substring(domainLevels[0].lastIndexOf("-")+1)
	def region = domainLevels[domainLevels.length -3]

	def client = AWSCodeArtifactClient.builder()
		.withCredentials(new ProfileCredentialsProvider(profile))
		.withRegion(region)
	.build();

	def result = client.getAuthorizationToken(new GetAuthorizationTokenRequest()
		.withDomain(artifactDomain)
		.withDomainOwner(artifactOwner)
	);

	mavenArtifactRepository.credentials {
		username "aws"
		password result.authorizationToken
	}
}

settingsEvaluated { settings ->
    settings.pluginManagement {
        repositories {
            maven {
                url = "https://domain-id.d.codeartifact.eu-central-1.amazonaws.com/maven/repository/"
                setAuthorizationToken(owner)
            }
        }
    }
}

プラグインを使用しなくてもいいの?

Gradleプラグインをまったく使用せずに、リポジトリが定義されているところに、AWSCLIの呼び出しを追加することもできます。 コードは次のとおりです。事前に環境変数にAWSプロファイルを設定しておく必要があります。

repositories {
  maven {
    //Your CodeArtifact repository's endpoint  
    url 'https://domain-id.d.codeartifact.eu-central-1.amazonaws.com/maven/repository/'
    credentials {
        def AWSCLI = "aws codeartifact get-authorization-token --domain domain-id --domain-owner owner-account-id --query authorizationToken --output text"
        def CODEARTIFACT_PROFILE = System.env.CODEARTIFACT_PROFILE
        username "aws"
        password CODEARTIFACT_PROFILE == null ?
                AWSCLI.execute().text :
                "$AWSCLI --profile $CODEARTIFACT_PROFILE".execute().text
    }
  }
}

当社では、トヨタ車のサブスク「KINTO」等の企画/開発を行っており、エンジニアを募集中です。
KINTO Technologies コーポレートサイト

参考

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?