温馨提示×

Linux环境下Jenkins如何部署应用

小樊
97
2025-09-22 21:13:35
栏目: 智能运维

1. 准备工作

  • 安装Java环境:Jenkins基于Java开发,需先安装JDK 11及以上版本。以OpenJDK为例,在CentOS上执行sudo yum install java-11-openjdk-devel,Ubuntu上执行sudo apt install openjdk-11-jdk;安装后通过java -version验证,需显示Java版本信息。
  • 下载Jenkins:从Jenkins官网下载稳定版WAR包(如wget https://get.jenkins.io/war-stable/2.426.3/jenkins.war),或通过包管理器安装(CentOS用sudo yum install jenkins,Ubuntu用sudo apt install jenkins)。

2. 安装与启动Jenkins

  • 启动Jenkins服务
    • WAR包方式(通用):将WAR包放至指定目录(如/opt),执行nohup java -jar /opt/jenkins.war --httpPort=8080 > /var/log/jenkins.log 2>&1 &后台启动;如需修改端口,调整--httpPort参数(如--httpPort=9090)。
    • 包管理器方式(CentOS/Ubuntu):安装后执行sudo systemctl start jenkins启动,sudo systemctl enable jenkins设置开机自启。
  • 解锁Jenkins:首次访问http://<服务器IP>:8080,需输入初始密码(路径:cat /var/lib/jenkins/secrets/initialAdminPassword);输入后跳过插件安装(若已离线准备插件)。

3. 配置Jenkins

  • 安装必要插件:进入“Manage Jenkins”→“Manage Plugins”,安装以下核心插件:
    • Git Plugin:用于从Git仓库拉取代码;
    • Pipeline Plugin:支持流水线构建;
    • Deploy to Container Plugin:用于部署到Tomcat、WildFly等容器;
    • Docker Plugin:用于与Docker交互(可选,根据部署需求)。
  • 配置全局工具
    • Java:进入“Manage Jenkins”→“Global Tool Configuration”,添加JDK路径(如/usr/local/jdk-11.0.20);
    • Git:添加Git可执行文件路径(如/usr/bin/git);
    • Maven(可选):添加Maven安装目录及settings.xml路径(如/usr/share/maven)。
  • 设置凭据:进入“Manage Jenkins”→“Manage Credentials”,添加Git账号、Docker Hub账号或服务器SSH密钥等凭据,供Pipeline脚本使用。

4. 创建Pipeline Job

  • 新建Job:点击“New Item”,输入Job名称(如my-app-deploy),选择“Pipeline”,点击“OK”。
  • 配置Pipeline脚本:在“Pipeline” section选择“Pipeline script from SCM”(推荐,便于版本控制),设置:
    • SCM:选择Git;
    • Repository URL:填写代码仓库地址(如https://github.com/your-repo/my-app.git);
    • Branch Specifier:填写分支(如*/main);
    • Script Path:填写Pipeline脚本路径(如Jenkinsfile,需存放在代码仓库根目录)。

5. 编写Pipeline脚本 以下是一个完整的Java应用部署Pipeline示例(Jenkinsfile):

pipeline {
    agent any
    environment {
        // 定义环境变量
        MAVEN_HOME = tool 'maven'  // 引用Global Tool Configuration中的Maven
        PATH = "${MAVEN_HOME}/bin:${PATH}"
        DOCKER_IMAGE = "your-dockerhub-id/my-app:${env.BUILD_NUMBER}"
    }
    stages {
        stage('Checkout') {
            steps {
                git branch: '*/main', url: 'https://github.com/your-repo/my-app.git'  // 拉取代码
            }
        }
        stage('Build') {
            steps {
                sh 'mvn clean package'  // Maven编译打包
            }
        }
        stage('Unit Test') {
            steps {
                sh 'mvn test'  // 运行单元测试
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml'  // 发布测试报告
                }
            }
        }
        stage('Deploy to Tomcat') {
            steps {
                script {
                    // 停止Tomcat旧版本应用
                    sshagent(['tomcat-ssh-credentials']) {  // 使用SSH凭据
                        sh 'ssh user@tomcat-server "systemctl stop tomcat"'
                        sh 'ssh user@tomcat-server "rm -rf /opt/tomcat/webapps/my-app*"'
                        // 复制新WAR包到Tomcat
                        sh 'scp target/my-app.war user@tomcat-server:/opt/tomcat/webapps/'
                        // 启动Tomcat
                        sh 'ssh user@tomcat-server "systemctl start tomcat"'
                    }
                }
            }
        }
        stage('Deploy to Docker') {
            steps {
                script {
                    // 登录Docker Hub
                    docker.withRegistry('https://registry.hub.docker.com', 'docker-hub-credentials') {
                        // 构建Docker镜像
                        def customImage = docker.build(DOCKER_IMAGE)
                        // 推送镜像到仓库
                        customImage.push()
                        // 可选:拉取镜像到目标服务器并运行
                        sshagent(['docker-ssh-credentials']) {
                            sh 'ssh user@app-server "docker pull ${DOCKER_IMAGE}"'
                            sh 'ssh user@app-server "docker stop my-app || true"'
                            sh 'ssh user@app-server "docker rm my-app || true"'
                            sh 'ssh user@app-server "docker run -d --name my-app -p 8080:8080 ${DOCKER_IMAGE}"'
                        }
                    }
                }
            }
        }
    }
    post {
        always {
            echo 'Deployment completed, check logs for details.'
        }
        failure {
            mail to: 'dev-team@example.com', subject: "Jenkins Deployment Failed: ${currentBuild.fullDisplayName}", body: "Check console output at ${env.BUILD_URL}"
        }
    }
}

说明

  • Checkout:从Git仓库拉取代码;
  • Build:使用Maven编译打包;
  • Unit Test:运行单元测试并发布报告;
  • Deploy to Tomcat:通过SSH停止Tomcat、替换WAR包、重启Tomcat;
  • Deploy to Docker:构建Docker镜像、推送至仓库、在目标服务器运行容器;
  • post:处理构建结果(如失败时发送邮件通知)。

6. 触发构建与监控

  • 触发方式
    • 手动触发:进入Job页面,点击“Build Now”;
    • 自动触发:在“Pipeline” section勾选“Build periodically”,设置定时规则(如H/5 * * * *表示每5分钟构建一次);或勾选“Poll SCM”,设置SCM轮询时间(如H/5 * * * *表示每5分钟检查代码变更)。
  • 查看结果:构建后进入“Build History”,点击构建编号查看控制台输出、测试报告、部署日志等;如需查看Tomcat或Docker状态,可通过SSH登录目标服务器执行systemctl status tomcatdocker ps

7. 常见问题排查

  • 插件依赖缺失:进入“Manage Jenkins”→“Manage Plugins”→“Installed”,检查插件是否显示错误;若有缺失,手动下载依赖插件并上传至“Advanced” tab安装。
  • Jenkins无法启动
    • Java环境问题:确认java -version输出正确版本,若未安装或版本过低,重新安装JDK;
    • 端口冲突:执行netstat -tulnp | grep 8080查看端口占用,修改Jenkins端口(如--httpPort=9090);
    • 权限问题:确保Jenkins用户对工作目录(如/var/lib/jenkins)有读写权限(chown -R jenkins:jenkins /var/lib/jenkins)。
  • 部署失败
    • SSH连接失败:确认目标服务器IP、端口正确,SSH凭据(用户名/密码或密钥)有效;
    • 应用未停止:在部署前添加systemctl stop tomcatdocker stop命令,避免端口冲突;
    • WAR包路径错误:确认target/my-app.war路径存在,或修改为实际打包路径。

0