Compare commits

..

No commits in common. 'd649e6842cbd9021824255b1c9de274be7453868' and '83836d13f61099d1da9806854df7900204199975' have entirely different histories.

@ -0,0 +1,31 @@
kind: pipeline
type: docker
name: Deployment
trigger:
branch:
- production
- dev
steps:
- name: 'Unit Tests'
image: ubuntu:latest
commands:
- apt update && apt install openjdk-11-jdk -y
- ./gradlew :test
- name: deploy to server
image: ubuntu:latest
depends_on:
- 'Unit Tests'
environment:
SSH_PRIVATE_KEY:
from_secret: ???
SSH_PUBLIC_KEY:
from_secret: ???
USER:
from_secret: ???
IP:
from_secret: ???
commands:
- drone/deliver.sh $DRONE_BRANCH

@ -11,7 +11,7 @@ import zio.http.model.Status
import scala.collection.mutable
class Endpoint(port: Int) extends ZIOAppDefault {
class Endpoint(hostname: String, port: Int) extends ZIOAppDefault {
private val handlers = mutable.HashMap.empty[String, APIRequestHandler]
@ -46,7 +46,7 @@ class Endpoint(port: Int) extends ZIOAppDefault {
val configLayer = ServerConfig.live(config)
Server.install(app).flatMap { port =>
LOG.info(s"Listening API entries on $port")
LOG.info(s"Listening API entries on $hostname:$port")
ZIO.never
}.provide(configLayer, Server.live)
}

@ -4,7 +4,7 @@ plugins {
id 'scala'
id 'application' //for 'run' task
id 'com.adarshr.test-logger' version '3.2.0' //fancy prints during tests
id 'com.github.johnrengelman.shadow' version '7.1.2' //for building optimised jar
id 'com.github.johnrengelman.shadow' version '7.1.2' //for optimised jar
}
final var scalaVersion = "2.13"

@ -1,30 +0,0 @@
kind: pipeline
type: docker
name: Deployment
steps:
- name: Unit tests
image: amazoncorretto:11
volumes:
- name: build
path: ./build
commands:
- echo
- ./gradlew :test
- name: Deploy
image: amazoncorretto:11
depends_on:
- 'Unit tests'
environment:
SSH_PRIVATE_KEY:
from_secret: SSH_PRIVATE
SSH_PUBLIC_KEY:
from_secret: SSH_PUBLIC
volumes:
- name: build
path: ./build
commands:
- chmod 777 drone/deliver.sh
- drone/deliver.sh

@ -1,10 +1,12 @@
#!/usr/bin/env bash
chmod 700 ./drone/prepare-deliver.sh
source ./drone/prepare-deliver.sh
apt update && apt install openjdk-11-jdk sftp -y
./gradlew :shadowJar
PATH="$PATH:."
echo "making delivery onto '$USER@$IP:$DIR/backend'"
scp -o "StrictHostKeyChecking no" "build/libs/server-all.jar" "drone/deploy.sh" "drone/start.sh" "$USER@$IP:$DIR/backend"
echo "chmod 700 $DIR/backend/*; $DIR/backend/deploy.sh" | ssh -o "StrictHostKeyChecking no" $USER@$IP
gradlew :shadowJar
mkdir -p ~/.ssh
echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
echo "$SSH_PUBLIC_KEY" > ~/.ssh/id_rsa.pub
sftp "$USER@$IP:tbasket/" <<< $'put build/libs/server-all.jar drone/deploy.sh'

@ -1,38 +1,19 @@
#!/usr/bin/env bash
DIR=$(readlink -e "$(dirname "$0")")
PROD_SERVER_JAR_NAME="server-prod.jar"
NEW_SERVER_JAR_NAME="server-all.jar"
prod_pid() {
ps -aux | tr -s " " | grep -E "\bjava -jar .*$PROD_SERVER_JAR_NAME\b" | cut -d " " -f2
}
SERVER_JAR_NAME="server-all.jar"
PROD_PID=$(prod_pid)
OLD_PID=$(ps -aux | grep "-jar $SERVER_JAR_NAME" | tr -s " " | cut -d " " -f2)
#if $PROD_PID is not empty but isn't a number, something went wrong
if [ "$PROD_PID" ] && ! echo "$PROD_PID" | grep -E -q "^[0-9]+$"; then
echo "error, unable to retrieve old server pid: $PROD_PID" >&2
#if $OLD_PID is not empty but isn't a number, something went wrong
if [ "$OLD_PID" ] && ! grep -E -q "^[0-9]+$"; then
echo "error, unable to retrieve old server pid: $OLD_PID" >&2
exit 2
fi
if [ "$PROD_PID" ]; then
if [ "$OLD_PID" ]; then
#will cause the old server to gracefully shutdown
echo "shutting down old server version ..."
kill "$PROD_PID"
while [ ! "$(prod_pid)" ]; do sleep 1; done #sleep until process ends
echo "server shut down"
fi
rm "$DIR/$PROD_SERVER_JAR_NAME"
mv "$DIR/$NEW_SERVER_JAR_NAME" "$DIR/$PROD_SERVER_JAR_NAME" || ls
SCREEN="basket"
# create screen if not exists
if ! screen -ls | grep -q -E "\b[0-9]+\.$SCREEN\b"; then
screen -S "$SCREEN" -d -m
kill SIGQUIT "$OLD_PID"
wait "$OLD_PID"
fi
screen -d -r "$SCREEN" -X stuff $"$DIR/start.sh\n"
echo "server is started into $SCREEN screen."

@ -1,45 +0,0 @@
#!/usr/bin/env bash
echo "installing packages..."
#use the right command to install packages
if [ "$(command -v apt)" ]; then
apt update > /dev/null
apt -y install openssh-client openssh-clients > /dev/null
elif [ "$(command -v yum)" ]; then
yum update > /dev/null
yum -y install openssh-client openssh-clients > /dev/null
elif [ "$(command -v apk)" ]; then
apk update > /dev/null
apk add openssh > /dev/null
else
echo "could not find a package manager, aborting" >&2
exit 1
fi
echo "done."
mkdir /root/.ssh
echo "$SSH_PRIVATE_KEY" > /root/.ssh/id_rsa
echo "$SSH_PUBLIC_KEY" > /root/.ssh/id_rsa.pub
chmod 0600 /root/.ssh/*
chmod 700 /root/.ssh
case "$DRONE_BRANCH" in
"dev")
USER=maxime
IP=92.132.18.192
DIR=server/TBasket/
;;
"production")
USER=palafour
IP=193.49.118.205
DIR=public_html/TBasket/
;;
"")
echo "DRONE_BRANCH is missing" >&2
exit 1
;;
*)
echo "branch $1 is unable to perform delivery, authorized branches are 'dev and production' for delivery." >&2
echo "delivery step skipped"
exit 0
esac

@ -1,3 +0,0 @@
DIR=$(readlink -e "$(dirname "$0")")
echo "starting server"
java -jar "$DIR/server-prod.jar"

@ -1,39 +0,0 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
AQIDBA==
-----END OPENSSH PRIVATE KEY-----

@ -1 +0,0 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDUvSkSfa1FWZ7PQ2XMTjm59z6rR6Kz/lvSj6W8jOy6HGTcAWnQGn8MTCepOeh98wvHsZALj0ueAOb2AW7vinbeu21o24otLKruRYU/lmzMN0fFKhvOm8XLvmKzlkOn/BQMNVCR53Qhdb4HL7fBo6dcDeR24ptsaAydRjOMApOQ0q1m9EMmc2FZfvJdGoUEwn8m4KBFZpqpqaxEz+5EyL+jmwDuWrZx9e+pVzjsNI6j4TAWV03LzThveK3kBMOVHH+QzdaT2gxN9Sy5RvICLt2/gfD6Cd79bDHBGiFhmu/q3NiifHSx1RWJ+QScBp0oqUdHe6TRHEYd0knRkwaqGvB2dcidXXSZySmaLqOCZZTvV1O72F4Mbu/vv1mG9E3QbjEFJ7Bun6Lxl1eEy9ZhrAIJdFDN3n8GvAxGQEZdSnK3Fi9ADwueUZiCkebgo0CPaFFwLDv7nsyWhLsnm/u8nXQHiqWJVm3WvPUSCXH2vHcYjEv/Lct0yniYIv9rPDmoacs= palafour@iMac-de-Pascal.local.isima.fr

@ -1 +1 @@
endpoint.port=48485
endpoint.url=localhost:48485

@ -1,30 +1,32 @@
package org.tbasket
import org.tbasket.api.Endpoint
import org.tbasket.handler.IncrementHandler
import org.tbasket.compute.IncrementHandler
import java.util.Properties
object EndpointSetup {
final val EndpointPort = "endpoint.port"
final val EndpointPortDefault = "48485"
final val EndpointUrl = "endpoint.url"
final val EndpointUrlDefault = s"localhost:48485"
def setupEndpoint(config: Properties): Endpoint = {
def setupEndpoint(): Endpoint = {
Main.LOG.debug("Initializing API endpoint...")
val endpoint = createEndpoint(config)
val endpoint = createEndpoint()
endpoint.bind("counter")(IncrementHandler)
endpoint
}
private def createEndpoint(config: Properties): Endpoint = {
val port = config
.getProperty(EndpointPort, EndpointPortDefault) match {
case s"$port" if port.toIntOption.isDefined => port.toInt
case v =>
throw new InternalBasketServerException(s"$EndpointPort property value is wrong: $v must be integer")
private def createEndpoint(): Endpoint = {
val properties = new Properties()
val in = getClass.getClassLoader.getResourceAsStream("server.properties")
properties.load(in)
val (hostname, port) = properties
.getProperty(EndpointUrl, EndpointUrlDefault) match {
case s"$ip:$port" => (ip, port.toInt)
case v => throw new InternalBasketServerException(s"$EndpointUrl property value is wrong: $v must be <ip>:<port>/[endpointPath]")
}
new Endpoint(port)
new Endpoint(hostname, port)
}
}

@ -5,8 +5,6 @@ import org.apache.logging.log4j.LogManager
import zio._
import java.lang
import java.nio.file.{Files, Path}
import java.util.Properties
import scala.io.StdIn
import scala.util.control.NonFatal
@ -15,19 +13,8 @@ object Main {
def main(args: Array[String]): Unit = {
LOG.info("Starting server")
val config = retrieveConfig
db(config)
api(config)
LOG.info("Server successfully started")
}
private def db(config: Properties): Unit = new Thread({ () =>
}, "Database").start()
//TODO
private def api(config: Properties): Unit = new Thread({ () =>
val endpoint = EndpointSetup.setupEndpoint(config)
val runtime = Runtime.default
val endpoint = EndpointSetup.setupEndpoint()
val runtime = Runtime.default
Unsafe.unsafe { implicit u =>
runtime.unsafe.run(endpoint.run).catchSome {
case NonFatal(e) =>
@ -35,18 +22,9 @@ object Main {
throw e
}
}
}: Runnable, "API").start()
private def retrieveConfig: Properties = {
val configFile = Path.of("server.properties")
if (Files.notExists(configFile)) {
val in = getClass.getResourceAsStream("/server.properties")
Files.writeString(configFile, new String(in.readAllBytes()))
}
val in = Files.newInputStream(configFile)
val properties = new Properties()
properties.load(in)
properties
LOG.info("Server successfully started")
println("enter to exit")
StdIn.readLine()
}
//add a shutdown hook to log when the server is about to get killed

@ -0,0 +1,21 @@
package org.tbasket.compute
import org.tbasket.api.compute.APIRequestHandler
import zio.http.{Request, Response}
object IncrementHandler extends APIRequestHandler {
@volatile private var i = 0
def getCounter: Int = i
override def get(request: Request): Response = {
Response.json(s"{\"value\": $i}")
}
override def post(request: Request): Response = {
i += 1
println(s"Counter is now $i")
Response.ok
}
}

@ -1,23 +0,0 @@
package org.tbasket.handler
import org.tbasket.api.compute.APIRequestHandler
import zio.http.{Request, Response}
import java.util.concurrent.atomic.AtomicInteger
object IncrementHandler extends APIRequestHandler {
private val counter = new AtomicInteger(0)
def getCounter: Int = counter.get()
override def get(request: Request): Response = {
Response.json(s"{\"value\": ${counter.get()}}")
}
override def post(request: Request): Response = {
val i = counter.incrementAndGet()
println(s"(thread ${Thread.currentThread()}) Counter incremented : $i")
Response.ok
}
}

@ -2,7 +2,7 @@ package org.tbasket.test
import io.circe.parser._
import org.junit.jupiter.api.{Assertions, Test}
import org.tbasket.handler.IncrementHandler
import org.tbasket.compute.IncrementHandler
import zio.http.model.Status
import zio.http.{Body, Path, Request, URL}
@ -18,8 +18,6 @@ class IncrementRequestHandler {
Assertions.assertEquals(last + 1, IncrementHandler.getCounter)
}
@Test
def testGetIncrement(): Unit = {
val counter = IncrementHandler.getCounter