温馨提示×

如何自定义Ubuntu Jenkins部署配置

小樊
32
2025-12-28 04:18:04
栏目: 智能运维

Ubuntu 上自定义 Jenkins 部署配置

一 环境与基础安装

  • 安装 Java 11/17(Jenkins 长期支持版本通常与这两个 Java 版本兼容),并安装 Git
    • sudo apt update && sudo apt install -y openjdk-11-jdk git
    • java -version
  • 导入 Jenkins 官方 APT 仓库并安装(推荐 LTS):
    • 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
  • 启动并设置开机自启,默认监听 8080
    • sudo systemctl start jenkins && sudo systemctl enable jenkins
  • 解锁与初始化:
    • 查看初始密码:sudo cat /var/lib/jenkins/secrets/initialAdminPassword
    • 访问 http://<服务器IP>:8080 完成插件与管理员设置
  • 防火墙放行(如使用 UFW):
    • sudo ufw allow 8080/tcp && sudo ufw reload

二 核心组件与凭据配置

  • 插件安装(Manage Jenkins → Manage Plugins):
    • 必装:PipelineGitCredentials BindingPublish Over SSH(远程部署)、可选 Docker/Kubernetes(容器化场景)
  • 全局工具(Manage Jenkins → Global Tool Configuration):
    • 指定 JDK(如 /usr/lib/jvm/java-11-openjdk-amd64)、Git(如 /usr/bin/git)、Maven/Gradle(如需要)
  • SSH 凭据与免密:
    • 生成密钥:ssh-keygen -t rsa -b 4096 -C “jenkins@example.com”
    • 将公钥(~/.ssh/id_rsa.pub)追加到目标服务器 ~/.ssh/authorized_keys
    • Jenkins 添加凭证:Manage Jenkins → Credentials → System → Global credentials → Add Credentials
      • 类型:SSH Username with private key,填入目标服务器用户名与私钥内容,记录 ID(如 prod-ssh-key)供流水线引用

三 自定义部署流水线

  • 任务类型与源码管理:

    • New Item → Pipeline;SCM 选 Git,填写仓库 URL 与分支(如 main
    • 推荐选择 Pipeline script from SCM,Script Path 指定仓库中的 Jenkinsfile
  • 声明式 Jenkinsfile 示例(SSH 部署到远程主机,含条件与通知)

    • 说明:使用 credentials() 引用 SSH 私钥凭证;仅 main 分支触发生产部署;部署后可选 Slack/邮件 通知
    • 示例要点:
      • environment 定义 PROD_SERVER/DEPLOY_DIR/SSH_CREDENTIALS
      • stage(‘Deploy’) 使用 sshagent 执行 SCP 与远程 systemctl restart
      • post 块实现成功/失败通知(需安装对应插件)
    pipeline {
      agent any
      environment {
        PROD_SERVER = 'prod.example.com'
        DEPLOY_DIR  = '/var/www/your-app'
        SSH_CREDENTIALS = credentials('prod-ssh-key')
      }
      stages {
        stage('Checkout') {
          steps { git branch: 'main', url: 'https://github.com/your-repo/your-app.git' }
        }
        stage('Build') {
          steps { sh 'mvn clean package -DskipTests' }
        }
        stage('Test') {
          steps { sh 'mvn test'; junit '**/target/surefire-reports/*.xml' }
        }
        stage('Deploy to Production') {
          when { branch 'main' }
          steps {
            sshagent([SSH_CREDENTIALS]) {
              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"
              """
            }
          }
        }
      }
      post {
        success {
          slackSend channel: '#deploy-notifications',
                    message: "Deployment to Production succeeded: ${env.JOB_NAME} #${env.BUILD_NUMBER}"
        }
        failure {
          mail to: 'team@example.com',
               subject: 'Deployment Failed',
               body: "Job ${env.JOB_NAME} failed on build #${env.BUILD_NUMBER}"
        }
      }
    }
    
  • 其他常见方式:

    • Freestyle 项目中使用 Publish Over SSH 插件进行文件传输与远程命令执行
    • 容器化部署:在 Pipeline 中使用 Docker 构建镜像并推送到仓库,远程主机 docker pull/run 或通过 Kubernetes 插件部署

四 触发器与自动化

  • Webhook 自动触发(推荐):
    • GitHub/GitLab 配置 Webhook,指向 http://:8080/github-webhook/(需安装 GitHub Integration 等插件)
    • 代码推送时自动触发对应流水线
  • 轮询 SCM(备选):
    • 在 Pipeline 配置中勾选 Poll SCM,如 **H/5 * * * *** 表示每 5 分钟检查一次变更

五 进阶与运维优化

  • 配置即代码 JCasC(Configuration as Code):
    • 安装 JCasC 插件,将系统配置、安全、工具、凭证等写入 YAML,实现一键复现环境
    • 示例要点(credentials 与 tool 片段):
      jenkins:
        systemMessage: "Configured by JCasC"
      tool:
        git:
          installations:
            - name: git
              home: /usr/bin/git
      credentials:
        system:
          domainCredentials:
            - credentials:
              - basicSSHUserPrivateKey:
                  scope: SYSTEM
                  id: ssh_with_passphrase_provided
                  username: deploy
                  passphrase: ${SSH_KEY_PASSWORD}
                  privateKeySource:
                    directEntry:
                      privateKey: ${SSH_PRIVATE_KEY}
      
    • 注意:JCasC 不负责安装插件,需预先安装配置中涉及的插件
  • 系统参数与目录(DEB/RPM 安装常见路径):
    • 配置文件:/etc/default/jenkins
    • 工作目录:/var/lib/jenkins
    • 日志:/var/log/jenkins/jenkins.log
    • 可在配置文件中自定义 JENKINS_HOME、HTTP_PORT、JENKINS_JAVA_OPTIONS 等后重启生效
  • 分布式构建(Master/Agent 扩展):
    • Kubernetes 环境可使用 WebSocket 模式连接 Agent,无需开放 50000 端口,结合 PVC 持久化数据,按需弹性扩缩容
  • 常见问题速查:
    • 权限不足:将 Jenkins 用户加入 docker 组(sudo usermod -aG docker jenkins)或调整目标目录属主
    • 构建缓存:Maven 加 -U 强制更新依赖(mvn clean package -U)
    • 端口冲突:部署前停止旧容器或重启服务(docker stop/rm 或 systemctl restart)
    • 触发器失败:确认 Webhook 地址、CSRF 保护、网络连通性与插件安装状态

0