Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions Scripts/buildAndRun.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,11 @@ then
docker run -it \
-e port="8080" \
-e slackToken="SLACKTOKEN" \
-e circleCiTokens="CIRCLECITOKENS" \
-e circleCiTokens="token1@token2" \
-e circleCiPersonalApiToken="personalToken" \
-e circleCiVcs="github" \
-e circleCiProjects="4dmotion-ios@cci" \
-e circleCiCompany="CIRCLECICOMPANY" \
-e circleCiCompany="imindeu" \
-e githubSecret="GITHUBSECRET" \
-e githubAppId="GITHUBAPPID" \
-e githubPrivateKey="GITHUBPRIVATEKEY" \
Expand Down
53 changes: 50 additions & 3 deletions Sources/App/Services/CircleCi+Services.swift
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ extension CircleCi {

enum Config: String, Configuration {
case tokens = "circleCiTokens"
case personalApiToken = "circleCiPersonalApiToken"
case company = "circleCiCompany"
case vcs = "circleCiVcs"
case projects = "circleCiProjects"
Expand Down Expand Up @@ -88,6 +89,10 @@ protocol CircleCiJob: TokenRequestable {
-> Either<Slack.Response, CircleCiJob>
}

protocol CircleCiJobv2: CircleCiJob {

}

extension CircleCiJob {
var buildParameters: [String: String] {
return [
Expand Down Expand Up @@ -121,6 +126,36 @@ extension CircleCiJob {
}
}

struct TestJobDescriptor: Encodable {
var branch: String
var CCI_OPTIONS: String
var parameters: [String: Bool]
}

extension CircleCiJobv2 {
var method: HTTPMethod? { return .POST }

var body: Data? {
return try? JSONEncoder().encode(
TestJobDescriptor(branch: branch,
CCI_OPTIONS: options.joined(separator: " "),
parameters: ["run_parallel_test_workflow" : true])
)
}

func url(token: String) -> URL? {
return URL(string: "https://circleci.com/"
+ CircleCi.pathv2(project))
}

func headers(token: String) -> [(String, String)] {
return [
("Circle-Token", token),
("Content-Type", "application/json")
]
}
}

enum CircleCiJobKind: String, CaseIterable {
case deploy
case test
Expand All @@ -140,7 +175,7 @@ private extension CircleCiJobKind {
}
}

struct CircleCiTestJob: CircleCiJob, Equatable {
struct CircleCiTestJob: CircleCiJobv2, Equatable {
let name: String = CircleCiJobKind.test.rawValue
let project: String
let branch: String
Expand Down Expand Up @@ -390,7 +425,13 @@ extension CircleCi {
let company = Environment.get(JobRequest.Config.company)!
return "/api/v1.1/project/\(vcs)/\(company)/\(project)/tree/\(branch)"
}


static var pathv2: (String) -> String = { project in
let vcs = Environment.get(JobRequest.Config.vcs)!
let company = Environment.get(JobRequest.Config.company)!
return "/api/v2/project/\(vcs)/\(company)/\(project)/pipeline"
}

static var helpResponse: Slack.Response {
let text = "Help:\n- `/cci command [help]`\n" +
"Current command\n" +
Expand Down Expand Up @@ -474,10 +515,16 @@ extension CircleCi {
do {
let projects: [String] = Environment.getArray(JobRequest.Config.projects)
let circleCiTokens = Environment.getArray(JobRequest.Config.tokens)
let circleCiPersonalApiToken = Environment.get(JobRequest.Config.personalApiToken)
guard let index = projects.index(of: jobRequest.job.project) else {
throw Error.noProject(jobRequest.job.project)
}
let circleciToken = circleCiTokens[index]
let isTestJob = jobRequest.job as? CircleCiTestJob != nil
var circleciToken = circleCiTokens[index]

if isTestJob, let circleCiPersonalApiToken = circleCiPersonalApiToken {
circleciToken = circleCiPersonalApiToken
}

return try Service.fetch(jobRequest.job, Response.self, circleciToken, context, Environment.api, isDebugMode: Environment.isDebugMode())
.map { response in
Expand Down