From 1b72ddcb253ec62bb3c3cb7eca9990e9f73d7ea6 Mon Sep 17 00:00:00 2001 From: Ciznia Date: Tue, 28 Oct 2025 13:37:22 +0100 Subject: [PATCH 1/4] feat(jenkins): setup link project job --- infra/jenkins/job_dsl.groovy | 101 +++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/infra/jenkins/job_dsl.groovy b/infra/jenkins/job_dsl.groovy index 9e660a1..bc6d788 100644 --- a/infra/jenkins/job_dsl.groovy +++ b/infra/jenkins/job_dsl.groovy @@ -45,3 +45,104 @@ folder('Projects') { displayName(name) description('Available projects in whanos') } + +freeStyleJob('link-project') { + displayName('Link Project') + description('Links a repository to the Whanos infrastructure by creating a corresponding Jenkins project job.') + + parameters { + stringParam('PROJECT_NAME', '', 'Name of the project (e.g. my-app)') + stringParam('GIT_URL', '', 'Git repository URL to link') + stringParam('GIT_BRANCH', 'main', 'Branch to monitor (default: main)') + stringParam('ROOT_FOLDER', '', 'Root folder in the repository (if applicable)') + credentialsParam('GIT_CREDENTIALS_ID') { + description('Credentials ID for accessing the Git repository (if private)') + defaultValue('') + } + } + + steps { + shell(''' + #!/bin/bash + set -e + + rm -rf repo + git clone "$GIT_URL" repo + cd repo + git checkout "$GIT_BRANCH" + + echo "Detecting language..." + WHANOS_DIR=$(dirname "$0")/.. + if [ -n "$ROOT_FOLDER" ]; then + cd "$ROOT_FOLDER" + + fi + LANG_DETECTED=$($WHANOS_DIR/script/detect_language) + echo "Detected language: $LANG_DETECTED" + + if [[ "$LANG_DETECTED" == "Error:"* || "$LANG_DETECTED" == "Unknown" ]]; then + echo "Error: repository is not Whanos-compatible" + exit 1 + fi + + echo "$LANG_DETECTED" > $WHANOS_DIR/detected_language.txt + ''') + + systemGroovyCommand(''' + import javaposse.jobdsl.plugin.* + import jenkins.model.* + + def projectName = build.buildVariableResolver.resolve("PROJECT_NAME") + def gitUrl = build.buildVariableResolver.resolve("GIT_URL") + def language = new File("detected_language.txt").text.trim().toLowerCase() + def baseImage = "whanos-${language}" + + def dslScript = """ + folder('Projects') { + displayName('Projects') + description('Available projects in Whanos') + } + + freeStyleJob("Projects/${projectName}") { + displayName("${projectName}") + description("Linked project managed by Whanos") + + scm { + git { + remote { + url("${gitUrl}") + credentials('${build.buildVariableResolver.resolve("GIT_CREDENTIALS_ID")}') + } + branch('*/main') + } + } + + triggers { + scm('* * * * *') // every minute + } + + steps { + shell("echo Building ${projectName} using ${baseImage}") + shell("docker build -t ${projectName}:${language} --build-arg BASE_IMAGE=${baseImage} .") + shell('\'\'\' + #!/bin/bash + set -e + if [ -f whanos.yml ]; then + echo "Deploying \${projectName} to Kubernetes..." + kubectl apply -f whanos.yml + else + echo "No whanos.yml found, skipping deployment." + fi + \'\'\') + } + } + """ + + def dsl = new ExecuteDslScripts() + dsl.scriptText = dslScript + dsl.ignoreExisting = false + dsl.removeAction = javaposse.jobdsl.plugin.RemovedJobAction.IGNORE + dsl.run() + ''') + } +} From 3676224e4ca32efc8c0ecd0b388da2a5eefececd Mon Sep 17 00:00:00 2001 From: Sigmanificient Date: Tue, 28 Oct 2025 14:21:53 +0100 Subject: [PATCH 2/4] fix(docker): set context path to be repository root --- infra/jenkins/Dockerfile | 6 ++++-- infra/jenkins/docker-compose.yml | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/infra/jenkins/Dockerfile b/infra/jenkins/Dockerfile index c023da5..1554a3c 100644 --- a/infra/jenkins/Dockerfile +++ b/infra/jenkins/Dockerfile @@ -14,10 +14,12 @@ USER root RUN mkdir -p /var/jenkins_home && chown -R jenkins:jenkins /var/jenkins_home USER jenkins -COPY plugins.txt /usr/share/jenkins/ref/plugins.txt +COPY infra/jenkins/plugins.txt /usr/share/jenkins/ref/plugins.txt RUN jenkins-plugin-cli --plugin-file /usr/share/jenkins/ref/plugins.txt ENV CASC_JENKINS_CONFIG=/usr/share/jenkins/ref/jenkins.yaml +COPY script /usr/share/jenkins/ref/script + COPY --chown=jenkins:jenkins \ - ./job_dsl.groovy \ + ./infra/jenkins/job_dsl.groovy \ /usr/share/jenkins/ref/init.groovy.d/job_dsl.groovy diff --git a/infra/jenkins/docker-compose.yml b/infra/jenkins/docker-compose.yml index c7cce4c..d1b641e 100644 --- a/infra/jenkins/docker-compose.yml +++ b/infra/jenkins/docker-compose.yml @@ -1,6 +1,8 @@ services: jenkins: - build: . + build: + context: ../../ + dockerfile: infra/jenkins/Dockerfile container_name: jenkins ports: - "8080:8080" From 8a28f756bfa2f302bee4d4f69f227e9f4f9a69d3 Mon Sep 17 00:00:00 2001 From: Sigmanificient Date: Tue, 28 Oct 2025 14:22:17 +0100 Subject: [PATCH 3/4] fix(jenkins): correct language detection script --- infra/jenkins/job_dsl.groovy | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/infra/jenkins/job_dsl.groovy b/infra/jenkins/job_dsl.groovy index bc6d788..92ca262 100644 --- a/infra/jenkins/job_dsl.groovy +++ b/infra/jenkins/job_dsl.groovy @@ -72,19 +72,21 @@ freeStyleJob('link-project') { git checkout "$GIT_BRANCH" echo "Detecting language..." - WHANOS_DIR=$(dirname "$0")/.. + WHANOS_DIR=$PWD if [ -n "$ROOT_FOLDER" ]; then cd "$ROOT_FOLDER" fi - LANG_DETECTED=$($WHANOS_DIR/script/detect_language) - echo "Detected language: $LANG_DETECTED" - if [[ "$LANG_DETECTED" == "Error:"* || "$LANG_DETECTED" == "Unknown" ]]; then + LANG_DETECTED=$("$WHANOS_DIR/script/detect_language") + EXIT_CODE=$? + + if [ $EXIT_CODE -ne 0 ]; then echo "Error: repository is not Whanos-compatible" exit 1 fi + echo "Detected language: $LANG_DETECTED" echo "$LANG_DETECTED" > $WHANOS_DIR/detected_language.txt ''') From da4e0616c68530e7e03e112130ef9b42b068f42f Mon Sep 17 00:00:00 2001 From: Ciznia Date: Wed, 29 Oct 2025 16:46:15 +0100 Subject: [PATCH 4/4] refactor(jenkins): export job template to another file --- infra/jenkins/docker-compose.yml | 1 + infra/jenkins/jenkins.yaml | 6 +++ infra/jenkins/job_dsl.groovy | 64 ++++---------------------------- infra/jenkins/project_job.groovy | 48 ++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 56 deletions(-) create mode 100644 infra/jenkins/project_job.groovy diff --git a/infra/jenkins/docker-compose.yml b/infra/jenkins/docker-compose.yml index d1b641e..81aa8b2 100644 --- a/infra/jenkins/docker-compose.yml +++ b/infra/jenkins/docker-compose.yml @@ -10,6 +10,7 @@ services: volumes: - ./jenkins_home:/var/jenkins_home - ./jenkins.yaml:/var/jenkins_home/casc_configs/jenkins.yaml:ro + - ./../..:/workspace - /var/run/docker.sock:/var/run/docker.sock # Docker in docker - ../../images:/images environment: diff --git a/infra/jenkins/jenkins.yaml b/infra/jenkins/jenkins.yaml index ef661c6..88a7091 100644 --- a/infra/jenkins/jenkins.yaml +++ b/infra/jenkins/jenkins.yaml @@ -24,3 +24,9 @@ appearance: unclassified: location: url: http://localhost:8080/ + +security: + scriptApproval: + approvedScriptHashes: + - "SHA512:4221429e203439d7010910774f0ef107c56e054eb7001881a02852d108c03fb8d8470c15e2a6d27141b604075db9c09223a7e5c083478dcef770f84b733ceb2a" + forceSandbox: false diff --git a/infra/jenkins/job_dsl.groovy b/infra/jenkins/job_dsl.groovy index 92ca262..7c56b61 100644 --- a/infra/jenkins/job_dsl.groovy +++ b/infra/jenkins/job_dsl.groovy @@ -88,63 +88,15 @@ freeStyleJob('link-project') { echo "Detected language: $LANG_DETECTED" echo "$LANG_DETECTED" > $WHANOS_DIR/detected_language.txt - ''') - - systemGroovyCommand(''' - import javaposse.jobdsl.plugin.* - import jenkins.model.* - - def projectName = build.buildVariableResolver.resolve("PROJECT_NAME") - def gitUrl = build.buildVariableResolver.resolve("GIT_URL") - def language = new File("detected_language.txt").text.trim().toLowerCase() - def baseImage = "whanos-${language}" - - def dslScript = """ - folder('Projects') { - displayName('Projects') - description('Available projects in Whanos') - } - - freeStyleJob("Projects/${projectName}") { - displayName("${projectName}") - description("Linked project managed by Whanos") - - scm { - git { - remote { - url("${gitUrl}") - credentials('${build.buildVariableResolver.resolve("GIT_CREDENTIALS_ID")}') - } - branch('*/main') - } - } + export LANG_DETECTED=$(cat $WHANOS_DIR/detected_language.txt) - triggers { - scm('* * * * *') // every minute - } - - steps { - shell("echo Building ${projectName} using ${baseImage}") - shell("docker build -t ${projectName}:${language} --build-arg BASE_IMAGE=${baseImage} .") - shell('\'\'\' - #!/bin/bash - set -e - if [ -f whanos.yml ]; then - echo "Deploying \${projectName} to Kubernetes..." - kubectl apply -f whanos.yml - else - echo "No whanos.yml found, skipping deployment." - fi - \'\'\') - } - } - """ - - def dsl = new ExecuteDslScripts() - dsl.scriptText = dslScript - dsl.ignoreExisting = false - dsl.removeAction = javaposse.jobdsl.plugin.RemovedJobAction.IGNORE - dsl.run() + # Copy DSL script to workspace + cp /workspace/infra/jenkins/project_job.groovy $WORKSPACE/project_job.groovy ''') + dsl { + external("project_job.groovy") + additionalClasspath("project_job.groovy/lives") + ignoreExisting(false) + } } } diff --git a/infra/jenkins/project_job.groovy b/infra/jenkins/project_job.groovy new file mode 100644 index 0000000..73cc751 --- /dev/null +++ b/infra/jenkins/project_job.groovy @@ -0,0 +1,48 @@ +def String projectName = binding.variables['PROJECT_NAME'] +def String gitUrl = binding.variables['GIT_URL'] +def String gitBranch = binding.variables['GIT_BRANCH'] +def String credentialsId = binding.variables['GIT_CREDENTIALS_ID'] +def File languageFile = new File("${WORKSPACE}/repo/detected_language.txt") +def String language = languageFile.text.trim().toLowerCase() +def String baseImage = "whanos-${language}" + +folder('Projects') { + displayName('Projects') + description('Available projects in Whanos') +} + +freeStyleJob("Projects/${projectName}") { + displayName("${projectName}") + description('Linked project managed by Whanos') + + scm { + git { + remote { + url("${gitUrl}") + if (credentialsId) { + credentials(credentialsId) + } + } + branch("*/${gitBranch}") + } + } + + triggers { + scm('* * * * *') // every minute + } + + steps { + shell("echo Building ${projectName} using ${baseImage}") + shell("docker build -t ${projectName}:${language} --build-arg BASE_IMAGE=${baseImage} .") + shell(""" + #!/bin/bash + set -e + // if [ -f whanos.yml ]; then + // echo "Deploying ${projectName} to Kubernetes..." + // kubectl apply -f whanos.yml + // else + // echo "No whanos.yml found, skipping deployment." + // fi + """) + } +}