diff --git a/Jenkinsfile b/Jenkinsfile index 149a384..2f712b1 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,9 +5,9 @@ pipeline { // GitLab配置 GITLAB_URL = 'https://gitlab.xpaas.lenovo.com' GITLAB_REPO = 'artificial-intelligence-platform/lenovo-ipc' - GITLAB_CREDENTIALS_ID = 'more_dots' + GITLAB_CREDENTIALS_ID = 'git-ipc' - // 新镜像仓库配置 (10.128.62.130:8843) + // 镜像仓库配置 (10.128.62.130:8843) REGISTRY_URL = '10.128.62.130:8843' REGISTRY_CREDENTIALS_ID = 'docker-registry-130' @@ -17,6 +17,8 @@ pipeline { // 是否跳过构建(运行时赋值) SKIP_BUILD = 'false' + + K8S_NAMESPACE = 'more-dots' } parameters { @@ -72,7 +74,11 @@ pipeline { } steps { dir('more_dots') { - sh "docker build --progress=plain -t ${IMAGE_NAME}:${env.IMAGE_TAG} ." + sh """ + docker build --progress=plain \ + --build-arg PIP_OPTIONS="--no-hash-check" \ + -t ${IMAGE_NAME}:${env.IMAGE_TAG} . + """ } } } @@ -111,124 +117,21 @@ pipeline { stage('Deploy to k3s') { steps { - dir('more_dots') { - script { - def cluster = params.TARGET_CLUSTER - def fullImageWithTag = "${FULL_IMAGE_NAME}:${env.IMAGE_TAG}" + script { + // 检查 k8s 配置文件是否存在 + if (!fileExists('more_dots/k8s/deployment.yaml')) { + error "错误: more_dots/k8s/deployment.yaml 文件不存在于代码仓库中" + } - if (cluster == 'cluster1' || cluster == 'both') { - withCredentials([ - file(credentialsId: 'k3s-cluster1-config', variable: 'KUBECONFIG_CLUSTER1'), - usernamePassword(credentialsId: REGISTRY_CREDENTIALS_ID, usernameVariable: 'REGISTRY_USER', passwordVariable: 'REGISTRY_PASS') - ]) { - sh """ - set -eux + def fullImageWithTag = "${FULL_IMAGE_NAME}:${env.IMAGE_TAG}" + def cluster = params.TARGET_CLUSTER - # 查找kubectl路径 - KUBECTL_PATH=\$(command -v kubectl 2>/dev/null || true) - if [ -z "\$KUBECTL_PATH" ]; then - for p in /usr/local/bin/kubectl /usr/bin/kubectl /bin/kubectl; do - if [ -x "\$p" ]; then - KUBECTL_PATH="\$p" - break - fi - done - fi + if (cluster == 'cluster1' || cluster == 'both') { + deployToCluster('k3s-cluster1-config', fullImageWithTag, params.DEPLOY_ENV) + } - if [ -z "\$KUBECTL_PATH" ]; then - echo "kubectl 未找到,请检查 Jenkins 节点环境" - exit 1 - fi - - echo "使用kubectl路径: \$KUBECTL_PATH" - - # 定义kubectl函数 - k() { - sudo \$KUBECTL_PATH --kubeconfig=${KUBECONFIG_CLUSTER1} "\$@" - } - - # 检查命名空间 - k get namespace ${params.DEPLOY_ENV} || k create namespace ${params.DEPLOY_ENV} - - # 创建imagePullSecret - k create secret docker-registry regcred-130 \\ - --docker-server=${REGISTRY_URL} \\ - --docker-username=${REGISTRY_USER} \\ - --docker-password=${REGISTRY_PASS} \\ - --namespace=${params.DEPLOY_ENV} \\ - --dry-run=client -o yaml | k apply -f - - - # 替换镜像并部署 - sed "s|image:.*python-app.*|image: ${fullImageWithTag}|g" k8s/deployment.yaml > /tmp/deployment-${params.DEPLOY_ENV}.yaml - k apply -f /tmp/deployment-${params.DEPLOY_ENV}.yaml -n ${params.DEPLOY_ENV} - - # 确保使用imagePullSecret - k patch deployment python-app -n ${params.DEPLOY_ENV} \\ - -p '{"spec":{"template":{"spec":{"imagePullSecrets":[{"name":"regcred-130"}]}}}}' || true - - # 重启并等待 - k rollout restart deployment/python-app -n ${params.DEPLOY_ENV} 2>/dev/null || true - k rollout status deployment/python-app -n ${params.DEPLOY_ENV} --timeout=300s - """ - } - } - - if (cluster == 'cluster2' || cluster == 'both') { - withCredentials([ - file(credentialsId: 'k3s-cluster2-config', variable: 'KUBECONFIG_CLUSTER2'), - usernamePassword(credentialsId: REGISTRY_CREDENTIALS_ID, usernameVariable: 'REGISTRY_USER', passwordVariable: 'REGISTRY_PASS') - ]) { - sh """ - set -eux - - # 查找kubectl路径 - KUBECTL_PATH=\$(command -v kubectl 2>/dev/null || true) - if [ -z "\$KUBECTL_PATH" ]; then - for p in /usr/local/bin/kubectl /usr/bin/kubectl /bin/kubectl; do - if [ -x "\$p" ]; then - KUBECTL_PATH="\$p" - break - fi - done - fi - - if [ -z "\$KUBECTL_PATH" ]; then - echo "kubectl 未找到,请检查 Jenkins 节点环境" - exit 1 - fi - - echo "使用kubectl路径: \$KUBECTL_PATH" - - # 定义kubectl函数 - k() { - sudo \$KUBECTL_PATH --kubeconfig=${KUBECONFIG_CLUSTER2} "\$@" - } - - # 检查命名空间 - k get namespace ${params.DEPLOY_ENV} || k create namespace ${params.DEPLOY_ENV} - - # 创建imagePullSecret - k create secret docker-registry regcred-130 \\ - --docker-server=${REGISTRY_URL} \\ - --docker-username=${REGISTRY_USER} \\ - --docker-password=${REGISTRY_PASS} \\ - --namespace=${params.DEPLOY_ENV} \\ - --dry-run=client -o yaml | k apply -f - - - # 替换镜像并部署 - sed "s|image:.*python-app.*|image: ${fullImageWithTag}|g" k8s/deployment.yaml > /tmp/deployment-${params.DEPLOY_ENV}.yaml - k apply -f /tmp/deployment-${params.DEPLOY_ENV}.yaml -n ${params.DEPLOY_ENV} - - # 确保使用imagePullSecret - k patch deployment python-app -n ${params.DEPLOY_ENV} \\ - -p '{"spec":{"template":{"spec":{"imagePullSecrets":[{"name":"regcred-130"}]}}}}' || true - - # 重启并等待 - k rollout restart deployment/python-app -n ${params.DEPLOY_ENV} 2>/dev/null || true - k rollout status deployment/python-app -n ${params.DEPLOY_ENV} --timeout=300s - """ - } - } + if (cluster == 'cluster2' || cluster == 'both') { + deployToCluster('k3s-cluster2-config', fullImageWithTag, params.DEPLOY_ENV) } } } @@ -247,9 +150,82 @@ pipeline { echo "构建结束。镜像标签: ${env.IMAGE_TAG}" echo "完整镜像: ${FULL_IMAGE_NAME}:${env.IMAGE_TAG}" echo "是否跳过构建: ${env.SKIP_BUILD}" + echo "部署环境: ${params.DEPLOY_ENV}" + echo "目标集群: ${params.TARGET_CLUSTER}" } failure { echo "构建失败,请检查日志" } } +} + +// 部署函数 +def deployToCluster(String clusterConfigId, String fullImageWithTag, String deployEnv) { + withCredentials([ + file(credentialsId: clusterConfigId, variable: 'KUBECONFIG'), + usernamePassword(credentialsId: REGISTRY_CREDENTIALS_ID, + usernameVariable: 'REGISTRY_USER', + passwordVariable: 'REGISTRY_PASS') + ]) { + sh """ + set -eux + + # 查找kubectl路径 + KUBECTL_PATH=\$(command -v kubectl 2>/dev/null || true) + if [ -z "\$KUBECTL_PATH" ]; then + for p in /usr/local/bin/kubectl /usr/bin/kubectl /bin/kubectl; do + if [ -x "\$p" ]; then + KUBECTL_PATH="\$p" + break + fi + done + fi + + if [ -z "\$KUBECTL_PATH" ]; then + echo "kubectl 未找到,请检查 Jenkins 节点环境" + exit 1 + fi + + echo "使用kubectl路径: \$KUBECTL_PATH" + echo "部署到集群: ${clusterConfigId}" + echo "部署环境: ${deployEnv}" + echo "镜像: ${fullImageWithTag}" + echo "命名空间: ${K8S_NAMESPACE}" + + # 定义kubectl函数 + k() { + sudo \$KUBECTL_PATH --kubeconfig=${KUBECONFIG} "\$@" + } + + # 检查命名空间 + k get namespace ${K8S_NAMESPACE} || k create namespace ${K8S_NAMESPACE} + + # 创建imagePullSecret + k create secret docker-registry regcred-130 \\ + --docker-server=${REGISTRY_URL} \\ + --docker-username=${REGISTRY_USER} \\ + --docker-password=${REGISTRY_PASS} \\ + --namespace=${K8S_NAMESPACE} \\ + --dry-run=client -o yaml | k apply -f - + + # 替换镜像标签和环境变量并部署 + sed -e "s|image:.*more_dots:.*|image: ${fullImageWithTag}|g" \\ + -e "s|value: \".*\"|value: \"${deployEnv}\"|g" \\ + more_dots/k8s/deployment.yaml > /tmp/deployment-${K8S_NAMESPACE}.yaml + + echo "部署配置:" + cat /tmp/deployment-${K8S_NAMESPACE}.yaml + + # 应用配置到 more-dots 命名空间 + k apply -f /tmp/deployment-${K8S_NAMESPACE}.yaml -n ${K8S_NAMESPACE} + + # 等待部署完成 + echo "等待部署完成..." + k rollout status deployment/more-dots -n ${K8S_NAMESPACE} --timeout=300s + + # 显示部署状态 + echo "部署完成,查看pod状态:" + k get pods -n ${K8S_NAMESPACE} -l app=more-dots + """ + } } \ No newline at end of file