diff --git a/Jenkinsfile b/Jenkinsfile index f298241..43901e2 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,61 +2,56 @@ pipeline { agent any environment { - // 1. ADD :80 HERE. This forces nerdctl to stop looking for Port 443 - REGISTRY = "192.168.108.200:80" - - APP_NAME = "ecommerce-app" - IMAGE_NAME = "ecommerce-backend" - IMAGE_TAG = "${REGISTRY}/library/${IMAGE_NAME}:${env.BRANCH_NAME}-${env.BUILD_NUMBER}" - NAMESPACE = "ecommerce" - CONTAINERD_ADDR = "/run/containerd-pod/containerd.sock" + REGISTRY = "192.168.108.200:80" + APP_NAME = "ecommerce-app" + IMAGE_NAME = "ecommerce-backend" + IMAGE_TAG = "${REGISTRY}/library/${IMAGE_NAME}:${env.BRANCH_NAME}-${env.BUILD_NUMBER}" + NAMESPACE = "ecommerce" + CONTAINERD_ADDR = "/run/containerd-pod/containerd.sock" } stages { - stage('Build Image') { + stage('Initialize Agent Tools') { steps { script { - // We run everything in ONE sh block to maintain the session sh """ - # 1. Install binaries if they are missing + # 1. Install BuildKit if missing if ! command -v buildkitd >/dev/null; then curl -L https://github.com/moby/buildkit/releases/download/v0.12.5/buildkit-v0.12.5.linux-amd64.tar.gz | tar -xz -C /usr/local/bin/ --strip-components=1 ln -sf /usr/local/bin/buildctl /usr/bin/buildctl fi - # 2. Setup Sockets - mkdir -p /run/buildkit /run/buildkit-default - - # 3. Start BuildKit in the background specifically for this session - export JENKINS_NODE_COOKIE=dontKillMe - nohup buildkitd --addr unix:///run/buildkit/buildkitd.sock --addr unix:///run/buildkit-default/buildkitd.sock > /tmp/buildkitd.log 2>&1 & - - # 4. Wait for socket with a simple check - echo "Waiting for BuildKit socket..." - for i in \$(seq 1 20); do - if [ -S /run/buildkit/buildkitd.sock ]; then - echo "Socket is READY." - break - fi - sleep 1 - done + # 2. Install kubectl if missing (The cause of error 127) + if ! command -v kubectl >/dev/null; then + echo "Installing kubectl..." + curl -LO "https://dl.k8s.io/release/\$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" + chmod +x kubectl + mv kubectl /usr/local/bin/ + fi - # 5. Execute the build immediately in the same step - export BUILDKIT_HOST=unix:///run/buildkit/buildkitd.sock - nerdctl --address ${CONTAINERD_ADDR} build --insecure-registry -t ${IMAGE_TAG} . + # 3. Start BuildKit + mkdir -p /run/buildkit /run/buildkit-default + export JENKINS_NODE_COOKIE=dontKillMe + if ! pgrep buildkitd > /dev/null; then + nohup buildkitd --addr unix:///run/buildkit/buildkitd.sock --addr unix:///run/buildkit-default/buildkitd.sock > /tmp/buildkitd.log 2>&1 & + sleep 10 + fi """ } } } - stage('Push to Harbor') { + stage('Build & Push') { steps { script { + sh """ + export BUILDKIT_HOST=unix:///run/buildkit/buildkitd.sock + nerdctl --address ${CONTAINERD_ADDR} build --insecure-registry -t ${IMAGE_TAG} . + """ + withCredentials([usernamePassword(credentialsId: 'harbor-creds', passwordVariable: 'PASS', usernameVariable: 'USER')]) { - sh """ - echo '${PASS}' | nerdctl --address ${CONTAINERD_ADDR} login ${REGISTRY} -u ${USER} --password-stdin --insecure-registry - nerdctl --address ${CONTAINERD_ADDR} push ${IMAGE_TAG} --insecure-registry - """ + sh "echo '${PASS}' | nerdctl --address ${CONTAINERD_ADDR} login ${REGISTRY} -u ${USER} --password-stdin --insecure-registry" + sh "nerdctl --address ${CONTAINERD_ADDR} push ${IMAGE_TAG} --insecure-registry" } } } @@ -66,6 +61,7 @@ pipeline { steps { script { withCredentials([file(credentialsId: 'k8s-config', variable: 'KUBECONFIG')]) { + // Now kubectl will exist and be found sh """ kubectl --kubeconfig=${KUBECONFIG} patch deployment ${APP_NAME} -n ${NAMESPACE} --patch \ '{"spec": {"template": {"spec": {"containers": [{"name": "${APP_NAME}", "image": "${IMAGE_TAG}", "imagePullPolicy": "Never"}]}}}}'