feat: jenkinsfile 补充ssh key

This commit is contained in:
sylarchen1389 2025-11-08 14:02:58 +08:00
parent 8f59728470
commit be7978e2ce

122
Jenkinsfile vendored
View file

@ -16,23 +16,42 @@ pipeline {
}
stages {
stage('准备工作') {
steps {
script {
echo "========================================="
echo "开始构建 Build #${BUILD_NUMBER}"
echo "仓库: ${REPO_URL}"
echo "镜像: ${IMAGE_NAME}:${IMAGE_TAG}"
echo "========================================="
// 检查Docker是否可用
sh 'docker --version'
sh 'docker info'
}
}
}
stage('检出代码') {
steps {
script {
echo "🔄 从 ${REPO_URL} 检出代码..."
echo "从 ${REPO_URL} 检出代码..."
}
// 使用更简单的checkout方式
checkout([
$class: 'GitSCM',
branches: [[name: '*/main']],
userRemoteConfigs: [[
url: "${REPO_URL}",
credentialsId: 'github-ssh-key'
]],
extensions: [[$class: 'CloneOption', depth: 1]]
credentialsId: 'github-ssh' // 改成你实际创建的凭据ID
]]
])
script {
echo "✓ 代码检出完成"
sh 'git log --oneline -1'
echo "代码检出完成"
sh 'ls -la'
sh 'git log --oneline -1 || echo "无法获取git日志"'
}
}
}
@ -40,16 +59,31 @@ pipeline {
stage('验证 Dockerfile') {
steps {
script {
sh '''
echo "检查 Dockerfile..."
sh """
if [ ! -f "${DOCKER_FILE_PATH}" ]; then
echo "❌ 找不到 Dockerfile: ${DOCKER_FILE_PATH}"
echo "错误: 找不到 Dockerfile: ${DOCKER_FILE_PATH}"
echo "当前目录内容:"
ls -la
exit 1
fi
echo "Dockerfile 存在"
echo "--- Dockerfile 内容预览 ---"
echo "Dockerfile 存在"
echo "--- Dockerfile 内容 (前20行) ---"
head -20 "${DOCKER_FILE_PATH}"
'''
"""
}
}
}
stage('创建输出目录') {
steps {
script {
echo "创建输出目录: ${OUTPUT_DIR}"
sh """
sudo mkdir -p ${OUTPUT_DIR}
sudo chmod 777 ${OUTPUT_DIR}
ls -ld ${OUTPUT_DIR}
"""
}
}
}
@ -57,56 +91,54 @@ pipeline {
stage('构建 Docker 镜像') {
steps {
script {
echo "🔨 开始构建镜像: ${IMAGE_NAME}:${IMAGE_TAG}"
sh '''
echo "开始构建镜像: ${IMAGE_NAME}:${IMAGE_TAG}"
sh """
docker build \
-t ${IMAGE_NAME}:${IMAGE_TAG} \
-t ${IMAGE_NAME}:latest \
-f ${DOCKER_FILE_PATH} \
.
echo "镜像构建完成"
docker images | grep ${IMAGE_NAME}
'''
echo "镜像构建完成"
docker images | grep ${IMAGE_NAME} || echo "未找到镜像"
"""
}
}
}
stage('导出镜像到本地') {
stage('导出镜像') {
steps {
script {
sh '''
mkdir -p ${OUTPUT_DIR}
echo "导出镜像到 ${OUTPUT_DIR}"
sh """
echo "导出 ${IMAGE_NAME}:${IMAGE_TAG}..."
docker save ${IMAGE_NAME}:${IMAGE_TAG} | gzip > ${OUTPUT_DIR}/${IMAGE_NAME}-${IMAGE_TAG}.tar.gz
echo "📦 导出镜像 ${IMAGE_TAG}..."
docker save ${IMAGE_NAME}:${IMAGE_TAG} \
| gzip > ${OUTPUT_DIR}/${IMAGE_NAME}-${IMAGE_TAG}.tar.gz
echo "导出 ${IMAGE_NAME}:latest..."
docker save ${IMAGE_NAME}:latest | gzip > ${OUTPUT_DIR}/${IMAGE_NAME}-latest.tar.gz
echo "📦 导出镜像 latest..."
docker save ${IMAGE_NAME}:latest \
| gzip > ${OUTPUT_DIR}/${IMAGE_NAME}-latest.tar.gz
echo "✓ 镜像导出完成"
echo "--- 输出文件 ---"
echo "导出完成"
ls -lh ${OUTPUT_DIR}/${IMAGE_NAME}*.tar.gz
'''
"""
}
}
}
stage('清理') {
stage('清理旧镜像') {
steps {
script {
sh '''
echo "🧹 清理本地镜像..."
docker rmi ${IMAGE_NAME}:${IMAGE_TAG} 2>/dev/null || true
docker rmi ${IMAGE_NAME}:latest 2>/dev/null || true
echo "清理本地镜像..."
sh """
docker rmi ${IMAGE_NAME}:${IMAGE_TAG} 2>/dev/null || echo "镜像已删除或不存在"
# 保留latest标签方便下次使用
# docker rmi ${IMAGE_NAME}:latest 2>/dev/null || true
# 清理悬空镜像
docker image prune -f --filter "dangling=true"
docker image prune -f --filter "dangling=true" || true
echo "清理完成"
'''
echo "清理完成"
"""
}
}
}
@ -114,13 +146,23 @@ pipeline {
post {
success {
echo "✅ 构建成功!镜像已保存到 ${OUTPUT_DIR}"
script {
echo "========================================="
echo "✅ 构建成功!"
echo "镜像文件位置: ${OUTPUT_DIR}"
sh "ls -lh ${OUTPUT_DIR}/${IMAGE_NAME}*.tar.gz || true"
echo "========================================="
}
}
failure {
echo "❌ 构建失败,请查看日志"
echo "❌ 构建失败,请检查上方日志"
}
always {
cleanWs()
script {
echo "流水线执行完成"
// 可选:清理工作空间(注释掉以便调试)
// cleanWs()
}
}
}
}