diff --git a/lib/src/toridori_grinder_tasks.dart b/lib/src/toridori_grinder_tasks.dart index 638762e..3c2f5ad 100644 --- a/lib/src/toridori_grinder_tasks.dart +++ b/lib/src/toridori_grinder_tasks.dart @@ -2,17 +2,24 @@ import 'dart:io'; import 'package:github/github.dart'; import 'package:grinder/grinder.dart'; +import 'package:http/http.dart' as http; import 'package:yaml/yaml.dart'; void addAllTasks({ required String repositoryOwner, required String repositoryName, + required String gitUserEmail, + required String gitUserName, }) { addFormatTask(); addReleaseTask( repositoryOwner: repositoryOwner, repositoryName: repositoryName, ); + addOnReleasePrMergedTask( + gitUserEmail: gitUserEmail, + gitUserName: gitUserName, + ); } void addFormatTask() { @@ -61,6 +68,28 @@ void addReleaseTask({ ); } +void addOnReleasePrMergedTask({ + required String gitUserEmail, + required String gitUserName, +}) { + addTask( + GrinderTask( + 'on-release-pr-merged', + description: 'Release PRがマージされたときのタスク', + taskFunction: () async { + run('git', + arguments: ['config', '--local', 'user.email', '"$gitUserEmail"']); + run('git', + arguments: ['config', '--local', 'user.name', '"$gitUserName"']); + _tag(); + log('tagを打ちました'); + await closeMilestone(); + log('milestoneをcloseしました'); + }, + ), + ); +} + /// バージョン更新 String _incrementVersion() { final args = context.invocation.arguments; @@ -115,3 +144,36 @@ String _format() { return result; } + +// Github Actions側でmasterをチェックアウトする前提 +void _tag() { + final pubspecFile = File('./pubspec.yaml'); + final pubspecString = pubspecFile.readAsStringSync(); + + final pubspec = loadYaml(pubspecString); + final version = pubspec['version'] as String; + + // 現在のバージョンでタグを打つ + run('git', arguments: ['tag', version]); + // リモートに反映 + run('git', arguments: ['push', 'origin', version]); +} + +// milestoneをcloseする +Future closeMilestone() async { + final envVars = Platform.environment; + final githubToken = envVars['GITHUB_TOKEN']; + final repository = envVars['REPO']; + final milestoneNumber = envVars['MILESTONE_NUMBER']; + final result = await http.patch( + Uri.parse( + 'https://api.github.com/repos/$repository/milestones/$milestoneNumber'), + headers: { + 'Authorization': 'token $githubToken', + 'Accept': 'application/vnd.github.v3+json', + }, + body: '{"state":"closed"}', + ); + log(result.statusCode.toString()); + log(result.body); +} diff --git a/pubspec.yaml b/pubspec.yaml index 5808e94..45801f0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,6 +9,7 @@ environment: dependencies: github: ^9.9.0 grinder: ^0.9.3 + http: ^0.13.5 yaml: ^3.1.1 dev_dependencies: