組み込み manager のキャプチャルールを確認する
manager custom.regex
を有効化すると、Renovate に処理をさせる上で必要なパッケージ依存関係の情報(packageFileName
: パッケージファイルのパス、packageName
: パッケージ名、currentVersion: 現在のバージョン、 datasource
, depName
etc.)の独自のキャプチャルールを設定できる。
しかし、Renovate 組み込みの manager については、その具体的な設定がリファレンスに記述されていない。
組み込みの manager のキャプチャルールを知るためには、実装コードを読むしかない(と思われる)。
各 manager 固有の実装コードは、
GitHub のリポジトリ renovatebot/renovate の
lib/modules/manager/<manager 名>/
以下に配置するルールになっているようである。
manager terraform
のキャプチャルール
manager terraform
については、リファレンス に記述がある。
- terraform ブロックの
required_version
- terraform ブロックの
required_providers
…その他もろもろが対象になる雰囲気はある。
しかし、具体的なキャプチャルールを知ることはできない。
そこで、ソースコードを確認すると、例えばteraform.required_version
のキャプチャルールは、以下の仕様になっているようだ。
-
currentValue
: .tf 内の terraform ブロックの required_version の値 -
depType
: 'required_version' -
datasource
: 'github-releases' -
depName
: 'hashicorp/terraform' -
extractVersion
: 'v(?.*)' -
versioning
: 'hashicorp'
確認の起点としたソースコードは、renovate/lib/modules/manager/terraform/extractors/terraform-block/terraform-version.ts。
(コメントつけてみた)
export class TerraformVersionExtractor extends DependencyExtractor {
getCheckList(): string[] {
return ['required_version'];
}
// ranovate/lib/modules/manager/terraform/hcl/types.ts より
//
// export interface TerraformDefinitionFile {
// terraform?: TerraformBlock[];
// module?: Record<string, TerraformModule[]>;
// resource?: TerraformResources;
// provider?: Record<string, TerraformProvider[]>;
// }
//
// export interface TerraformBlock {
// required_providers?: TerraformRequiredProviderBlock[];
// required_version?: string;
// }
//
// export interface TerraformRequiredProviderBlock {
// [s: string]: TerraformRequiredProvider | string;
// }
//
// export interface TerraformRequiredProvider {
// source?: string;
// version?: string;
// }
extract(hclRoot: TerraformDefinitionFile): PackageDependency[] {
// 各 .tf 内の terraform.required_version と terraform.required_providers.xxx.source,
// terraform.required_providers.xxx.version がわたされる
const terraformBlocks = hclRoot?.terraform;
if (is.nullOrUndefined(terraformBlocks)) {
return [];
}
const dependencies = [];
for (const terraformBlock of terraformBlocks) {
const requiredVersion = terraformBlock.required_version;
if (is.nullOrUndefined(requiredVersion)) {
continue;
}
// - currentValue: .tf 内の terraform ブロックの required_version の値
// - depType: 'required_version'
// - datasource: 'github-releases'
// - depName: 'hashicorp/terraform'
// - extractVersion: 'v(?<version>.*)'
// - versioning: 'hashicorp'
dependencies.push(
this.analyseTerraformVersion({
currentValue: requiredVersion,
}),
);
}
return dependencies;
}
...
// - depType: 'required_version'
// - datasource: 'github-releases'
// - depName: 'hashicorp/terraform'
// - extractVersion: 'v(?<version>.*)'
// - versioning: 'hashicorp'
protected analyseTerraformVersion(dep: PackageDependency): PackageDependency {
dep.depType = 'required_version';
dep.datasource = GithubReleasesDatasource.id;
dep.depName = 'hashicorp/terraform';
dep.extractVersion = 'v(?<version>.*)$';
dep.versioning = hashicorp.id;
return dep;
}
}