在Ubuntu上通过Jenkins实现自动化部署,核心是利用Pipeline as Code(通过Jenkinsfile定义流程)结合版本控制(如Git)、构建工具(如Maven/Gradle)、部署工具(如SSH/SCP/Docker/Kubernetes),完成从代码提交到生产部署的全流程自动化。以下是详细步骤:
在Ubuntu服务器上安装Jenkins及必要依赖,确保系统具备Java、代码托管、构建工具等基础环境:
sudo apt update && sudo apt install -y openjdk-11-jdk
java -version # 验证安装(需显示Java版本信息)
sudo apt install -y git
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
sudo apt update && sudo apt install -y jenkins
sudo systemctl start jenkins && sudo systemctl enable jenkins # 启动并设置开机自启
访问http://<服务器IP>:8080
,输入初始密码(位于/var/lib/jenkins/secrets/initialAdminPassword
)完成初始配置。Manage Jenkins > Manage Plugins
,安装以下插件:
Manage Jenkins > Global Tool Configuration
,设置JDK、Git、Maven(或其他构建工具)的安装路径(可选择“自动安装”或手动指定路径)。选择Pipeline任务类型(更适合复杂流程的脚本化管理),配置以下关键项:
https://github.com/your-repo/your-app.git
)和分支(如main
),若有私有仓库需添加凭证。Jenkinsfile
,默认根目录)。在项目根目录创建Jenkinsfile
,使用声明式语法(更易读、易维护)定义流水线流程,示例如下:
pipeline {
agent any // 使用任意可用节点执行流水线
environment {
// 定义环境变量(如服务器地址、凭证ID)
PROD_SERVER = 'prod.example.com'
DEPLOY_DIR = '/var/www/your-app'
SSH_CREDENTIALS = credentials('prod-ssh-key') // 关联Jenkins中的SSH私钥凭证(ID为prod-ssh-key)
}
stages {
// 1. 拉取代码
stage('Checkout') {
steps {
git branch: 'main', url: 'https://github.com/your-repo/your-app.git'
}
}
// 2. 构建项目(以Maven为例)
stage('Build') {
steps {
sh 'mvn clean package -DskipTests' // 跳过测试(可根据需求调整)
}
}
// 3. 运行测试(可选,建议开启)
stage('Test') {
steps {
sh 'mvn test' // 运行单元测试
junit '**/target/surefire-reports/*.xml' // 收集测试报告(需安装JUnit插件)
}
}
// 4. 部署到生产环境(通过SSH)
stage('Deploy to Production') {
when {
branch 'main' // 仅main分支触发生产部署(避免误操作)
}
steps {
sshagent([SSH_CREDENTIALS]) { // 使用SSH凭证
sh """
scp target/*.war ${SSH_CREDENTIALS}@${PROD_SERVER}:${DEPLOY_DIR}/app.war
ssh ${SSH_CREDENTIALS}@${PROD_SERVER} "cd ${DEPLOY_DIR} && sudo systemctl restart your-app.service"
"""
}
}
}
}
// 5. 后置操作(可选)
post {
success {
slackSend channel: '#deploy-notifications', message: "Deployment to Production succeeded: ${env.JOB_NAME} #${env.BUILD_NUMBER}" // 发送Slack通知(需安装Slack插件)
}
failure {
mail to: 'team@example.com', subject: 'Deployment Failed', body: "Job ${env.JOB_NAME} failed on build #${env.BUILD_NUMBER}" // 发送邮件通知
}
}
}
关键说明:
environment
块定义敏感信息(如服务器地址),避免硬编码;credentials()
函数引用Jenkins中存储的SSH私钥(需提前在Manage Jenkins > Credentials
中添加);when
块限制仅main
分支触发生产部署,降低风险;post
块实现通知功能,及时反馈构建状态。让流水线在代码变更时自动执行,有两种常见方式:
http://<Jenkins-IP>:8080/github-webhook/
(需安装GitHub Integration插件)。Jenkins会在代码推送时自动触发流水线。H/5 * * * *
表示每5分钟检查一次代码变更)。sudo usermod -aG docker jenkins
,若使用Docker)或修改目标服务器目录权限(sudo chown -R jenkins:jenkins /var/www/your-app
)。-U
参数强制更新依赖(mvn clean package -U
)。docker stop your-app || true
)或重启服务(systemctl restart your-app.service
)。通过以上步骤,即可实现Ubuntu环境下Jenkins的自动化部署任务,覆盖从代码提交到生产部署的全流程,提升开发效率和部署可靠性。