温馨提示×

Jenkins于Linux如何实现自动化部署

小樊
42
2025-10-28 22:39:08
栏目: 智能运维

一、前置准备:安装Jenkins与基础工具

在Linux服务器(如Ubuntu/CentOS)上实现自动化部署前,需先安装Jenkins及依赖工具:

  1. 安装Java环境:Jenkins依赖Java运行,推荐使用OpenJDK 11+(如Ubuntu下执行sudo apt install openjdk-11-jdk -y,CentOS下执行sudo yum install java-11-openjdk-devel -y)。
  2. 安装Jenkins
    • Ubuntu/CentOS均需添加Jenkins官方仓库(Ubuntu:wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -;CentOS:sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo+sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key)。
    • 执行sudo apt update && sudo apt install jenkins -y(Ubuntu)或sudo yum install jenkins -y(CentOS)安装Jenkins。
  3. 启动Jenkinssudo systemctl start jenkins,并设置开机自启sudo systemctl enable jenkins
  4. 访问Web界面:通过浏览器访问http://<服务器IP>:8080,输入初始密码(位于/var/lib/jenkins/secrets/initialAdminPassword)完成初始化,安装推荐插件(如Git、Pipeline)。

二、配置Jenkins与Linux服务器关联

为了让Jenkins能在Linux服务器上执行部署命令,需将服务器添加为Jenkins的节点(Node)

  1. 开启SSH服务:在Linux服务器上执行sudo systemctl start sshd(若未安装,执行sudo apt install openssh-server -y/sudo yum install openssh-server -y)。
  2. Jenkins添加节点
    • 进入Jenkins→Manage JenkinsManage Nodes and CloudsNew Node
    • 输入节点名称(如linux-server),选择“Permanent Agent”,点击“OK”。
    • 配置节点信息:
      • Remote root directory:设置为Linux上的Jenkins工作目录(如/home/jenkins);
      • Credentials:添加SSH私钥(生成方式:ssh-keygen -t rsa,公钥添加到Linux服务器的~/.ssh/authorized_keys中);
      • Number of executors:根据服务器性能设置(如1);
      • Launch method:选择“Launch agents via SSH”。

三、创建Jenkins Pipeline任务

Pipeline是Jenkins实现自动化部署的核心,通过代码定义流程(推荐使用Jenkinsfile或Web界面编写)。以下是Web界面配置Pipeline的步骤:

  1. 新建任务:进入Jenkins主页→New Item→输入任务名称(如my-app-deploy)→选择“Pipeline”→点击“OK”。
  2. 配置Pipeline
    • Pipeline script from SCM:选择代码托管平台(如Git),输入仓库URL(如https://github.com/your-repo/my-app.git),并配置Credentials(若有私有仓库)。
    • Script Path:指定Jenkinsfile在仓库中的路径(如根目录则留空)。
    • Branches to build:设置监听的分支(如*/main)。
    • Build Triggers:选择触发方式(如“Poll SCM”设置H/5 * * * *表示每5分钟检查代码变更,或“GitHub hook trigger for GITScm polling”配合Webhook实现代码提交自动触发)。

四、编写Pipeline脚本(核心流程)

Pipeline脚本定义了代码拉取→构建→测试→部署的全流程,以下是常见场景的示例:

示例1:Java项目(Maven+Tomcat)

pipeline {
    agent any
    tools {
        jdk 'jdk11'  // 需提前在Jenkins中配置JDK环境
        maven 'maven3'  // 需提前在Jenkins中配置Maven环境
    }
    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', url: 'https://github.com/your-repo/my-app.git'
            }
        }
        stage('Build') {
            steps {
                sh 'mvn clean package'  // 编译项目并打包为war
            }
        }
        stage('Test') {
            steps {
                sh 'mvn test'  // 运行单元测试
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml'  // 发布测试报告
                }
            }
        }
        stage('Deploy') {
            steps {
                script {
                    // 将war包复制到Tomcat服务器的webapps目录
                    scp target/*.war tomcat@your-tomcat-server:/opt/tomcat/webapps/
                    // 重启Tomcat服务
                    ssh tomcat@your-tomcat-server 'systemctl restart tomcat'
                }
            }
        }
    }
}

示例2:容器化项目(Docker+Docker Hub)

pipeline {
    agent any
    environment {
        DOCKER_HUB_CREDENTIALS = credentials('docker-hub-id')  // 需提前在Jenkins中配置Docker Hub账号
    }
    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', url: 'https://github.com/your-repo/my-app.git'
            }
        }
        stage('Build Image') {
            steps {
                sh 'docker build -t my-app:${BUILD_NUMBER} .'  // 构建镜像(需提前编写Dockerfile)
            }
        }
        stage('Push Image') {
            steps {
                script {
                    docker.withRegistry('https://registry.hub.docker.com', DOCKER_HUB_CREDENTIALS) {
                        docker.image("my-app:${BUILD_NUMBER}").push()  // 推送镜像到Docker Hub
                    }
                }
            }
        }
        stage('Deploy to Server') {
            steps {
                script {
                    // 在目标服务器上拉取最新镜像并重启容器
                    ssh devops@your-app-server 'docker pull my-app:${BUILD_NUMBER} && docker stop my-app || true && docker rm my-app || true && docker run -d --name my-app -p 8080:8080 my-app:${BUILD_NUMBER}'
                }
            }
        }
    }
}

示例3:使用Jenkinsfile(代码托管在仓库中)

若项目根目录下有Jenkinsfile,可直接在Pipeline配置中选择“Pipeline script”→勾选“Prepare an environment for the run”→指定Jenkinsfile路径(如Jenkinsfile),无需手动编写脚本。

五、触发自动化部署

  1. 代码提交触发:配置Pipeline的“Build Triggers”为“Poll SCM”(如H/5 * * * *)或“GitHub hook trigger for GITScm polling”(需在Git仓库设置Webhook,URL为http://<jenkins-server>/github-webhook/)。
  2. 手动触发:在Jenkins任务页面点击“Build Now”手动启动流程。
  3. 定时触发:通过“Poll SCM”设置定时规则(如每天凌晨2点执行:H 2 * * *)。

六、验证与优化

  1. 查看日志:在Jenkins任务页面点击“Build History”→选择对应构建→点击“Console Output”,查看每一步的执行结果。
  2. 通知机制:通过“Post-build Actions”添加邮件/Slack通知,及时告知部署结果(如失败时提醒开发人员)。
  3. 回滚策略:在部署脚本中添加版本备份(如cp /opt/tomcat/webapps/my-app.war /opt/tomcat/webapps/my-app-backup.war),失败时可快速回滚到上一版本。

通过以上步骤,即可在Linux服务器上使用Jenkins实现自动化部署,覆盖从代码拉取到服务重启的全流程,提升开发与运维效率。

0