Skip to content

Commit 6583a9f

Browse files
authored
Merge pull request #31 from ios-osushi/support-github-authenticated-request
アクセストークンとともにリポジトリ情報を取得する
2 parents 99cae40 + 22eb0c2 commit 6583a9f

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

.github/workflows/scheduled.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
${{ runner.os }}-spm-
2727
- name: Run releaseSubscriptions
2828
run: |
29-
swift run -c release releaseSubscriptions --primary-slack-url ${{ secrets.SLACK_WEBHOOK_PRIMARY_URL }} --secondary-slack-url ${{ secrets.SLACK_WEBHOOK_SECONDARY_URL }}
29+
swift run -c release releaseSubscriptions --access-token ${{ secrets.RELEASE_SUBSCRIPTIONS_FINE_GRAINED_PAT }} --primary-slack-url ${{ secrets.SLACK_WEBHOOK_PRIMARY_URL }} --secondary-slack-url ${{ secrets.SLACK_WEBHOOK_SECONDARY_URL }}
3030
- name: Commit and push if needed
3131
run: |
3232
git config user.name github-actions[bot]

Sources/ReleaseSubscriptions/App.swift

+7-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import ReleaseSubscriptionsCore
1212

1313
@main
1414
struct App: AsyncParsableCommand {
15+
@Option(name: .shortAndLong, help: "GitHub Access Token to fetch repositories.")
16+
var accessToken: String?
17+
1518
@Option(name: .shortAndLong, help: "Slack Webhook URL (primary) to be notified of updates.", transform: URL.init(string:))
1619
var primarySlackURL: URL?
1720

@@ -24,6 +27,9 @@ struct App: AsyncParsableCommand {
2427
}
2528
Logger.app.info("ℹ️ \(#function) started")
2629
do {
30+
if accessToken == nil {
31+
Logger.app.info("🔔 accessToken is nil")
32+
}
2733
if primarySlackURL == nil {
2834
Logger.app.info("🔔 primarySlackURL is nil")
2935
}
@@ -32,7 +38,7 @@ struct App: AsyncParsableCommand {
3238
}
3339
let repositories = try Parser.parse()
3440
let oldContents = try FileHelper.load(repositories: repositories)
35-
let newContents = try await Fetcher.fetch(repositories: repositories)
41+
let newContents = try await Fetcher.fetch(repositories: repositories, accessToken: accessToken)
3642
let combinedContents = oldContents.merging(newContents) { ($0 + $1).identified().sorted() }
3743
let updatedContents = DifferenceComparator.insertions(repositories: repositories, old: oldContents, new: combinedContents)
3844
try await SlackNotifier.notify(to: slackURLs(), updates: updatedContents)

Sources/ReleaseSubscriptionsCore/Fetcher.swift

+27-9
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,34 @@ public struct Fetcher {
1818
return decoder
1919
}()
2020

21-
static func fetch(repository: GitHubRepository) async throws -> [Release] {
22-
Logger.shared.info("ℹ️ Fetching \(repository.apiURL)")
23-
let url = repository.apiURL
24-
let (data, _) = try await URLSession.shared.data(from: url)
25-
let releases = try decoder.decode([Release].self, from: data)
26-
Logger.shared.info("✅ Fetched \(repository.apiURL)")
27-
return releases
21+
static func fetch(repository: GitHubRepository, accessToken: String?) async throws -> [Release] {
22+
do {
23+
Logger.shared.info("ℹ️ Fetching \(repository.apiURL)")
24+
let url = repository.apiURL
25+
var request = URLRequest(url: url)
26+
request.setValue("application/vnd.github+json", forHTTPHeaderField: "Accept")
27+
request.setValue("2022-11-28", forHTTPHeaderField: "X-GitHub-Api-Version")
28+
if let accessToken {
29+
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
30+
Logger.shared.info("ℹ️ Set bearer token")
31+
}
32+
let (data, _) = try await URLSession.shared.data(for: request)
33+
do {
34+
Logger.shared.info("✅ Fetched \(repository.apiURL)")
35+
let releases = try decoder.decode([Release].self, from: data)
36+
Logger.shared.info("✅ Parsed \(repository.apiURL)")
37+
return releases
38+
} catch {
39+
Logger.shared.info("❌ Parse failed \(repository.apiURL), error: \(error), data: \(String(data: data, encoding: .utf8) ?? "nil")")
40+
throw error
41+
}
42+
} catch {
43+
Logger.shared.info("❌ Fetch failed \(repository.apiURL), error: \(error)")
44+
throw error
45+
}
2846
}
2947

30-
public static func fetch(repositories: [GitHubRepository]) async throws -> [GitHubRepository : [Release]] {
48+
public static func fetch(repositories: [GitHubRepository], accessToken: String?) async throws -> [GitHubRepository : [Release]] {
3149
defer {
3250
Logger.shared.info("🎉 \(#function) finished")
3351
}
@@ -36,7 +54,7 @@ public struct Fetcher {
3654
for repository in repositories {
3755
group.addTask {
3856
do {
39-
let releases = try await fetch(repository: repository)
57+
let releases = try await fetch(repository: repository, accessToken: accessToken)
4058
return (repository, releases)
4159
} catch {
4260
Logger.shared.error("\(#function) failed")

0 commit comments

Comments
 (0)