ubuntu

怎样自动化Ubuntu Jenkins部署过程

小樊
38
2025-10-29 03:58:01
栏目: 智能运维

一、环境准备

在Ubuntu上实现Jenkins自动化部署前,需完成以下基础配置:

  1. 安装Java环境:Jenkins基于Java开发,需安装JDK(推荐OpenJDK 11+)。执行以下命令安装并验证:
    sudo apt update && sudo apt install -y openjdk-11-jdk
    java -version  # 验证安装(需显示Java版本信息)
    
  2. 安装Jenkins
    • 添加Jenkins官方APT仓库并导入密钥:
      wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
      echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/" | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
      
    • 安装Jenkins并启动服务:
      sudo apt update && sudo apt install -y jenkins
      sudo systemctl start jenkins && sudo systemctl enable jenkins  # 开机自启
      
    • 访问Jenkins Web界面(http://<服务器IP>:8080),输入初始密码(位于/var/lib/jenkins/secrets/initialAdminPassword)完成解锁,安装推荐插件(如Pipeline、Git)。

二、配置Jenkins基础环境

  1. 安装必要插件
    进入“Manage Jenkins → Manage Plugins”,安装以下插件:
    • Pipeline:用于定义自动化流程;
    • Git:用于从Git仓库拉取代码;
    • Publish over SSH:用于安全地将文件传输到远程服务器;
    • Docker(可选):若使用容器化部署,需安装此插件。
  2. 配置全局工具
    进入“Manage Jenkins → Global Tool Configuration”,设置以下工具路径(若未自动检测):
    • JDK:指定JDK安装路径(如/usr/lib/jvm/java-11-openjdk-amd64);
    • Git:指定Git安装路径(如/usr/bin/git);
    • Maven(可选):若使用Maven构建,指定Maven路径(如/usr/share/maven)。
  3. 配置SSH密钥(用于远程部署):
    • 在Jenkins服务器上生成SSH密钥对(若未生成):
      ssh-keygen -t rsa -b 4096 -C "jenkins@example.com"
      
    • 将公钥(~/.ssh/id_rsa.pub)添加到目标服务器的~/.ssh/authorized_keys文件中;
    • 在Jenkins中添加SSH凭据:“Manage Jenkins → Credentials → System → Global credentials → Add Credentials”,选择“SSH Username with private key”,输入目标服务器用户名和私钥内容。

三、创建Jenkins Pipeline任务

  1. 新建Pipeline任务
    登录Jenkins,点击“New Item”,输入任务名称(如ubuntu-app-deploy),选择“Pipeline”,点击“OK”。
  2. 配置Pipeline脚本
    选择“Pipeline script from SCM”(推荐,便于版本控制),设置以下参数:
    • SCM:选择Git,输入代码仓库URL(如https://github.com/your-repo/your-project.git)和分支(如main);
    • Script Path:指定Jenkinsfile路径(如Jenkinsfile,需与代码仓库中的文件路径一致)。
  3. 示例Jenkinsfile(Java应用)
    以下是一个完整的声明式Pipeline脚本,包含代码拉取、构建、测试、部署流程:
    pipeline {
        agent any
        environment {
            // 环境变量配置
            PROJECT_NAME = "ubuntu-app"
            JAR_NAME = "${PROJECT_NAME}-${env.BUILD_ID}.jar"
            DEPLOY_DIR = "/opt/ubuntu-app"  // 远程服务器部署目录
            SSH_USER = "ubuntu"              // 远程服务器用户名
            SSH_HOST = "192.168.1.100"       // 远程服务器IP
        }
        stages {
            stage('Checkout') {
                steps {
                    // 从Git拉取代码
                    git branch: 'main', url: 'https://github.com/your-repo/your-project.git'
                }
            }
            stage('Build') {
                steps {
                    // 使用Maven构建项目(跳过测试)
                    sh 'mvn -U -Dmaven.test.skip=true clean package'
                }
            }
            stage('Test') {
                steps {
                    // 执行单元测试(可选)
                    sh 'mvn test'
                }
            }
            stage('Deploy') {
                steps {
                    script {
                        // 停止远程服务器上的旧进程(避免端口冲突)
                        sh "ssh ${SSH_USER}@${SSH_HOST} 'pkill -f ${JAR_NAME} || true'"
                        // 删除旧JAR包
                        sh "ssh ${SSH_USER}@${SSH_HOST} 'rm -f ${DEPLOY_DIR}/${JAR_NAME}'"
                        // 复制新JAR包到远程服务器
                        sh "scp target/${JAR_NAME} ${SSH_USER}@${SSH_HOST}:${DEPLOY_DIR}/"
                        // 启动应用(后台运行,输出日志到文件)
                        sh "ssh ${SSH_USER}@${SSH_HOST} 'nohup java -jar ${DEPLOY_DIR}/${JAR_NAME} --server.port=8080 > ${DEPLOY_DIR}/${PROJECT_NAME}.log 2>&1 &'"
                    }
                }
            }
        }
        post {
            success {
                // 构建成功通知(如邮件、Slack)
                echo "Deployment successful for build #${env.BUILD_NUMBER}"
            }
            failure {
                // 构建失败通知
                echo "Deployment failed for build #${env.BUILD_NUMBER}"
            }
        }
    }
    
    注:可根据项目需求调整阶段(如添加Docker构建、推送镜像等)。

四、配置自动化触发器

  1. 代码提交触发
    在Pipeline配置页面,勾选“GitHub hook trigger for GITScm polling”,并在Git仓库中配置Webhook(指向http://<Jenkins服务器IP>:8080/github-webhook/),实现代码推送后自动触发构建。
  2. 定时触发
    在“Build Triggers”中勾选“Poll SCM”,设置定时规则(如H/5 * * * *表示每5分钟检查一次代码变更,若有变更则触发构建)。

五、测试自动化部署

  1. 提交代码:向Git仓库推送代码变更(如修改代码后执行git push origin main);
  2. 查看构建状态:Jenkins会自动触发Pipeline,进入任务页面查看各阶段执行情况(如Checkout、Build、Deploy);
  3. 验证部署结果:登录远程Ubuntu服务器,检查应用是否运行(如ps -ef | grep java查看进程,tail -f /opt/ubuntu-app/ubuntu-app.log查看日志)。

常见问题解决

  1. 权限不足:若Jenkins无法执行dockerssh命令,需将Jenkins用户加入对应组:
    sudo usermod -aG docker jenkins  # 允许Jenkins使用Docker
    sudo usermod -aG ssh jenkins     # 允许Jenkins使用SSH
    sudo systemctl restart jenkins   # 重启Jenkins服务
    
  2. 端口冲突:部署前停止远程服务器上的旧进程(如ssh ${SSH_USER}@${SSH_HOST} 'pkill -f ${JAR_NAME}')。
  3. 构建缓存问题:在Maven构建命令中添加-U参数,强制更新依赖(如mvn -U clean package)。

0
看了该问题的人还看了