Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refetch only repositories with configs #7

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
20 changes: 13 additions & 7 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,19 +1,25 @@
name := """kind-sir"""

version := "0.2"
version := "0.3"

scalaVersion := "2.11.8"
scalaVersion := "2.12.10"

scalacOptions += "-feature"

libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-actor" % "2.4.4",
"com.typesafe.akka" %% "akka-testkit" % "2.4.4" % "test",
"org.scalatest" %% "scalatest" % "2.2.6" % "test",
"net.databinder.dispatch" %% "dispatch-core" % "0.11.2",
"org.json4s" %% "json4s-jackson" % "3.3.0",
"com.typesafe.akka" %% "akka-actor" % "2.6.1",
"com.typesafe.akka" %% "akka-testkit" % "2.6.1" % "test",
"org.scalatest" %% "scalatest" % "3.1.0" % "test",
"net.databinder.dispatch" %% "dispatch-core" % "0.13.4",
"org.json4s" %% "json4s-jackson" % "3.6.7",
"ch.qos.logback" % "logback-classic" % "1.1.3"
)

assemblyJarName in assembly := "kind_sir.jar"
assemblyOutputPath in assembly := new File("./kind_sir.jar")
assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x => MergeStrategy.first
}

fork in run := false
5 changes: 3 additions & 2 deletions src/main/scala/kindSir/actors/ConfigSupervisor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class ConfigSupervisor extends Actor with ActorLogging {
this.config.get.baseUrl,
this.config.get.token,
this.config.get.apiVersion,
groups map { g => GroupConfig(g.path) }))
groups map { g => GroupConfig(g.fullPath) }))
startGroupSupervisors()
case msg => log.error(s"Received unknown message: $msg")
}
Expand All @@ -45,7 +45,8 @@ class ConfigSupervisor extends Actor with ActorLogging {
}

def startGroupSupervisors() = this.config.get.groups map { g =>
context.actorOf(GroupSupervisor.props(g, gitlab.get), g.name)
val actorName = g.name.replace("/", "_")
context.actorOf(GroupSupervisor.props(g, gitlab.get), actorName)
}
}

Expand Down
4 changes: 1 addition & 3 deletions src/main/scala/kindSir/actors/GroupSupervisor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,7 @@ class GroupSupervisor(groupConfig: GroupConfig, gitlab: GitlabAPI) extends Actor
this.group = Some(g)
log.debug(s"Group set to: ${this.group}")
val actor = self
context.system.scheduler.schedule(0.seconds, 60.seconds) {
actor ! Start
}
actor ! Start
case Terminated(child) =>
log.debug(s"Child $child was terminated")
case msg =>
Expand Down
19 changes: 12 additions & 7 deletions src/main/scala/kindSir/actors/RepoWorker.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,14 @@ class RepoWorker(project: Project, gitlab: GitlabAPI) extends Actor with ActorLo

case SetConfig(conf) =>
config = Some(conf)

if (conf.ignoreBuildStatus.getOrElse(false))
fetchMergeRequests(conf)
else
fetchBuilds(project)
val system = ActorSystem("KindSir")
system.scheduler.scheduleWithFixedDelay(0.seconds, 60.seconds) { () =>
log.info(s"Processing ${project.name}")
if (conf.ignoreBuildStatus.getOrElse(false))
fetchMergeRequests(conf)
else
fetchBuilds(project)
}

case SetBuilds(builds) =>
latestBuilds = Some(builds)
Expand All @@ -44,8 +47,10 @@ class RepoWorker(project: Project, gitlab: GitlabAPI) extends Actor with ActorLo
acceptRequests(requests)

case Stop(reason) =>
log.info(s"Stopping because of: $reason")
context.stop(self)
if (reason.startsWith("No Config found")) {
log.info(s"Stopping because of: $reason")
context.stop(self)
}

case msg =>
log.error(s"Unknown message received: $msg")
Expand Down
42 changes: 22 additions & 20 deletions src/main/scala/kindSir/gitlab/GitlabAPI.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import kindSir.models._
import org.json4s._
import org.json4s.jackson.JsonMethods._
import scala.util.{Success, Try}
import java.net.URLEncoder

trait GitlabAPI {

Expand All @@ -32,8 +33,8 @@ case class Gitlab(baseUrl: String, token: String, apiVersion: Int) extends Gitla
}

def groups(): Future[List[Group]] = {
val all = api(s"/api/v${apiVersion}/groups/")
Http(all > as.String) map { str =>
val all = api(s"/api/v$apiVersion/groups/?per_page=100")
Http.default(all > as.String) map { str =>
parse(str) match {
case list@JArray(_) => Group.parseList(list).get
case _ => throw new RuntimeException("No groups found")
Expand All @@ -42,13 +43,14 @@ case class Gitlab(baseUrl: String, token: String, apiVersion: Int) extends Gitla
}

def group(groupName: String): Future[Group] = {
val groupsUrl = api(s"/api/v${apiVersion}/groups/$groupName")
Http(groupsUrl > as.String) map { string => Group.parse(parse(string)).get }
val groupNameEncoded = URLEncoder.encode(groupName, "UTF-8")
val groupsUrl = api(s"/api/v$apiVersion/groups/$groupNameEncoded")
Http.default(groupsUrl > as.String) map { string => Group.parse(parse(string)).get }
}

def projectConfig(project: Project): Future[ProjectConf] = {
val treeUrl = api(s"/api/v${apiVersion}/projects/${project.id}/repository/tree?per_page=1000")
Http(treeUrl > as.String) map { string =>
val treeUrl = api(s"/api/v$apiVersion/projects/${project.id}/repository/tree?per_page=1000")
Http.default(treeUrl > as.String) map { string =>
parse(string) match {
case list@JArray(_) => File.parseList(list).get
case _ => throw new RuntimeException("No projects found")
Expand All @@ -57,16 +59,16 @@ case class Gitlab(baseUrl: String, token: String, apiVersion: Int) extends Gitla
files.filter(_.name equalsIgnoreCase ".kind_sir.conf").head
} flatMap { file =>
val confUrl = apiVersion match {
case 1 | 2 | 3 => api(s"/api/v${apiVersion}/projects/${project.id}/repository/raw_blobs/${file.id}")
case _ => api(s"/api/v${apiVersion}/projects/${project.id}/repository/blobs/${file.id}/raw")
case 1 | 2 | 3 => api(s"/api/v$apiVersion/projects/${project.id}/repository/raw_blobs/${file.id}")
case _ => api(s"/api/v$apiVersion/projects/${project.id}/repository/blobs/${file.id}/raw")
}
Http(confUrl > as.String) map { str => ProjectConf.parse(parse(str)).get }
Http.default(confUrl > as.String) map { str => ProjectConf.parse(parse(str)).get }
}
}

def fetchMergeRequests(project: Project, page: Int = 1): Future[List[MergeRequest]] = {
val requestsUrl = api(s"/api/v${apiVersion}/projects/${project.id}/merge_requests?page=${page}&state=opened&per_page=100&wip=no")
Http(requestsUrl).flatMap { res =>
val requestsUrl = api(s"/api/v$apiVersion/projects/${project.id}/merge_requests?page=$page&state=opened&per_page=100&wip=no")
Http.default(requestsUrl).flatMap { res =>
(parse(res.getResponseBody), Try(res.getHeader("X-Next-Page").toInt)) match {
case (list@JArray(_), Success(nextPage)) =>
fetchMergeRequests(project, nextPage).map { nextPageRequests =>
Expand All @@ -80,19 +82,19 @@ case class Gitlab(baseUrl: String, token: String, apiVersion: Int) extends Gitla

def acceptMergeRequest(request: MergeRequest): Future[String] = {
val acceptUrl = apiVersion match {
case 1 | 2 | 3 => api(s"/api/v${apiVersion}/projects/${request.projectId}/merge_requests/${request.id}/merge?should_remove_source_branch=true").PUT
case _ => api(s"/api/v${apiVersion}/projects/${request.projectId}/merge_requests/${request.iid}/merge?should_remove_source_branch=true").PUT
case 1 | 2 | 3 => api(s"/api/v$apiVersion/projects/${request.projectId}/merge_requests/${request.id}/merge?should_remove_source_branch=true").PUT
case _ => api(s"/api/v$apiVersion/projects/${request.projectId}/merge_requests/${request.iid}/merge?should_remove_source_branch=true").PUT
}
Http(acceptUrl > as.String)
Http.default(acceptUrl > as.String)
}


def fetchLatestBuilds(projectId: Integer): Future[List[Build]] = {
val commitsUrl = apiVersion match {
case 1 | 2 | 3 => api(s"/api/v${apiVersion}/projects/$projectId/builds?scope=success")
case _ => api(s"/api/v${apiVersion}/projects/$projectId/jobs?scope=success")
case 1 | 2 | 3 => api(s"/api/v$apiVersion/projects/$projectId/builds?scope=success")
case _ => api(s"/api/v$apiVersion/projects/$projectId/jobs?scope=success")
}
Http(commitsUrl > as.String) map { str =>
Http.default(commitsUrl > as.String) map { str =>
parse(str) match {
case list@JArray(_) => Build.parseList(list).get
case _ => throw new RuntimeException(s"No build found for project $projectId")
Expand All @@ -102,10 +104,10 @@ case class Gitlab(baseUrl: String, token: String, apiVersion: Int) extends Gitla

def fetchCommitsFor(request: MergeRequest): Future[List[Commit]] = {
val commitsUrl = apiVersion match {
case 1 | 2 | 3 => api(s"/api/v${apiVersion}/projects/${request.projectId}/merge_requests/${request.id}/commits")
case _ => api(s"/api/v${apiVersion}/projects/${request.projectId}/merge_requests/${request.iid}/commits")
case 1 | 2 | 3 => api(s"/api/v$apiVersion/projects/${request.projectId}/merge_requests/${request.id}/commits")
case _ => api(s"/api/v$apiVersion/projects/${request.projectId}/merge_requests/${request.iid}/commits")
}
Http(commitsUrl > as.String) map { str =>
Http.default(commitsUrl > as.String) map { str =>
parse(str) match {
case list@JArray(_) => Commit.parseList(list).get
case _ => throw new RuntimeException(s"No commits found for merge request ${request.id}")
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/kindSir/models/Group.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package kindSir.models
import org.json4s._
import scala.util.Try

case class Group(id: Int, name: String, path: String, description: String, projects: List[Project])
case class Group(id: Int, name: String, fullPath: String, description: String, projects: List[Project])

object Group {
implicit val formats = DefaultFormats
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/kindSir/models/Project.scala
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package kindSir.models


case class Project(id: Int, name: String, defaultBranch: String)
case class Project(id: Int, name: String, defaultBranch: Option[String])