forked from SPC/spc-site
Another attempt on deploy
This commit is contained in:
parent
a5121b8637
commit
696ca38efe
45
.space.kts
45
.space.kts
@ -1,29 +1,15 @@
|
|||||||
import circlet.pipelines.script.put
|
|
||||||
|
|
||||||
job("Deploy") {
|
job("Deploy") {
|
||||||
startOn {
|
startOn {
|
||||||
gitPush { enabled = false }
|
gitPush { enabled = false }
|
||||||
}
|
}
|
||||||
|
|
||||||
container(image = "openjdk:11") {
|
container(image = "mipt-npm.registry.jetbrains.space/p/mipt-npm/containers/kotlin-ci:1.0.2") {
|
||||||
|
env["SPC_HOST"] = Params("spc-host")
|
||||||
|
env["SPC_USER"] = Secrets("spc-webmaster.key-user")
|
||||||
|
env["SPC_ID"] = Secrets("spc-webmaster.key-id")
|
||||||
kotlinScript { api ->
|
kotlinScript { api ->
|
||||||
api.gradlew("installDist")
|
api.gradlew("uploadDistribution")
|
||||||
api.fileShare().put(java.io.File("build/install"))
|
api.gradlew("reloadDistribution")
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
container(image = "openjdk:11") {
|
|
||||||
env["HOST"] = Params("spc-host")
|
|
||||||
env["USER"] = Secrets("spc-webmaster-user")
|
|
||||||
env["ID"] = Secrets("spc-webmaster-id")
|
|
||||||
|
|
||||||
shellScript {
|
|
||||||
interpreter = "/bin/bash"
|
|
||||||
content = """
|
|
||||||
echo ${'$'}ID > id.key
|
|
||||||
chmod 400 id.key
|
|
||||||
scp -r -i id.key /mnt/space/share/spc-site/ "${'$'}USER@${'$'}HOST:/opt"
|
|
||||||
""".trimIndent()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -32,20 +18,13 @@ job("Restart service"){
|
|||||||
startOn {
|
startOn {
|
||||||
gitPush { enabled = false }
|
gitPush { enabled = false }
|
||||||
}
|
}
|
||||||
|
|
||||||
container(image = "openjdk:11") {
|
|
||||||
env["HOST"] = Params("spc-host")
|
|
||||||
env["USER"] = Secrets("spc-webmaster-user")
|
|
||||||
env["ID"] = Secrets("spc-webmaster-id")
|
|
||||||
|
|
||||||
shellScript {
|
container(image = "mipt-npm.registry.jetbrains.space/p/mipt-npm/containers/kotlin-ci:1.0.2") {
|
||||||
interpreter = "/bin/bash"
|
env["SPC_HOST"] = Params("spc-host")
|
||||||
content = """
|
env["SPC_USER"] = Secrets("spc-webmaster.key-user")
|
||||||
echo ${'$'}ID > id_ed25519
|
env["SPC_ID"] = Secrets("spc-webmaster.key-id")
|
||||||
chmod 400 id_ed25519
|
kotlinScript { api ->
|
||||||
echo "$(cat id_ed25519)"
|
api.gradlew("reloadDistribution")
|
||||||
ssh -i id_ed25519 -o StrictHostKeyChecking=no -o HostKeyAlgorithms=ssh-ed25519 -t "${'$'}USER@${'$'}HOST" "systemctl restart sciprog-site"
|
|
||||||
""".trimIndent()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -68,6 +68,32 @@ val writeBuildDate: Task by tasks.creating {
|
|||||||
outputs.upToDateWhen { false }
|
outputs.upToDateWhen { false }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//write build time in build to check outdated external data directory
|
//write build time in build to check outdated external data directory
|
||||||
tasks.getByName("processResources").dependsOn(writeBuildDate)
|
tasks.getByName("processResources").dependsOn(writeBuildDate)
|
||||||
|
|
||||||
|
/* Upload with JSch */
|
||||||
|
|
||||||
|
val host = System.getProperty("SPC_HOST")
|
||||||
|
val user = System.getProperty("SPC_USER")
|
||||||
|
val identity = System.getProperty("SPC_ID")
|
||||||
|
|
||||||
|
if (host != null && user != null && identity != null) {
|
||||||
|
val uploadDistribution by tasks.creating {
|
||||||
|
group = "distribution"
|
||||||
|
dependsOn("installDist")
|
||||||
|
doLast {
|
||||||
|
sshUploadDirectory(buildDir.resolve("install"), host, user, "/opt") {
|
||||||
|
addIdentity("spc-webmaster.key", identity.encodeToByteArray(), null, null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val reloadDistribution by tasks.creating {
|
||||||
|
group = "distribution"
|
||||||
|
doLast {
|
||||||
|
sshExecute(host, user, "sudo systemctl restart sciprog-site") {
|
||||||
|
addIdentity("spc-webmaster", identity.encodeToByteArray(), null, null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
12
buildSrc/build.gradle.kts
Normal file
12
buildSrc/build.gradle.kts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
plugins{
|
||||||
|
`kotlin-dsl`
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories{
|
||||||
|
mavenCentral()
|
||||||
|
gradlePluginPortal()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies{
|
||||||
|
implementation("com.github.mwiede:jsch:0.2.1")
|
||||||
|
}
|
7
buildSrc/settings.gradle.kts
Normal file
7
buildSrc/settings.gradle.kts
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
dependencyResolutionManagement {
|
||||||
|
repositories {
|
||||||
|
maven("https://repo.kotlin.link")
|
||||||
|
mavenCentral()
|
||||||
|
gradlePluginPortal()
|
||||||
|
}
|
||||||
|
}
|
42
buildSrc/src/main/kotlin/execute.kt
Normal file
42
buildSrc/src/main/kotlin/execute.kt
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
import com.jcraft.jsch.ChannelExec
|
||||||
|
import com.jcraft.jsch.JSch
|
||||||
|
import com.jcraft.jsch.Session
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
|
fun JSch.execute(
|
||||||
|
host: String,
|
||||||
|
user: String,
|
||||||
|
command: String,
|
||||||
|
port: Int = 22,
|
||||||
|
): String {
|
||||||
|
var session: Session? = null
|
||||||
|
var channel: ChannelExec? = null
|
||||||
|
try {
|
||||||
|
session = getSession(user, host, port)
|
||||||
|
|
||||||
|
val config = Properties()
|
||||||
|
config["StrictHostKeyChecking"] = "no"
|
||||||
|
session.setConfig(config)
|
||||||
|
session.connect()
|
||||||
|
channel = session.openChannel("exec") as ChannelExec
|
||||||
|
channel.setCommand(command)
|
||||||
|
channel.inputStream = null
|
||||||
|
channel.setErrStream(System.err)
|
||||||
|
val input = channel.inputStream
|
||||||
|
channel.connect()
|
||||||
|
return input.use { it.readAllBytes().decodeToString() }
|
||||||
|
} finally {
|
||||||
|
channel?.disconnect()
|
||||||
|
session?.disconnect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun sshExecute(
|
||||||
|
host: String,
|
||||||
|
user: String,
|
||||||
|
command: String,
|
||||||
|
port: Int = 22,
|
||||||
|
shellConfig: JSch.() -> Unit,
|
||||||
|
): String = JSch().apply(shellConfig).execute(host, user, command, port)
|
80
buildSrc/src/main/kotlin/uploads.kt
Normal file
80
buildSrc/src/main/kotlin/uploads.kt
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
import com.jcraft.jsch.ChannelSftp
|
||||||
|
import com.jcraft.jsch.JSch
|
||||||
|
import com.jcraft.jsch.Session
|
||||||
|
import com.jcraft.jsch.SftpATTRS
|
||||||
|
import java.io.File
|
||||||
|
import java.io.FileInputStream
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* https://kodehelp.com/java-program-uploading-folder-content-recursively-from-local-to-sftp-server/
|
||||||
|
*/
|
||||||
|
private fun ChannelSftp.recursiveFolderUpload(sourceFile: File, destinationPath: String) {
|
||||||
|
if (sourceFile.isFile) {
|
||||||
|
// copy if it is a file
|
||||||
|
cd(destinationPath)
|
||||||
|
if (!sourceFile.name.startsWith(".")) put(
|
||||||
|
FileInputStream(sourceFile),
|
||||||
|
sourceFile.getName(),
|
||||||
|
ChannelSftp.OVERWRITE
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
val files = sourceFile.listFiles()
|
||||||
|
if (files != null && !sourceFile.getName().startsWith(".")) {
|
||||||
|
cd(destinationPath)
|
||||||
|
var attrs: SftpATTRS? = null
|
||||||
|
// check if the directory is already existing
|
||||||
|
try {
|
||||||
|
attrs = stat(destinationPath + "/" + sourceFile.getName())
|
||||||
|
} catch (e: Exception) {
|
||||||
|
println(destinationPath + "/" + sourceFile.getName() + " not found")
|
||||||
|
}
|
||||||
|
// else create a directory
|
||||||
|
if (attrs != null) {
|
||||||
|
println("Directory exists IsDir=" + attrs.isDir())
|
||||||
|
} else {
|
||||||
|
println("Creating dir " + sourceFile.getName())
|
||||||
|
mkdir(sourceFile.getName())
|
||||||
|
}
|
||||||
|
for (f in files) {
|
||||||
|
recursiveFolderUpload(f, destinationPath + "/" + sourceFile.getName())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun JSch.uploadDirectory(
|
||||||
|
file: File,
|
||||||
|
host: String,
|
||||||
|
user: String,
|
||||||
|
targetDirectory: String,
|
||||||
|
port: Int = 22,
|
||||||
|
) {
|
||||||
|
var session: Session? = null
|
||||||
|
var channel: ChannelSftp? = null
|
||||||
|
try {
|
||||||
|
session = getSession(user, host, port)
|
||||||
|
|
||||||
|
val config = Properties()
|
||||||
|
config["StrictHostKeyChecking"] = "no"
|
||||||
|
session.setConfig(config)
|
||||||
|
session.connect() // Create SFTP Session
|
||||||
|
channel = session.openChannel("sftp") as ChannelSftp // Open SFTP Channel
|
||||||
|
channel.connect()
|
||||||
|
channel.cd(targetDirectory) // Change Directory on SFTP Server
|
||||||
|
channel.recursiveFolderUpload(file, targetDirectory)
|
||||||
|
} finally {
|
||||||
|
channel?.disconnect()
|
||||||
|
session?.disconnect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun sshUploadDirectory(
|
||||||
|
file: File,
|
||||||
|
host: String,
|
||||||
|
user: String,
|
||||||
|
targetDirectory: String,
|
||||||
|
port: Int = 22,
|
||||||
|
shellConfig: JSch.() -> Unit,
|
||||||
|
) = JSch().apply(shellConfig).uploadDirectory(file, host, user, targetDirectory, port)
|
@ -300,7 +300,6 @@ context(PageContext) private fun HTML.spcHome() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
internal fun Application.spcHome(context: Context, rootPath: Path, prefix: String = "") {
|
internal fun Application.spcHome(context: Context, rootPath: Path, prefix: String = "") {
|
||||||
|
|
||||||
val snark = context.fetch(SnarkPlugin)
|
val snark = context.fetch(SnarkPlugin)
|
||||||
|
Loading…
Reference in New Issue
Block a user