From f1a2b6708d025be26a00d154de4626b66338d4a0 Mon Sep 17 00:00:00 2001 From: 417-72KI <417.72ki@gmail.com> Date: Tue, 27 Jun 2023 01:20:17 +0900 Subject: [PATCH 1/5] create extension --- DangerfileExtensions/OctoKit+Extension.swift | 114 +++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 DangerfileExtensions/OctoKit+Extension.swift diff --git a/DangerfileExtensions/OctoKit+Extension.swift b/DangerfileExtensions/OctoKit+Extension.swift new file mode 100644 index 00000000..09000899 --- /dev/null +++ b/DangerfileExtensions/OctoKit+Extension.swift @@ -0,0 +1,114 @@ +import Danger +import OctoKit +import RequestKit + +extension Octokit { + @discardableResult + func postReview(owner: String, + repository: String, + pullRequestNumber: Int, + commitId: String? = nil, + event: Review.Event, + body: String? = nil, + comments: [Review.Comment] = []) async throws -> Review { + let router = ReviewRouter.postReview(configuration, owner, repository, pullRequestNumber, commitId, event, body, comments) + return try await router.load(dateDecodingStrategy: .formatted(Time.rfc3339DateFormatter), expectedResultType: Review.self) + } +} + + +// MARK: - +extension Review { + enum Event: String, Codable { + case approve = "APPROVE" + case requestChanges = "REQUEST_CHANGES" + case comment = "COMMENT" + case pending = "PENDING" + } + + struct Comment: Codable { + var path: String + var position: Int? + var body: String + var line: Int? + var side: String? + var startLine: Int? + var startSide: String? + } +} + +extension Review.Comment { + enum CodingKeys: String, CodingKey { + case path + case position + case body + case line + case side + case startLine = "start_line" + case startSide = "start_side" + } +} + +// MARK: - +private enum ReviewRouter { + case postReview(Configuration, String, String, Int, String?, Review.Event?, String?, [Review.Comment]?) +} + +extension ReviewRouter: JSONPostRouter { + var method: HTTPMethod { .POST } + var encoding: HTTPEncoding { .json } + var configuration: Configuration { + switch self { + case let .postReview(config, _, _, _, _, _, _, _): + return config + } + } + + var params: [String : Any] { + switch self { + case let .postReview(_, _, _, _, commitId, event, body, comments): + var parameters = [String: Any]() + if let commitId = commitId { + parameters["commit_id"] = commitId + } + if let event = event { + parameters["event"] = event.rawValue + } + if let body = body { + parameters["body"] = body + } + if let comments = comments { + parameters["comments"] = comments.map { comment -> [String: Any] in + var parameters: [String: Any] = [ + "path": comment.path, + "body": comment.body + ] + if let position = comment.position { + parameters["position"] = position + } + if let line = comment.line { + parameters["line"] = line + } + if let side = comment.side { + parameters["side"] = side + } + if let startLine = comment.startLine { + parameters["start_line"] = startLine + } + if let startSide = comment.startSide { + parameters["start_side"] = startSide + } + return parameters + } + } + return parameters + } + } + + var path: String { + switch self { + case let .postReview(_, owner, repository, pullRequestNumber, _, _, _, _): + return "repos/\(owner)/\(repository)/pulls/\(pullRequestNumber)/reviews" + } + } +} From 0d3bbb7383c1ecdfa4b2cf033b66dee1d4cf462f Mon Sep 17 00:00:00 2001 From: 417-72KI <417.72ki@gmail.com> Date: Tue, 27 Jun 2023 01:22:49 +0900 Subject: [PATCH 2/5] add approve in Dangerfile --- Dangerfile.swift | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Dangerfile.swift b/Dangerfile.swift index dec2970e..3d6db22a 100644 --- a/Dangerfile.swift +++ b/Dangerfile.swift @@ -3,6 +3,7 @@ import Danger let danger = Danger() // fileImport: DangerfileExtensions/Git+Extension.swift +// fileImport: DangerfileExtensions/OctoKit+Extension.swift SwiftLint.lint(inline: true) @@ -25,3 +26,20 @@ if danger.git.modifiedFiles.contains("LICENSE") { if danger.git.deletedFiles.contains("LICENSE") { danger.fail("Do not delete LICENSE !!") } + +if (danger.warnings + danger.fails).isEmpty, + let github = danger.github { + do { + let repo = github.pullRequest.base.repo + let pullRequestNumber = github.pullRequest.number + + let review = try await github.api.postReview(owner: repo.owner.login, + repository: repo.name, + pullRequestNumber: pullRequestNumber, + event: .approve) + print(review) + } catch { + print(error) + danger.fail(error.localizedDescription) + } +} From c73daac9eb7d350ff44fe3596b0f4f7e41801666 Mon Sep 17 00:00:00 2001 From: 417-72KI <417.72ki@gmail.com> Date: Tue, 27 Jun 2023 01:30:46 +0900 Subject: [PATCH 3/5] autocorrect --- Dangerfile.swift | 12 +++++++----- DangerfileExtensions/OctoKit+Extension.swift | 20 +++++++++++--------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Dangerfile.swift b/Dangerfile.swift index 3d6db22a..bf15ac16 100644 --- a/Dangerfile.swift +++ b/Dangerfile.swift @@ -32,11 +32,13 @@ if (danger.warnings + danger.fails).isEmpty, do { let repo = github.pullRequest.base.repo let pullRequestNumber = github.pullRequest.number - - let review = try await github.api.postReview(owner: repo.owner.login, - repository: repo.name, - pullRequestNumber: pullRequestNumber, - event: .approve) + + let review = try await github.api.postReview( + owner: repo.owner.login, + repository: repo.name, + pullRequestNumber: pullRequestNumber, + event: .approve + ) print(review) } catch { print(error) diff --git a/DangerfileExtensions/OctoKit+Extension.swift b/DangerfileExtensions/OctoKit+Extension.swift index 09000899..4a372bb2 100644 --- a/DangerfileExtensions/OctoKit+Extension.swift +++ b/DangerfileExtensions/OctoKit+Extension.swift @@ -4,19 +4,20 @@ import RequestKit extension Octokit { @discardableResult - func postReview(owner: String, - repository: String, - pullRequestNumber: Int, - commitId: String? = nil, - event: Review.Event, - body: String? = nil, - comments: [Review.Comment] = []) async throws -> Review { + func postReview( + owner: String, + repository: String, + pullRequestNumber: Int, + commitId: String? = nil, + event: Review.Event, + body: String? = nil, + comments: [Review.Comment] = [] + ) async throws -> Review { let router = ReviewRouter.postReview(configuration, owner, repository, pullRequestNumber, commitId, event, body, comments) return try await router.load(dateDecodingStrategy: .formatted(Time.rfc3339DateFormatter), expectedResultType: Review.self) } } - // MARK: - extension Review { enum Event: String, Codable { @@ -51,6 +52,7 @@ extension Review.Comment { // MARK: - private enum ReviewRouter { + // swiftlint:disable:next enum_case_associated_values_count discouraged_optional_collection case postReview(Configuration, String, String, Int, String?, Review.Event?, String?, [Review.Comment]?) } @@ -64,7 +66,7 @@ extension ReviewRouter: JSONPostRouter { } } - var params: [String : Any] { + var params: [String: Any] { switch self { case let .postReview(_, _, _, _, commitId, event, body, comments): var parameters = [String: Any]() From 027df5d076479fd099df8e343be74493650bbef3 Mon Sep 17 00:00:00 2001 From: 417-72KI <417.72ki@gmail.com> Date: Tue, 27 Jun 2023 01:44:21 +0900 Subject: [PATCH 4/5] debug --- Dangerfile.swift | 5 +++-- DangerfileExtensions/OctoKit+Extension.swift | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Dangerfile.swift b/Dangerfile.swift index bf15ac16..c58e1218 100644 --- a/Dangerfile.swift +++ b/Dangerfile.swift @@ -5,7 +5,7 @@ let danger = Danger() // fileImport: DangerfileExtensions/Git+Extension.swift // fileImport: DangerfileExtensions/OctoKit+Extension.swift -SwiftLint.lint(inline: true) +// SwiftLint.lint(inline: true) // Make it more obvious that a PR is a work in progress and shouldn't be merged yet if let github = danger.github { @@ -32,7 +32,7 @@ if (danger.warnings + danger.fails).isEmpty, do { let repo = github.pullRequest.base.repo let pullRequestNumber = github.pullRequest.number - + let review = try await github.api.postReview( owner: repo.owner.login, repository: repo.name, @@ -43,5 +43,6 @@ if (danger.warnings + danger.fails).isEmpty, } catch { print(error) danger.fail(error.localizedDescription) + danger.fail("\(error)") } } diff --git a/DangerfileExtensions/OctoKit+Extension.swift b/DangerfileExtensions/OctoKit+Extension.swift index 4a372bb2..d1aa4925 100644 --- a/DangerfileExtensions/OctoKit+Extension.swift +++ b/DangerfileExtensions/OctoKit+Extension.swift @@ -14,6 +14,7 @@ extension Octokit { comments: [Review.Comment] = [] ) async throws -> Review { let router = ReviewRouter.postReview(configuration, owner, repository, pullRequestNumber, commitId, event, body, comments) + print(router) return try await router.load(dateDecodingStrategy: .formatted(Time.rfc3339DateFormatter), expectedResultType: Review.self) } } From e976ac4c90b64cdcfba0c52a6cf1936eb7c9b3a3 Mon Sep 17 00:00:00 2001 From: 417-72KI <417.72ki@gmail.com> Date: Fri, 30 Aug 2024 21:17:19 +0900 Subject: [PATCH 5/5] use app token instead of generic token --- .github/workflows/ci.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f882779c..001c788f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -107,8 +107,15 @@ jobs: if: ${{ !cancelled() }} runs-on: ubuntu-latest steps: + - uses: actions/create-github-app-token@v1 + id: app-token + with: + app-id: ${{ secrets.BOT_APP_ID }} + private-key: ${{ secrets.BOT_PRIVATE_KEY }} + - name: Set token to env + run: echo GH_TOKEN=${{ steps.app-token.outputs.token }} >> $GITHUB_ENV - uses: actions/checkout@v4 - name: Danger uses: 417-72KI/danger-swiftlint@v5.10 env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ env.GH_TOKEN }}