温馨提示×

ubuntu上jenkins如何自动化部署

小樊
43
2025-12-02 15:57:51
栏目: 智能运维

在 Ubuntu 上用 Jenkins 实现自动化部署

一 环境准备与安装

  • 操作系统建议:Ubuntu 22.04/24.04 LTS;Java 推荐 OpenJDK 17(Jenkins LTS 镜像已内置 JDK 17)。
  • 安装 Java:sudo apt update && sudo apt install -y openjdk-17-jdk
  • 安装 Jenkins(官方仓库方式):
    sudo wget -O /usr/share/keyrings/jenkins-keyring.asc https://pkg.jenkins.io/debian-stable/jenkins.io.key
    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
    sudo apt update && sudo apt install -y jenkins
    sudo systemctl enable --now jenkins
  • 防火墙放行端口:sudo ufw allow 8080,50000/tcp;访问 http://<服务器IP>:8080
  • 获取初始密码:sudo cat /var/lib/jenkins/secrets/initialAdminPassword
  • 可选 Docker 方式(便于迁移与隔离):
    mkdir -p /opt/jenkins_home && chown -R 1000:1000 /opt/jenkins_home
    使用 docker-compose 挂载 /var/run/docker.sock/usr/bin/docker,镜像选 jenkins/jenkins:lts-jdk17

二 初始化与安全配置

  • 插件安装:进入 Manage Jenkins → Manage Plugins,安装 GitPipelineDockerGitHub Integration(或 GitLab Integration)等。
  • 凭据管理:在 Manage Jenkins → Credentials → System → Global credentials 添加 SSH 私钥(用于拉取私有仓库)与 目标服务器 SSH 凭据(用于部署)。
  • 安全加固:启用登录安全、禁用匿名访问,创建管理员账户;按需配置 CSRF 与代理/节点隔离。

三 创建流水线任务与触发器

  • 新建任务:选择 Pipeline,在 Pipeline → DefinitionPipeline script from SCM,配置 Git 仓库 URL 与凭据。
  • 触发方式:
    • 轮询 SCM:如 **H/5 * * * *** 每 5 分钟检查变更。
    • Webhook:
      • GitHub:在仓库 Settings → Webhooks 添加 Payload URL(如 http:///github-webhook/)与 Secret
      • GitLab:在 Settings → Webhooks 添加 URL(如 http:///project/<项目名>)与 Secret Token
  • 构建环境:在 Manage Jenkins → Global Tool Configuration 配置 JDK 17 与(如用 Maven)Maven 安装。

四 示例 Jenkinsfile 与部署方式

  • 方式 A Docker 本地运行(适合单机或测试)
    pipeline {
      agent any
      environment {
        DOCKER_REGISTRY = 'your-registry.example.com'
        IMAGE           = 'demo-app'
        TAG             = "${env.BUILD_ID}"
        CONTAINER       = 'myapp'
        HOST_PORT       = 8080
        APP_PORT        = 8080
      }
      stages {
        stage('Checkout') {
          steps { git url: 'git@github.com:org/demo-app.git', branch: 'main', credentialsId: 'github-ssh' }
        }
        stage('Build') {
          steps { sh 'mvn -U -DskipTests clean package' }
        }
        stage('Docker Build & Run') {
          steps {
            sh """
              docker stop ${CONTAINER} || true
              docker rm   ${CONTAINER} || true
              docker build -t ${IMAGE}:${TAG} .
              docker run -d --name ${CONTAINER} -p ${HOST_PORT}:${APP_PORT} ${IMAGE}:${TAG}
            """
          }
        }
      }
    }
    
  • 方式 B 远程主机部署(通过 SSH)
    pipeline {
      agent any
      environment {
        JAR_NAME = 'app.jar'
        WORKSPACE_PATH = "/opt/apps/${JOB_NAME}"
        REMOTE_USER = 'deploy'
        REMOTE_HOST = '192.0.2.10'
        REMOTE_DIR  = '/opt/apps/${JOB_NAME}'
      }
      stages {
        stage('Checkout') {
          steps { git url: 'git@github.com:org/app.git', branch: 'main', credentialsId: 'github-ssh' }
        }
        stage('Build') {
          steps { sh 'mvn -U -DskipTests clean package' }
        }
        stage('Deploy via SSH') {
          steps {
            sh """
              ssh ${REMOTE_USER}@${REMOTE_HOST} 'mkdir -p ${REMOTE_DIR}'
              scp target/${JAR_NAME} ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/
              ssh ${REMOTE_USER}@${REMOTE_HOST} '''
                cd ${REMOTE_DIR}
                pkill -f ${JAR_NAME} || true
                nohup java -jar ${JAR_NAME} > app.log 2>&1 &
              '''
            """
          }
        }
      }
    }
    
  • 方式 C 使用 Publish Over SSH 插件
    • Manage Jenkins → Configure System → Publish over SSH 添加目标主机(Name、Hostname、Username、Remote Directory、SSH Key)。
    • 在 Freestyle 或 Pipeline 的 Post-build/步骤中使用 sshPublishertarget/*.jar 传到远程并启动。

五 常见问题与优化

  • 权限问题:若容器内需要 Docker,挂载 /var/run/docker.sock 并将 jenkins 用户加入 docker 组(宿主机执行:sudo usermod -aG docker jenkins),随后重启 Jenkins。
  • 端口冲突:部署前先停止旧容器(如 docker stop/rm),或改用不同 HOST_PORT
  • 构建缓存:Maven 加 -U 强制更新依赖;Docker 构建可加 –no-cache
  • 资源限制:容器运行加内存限制(如 –memory 512m)。
  • 稳定性:为流水线设置 超时、重试、时间戳 等选项,便于排查与容错。
  • 安全建议:为 Webhook 配置 Secret Token,限制来源 IP,使用 SSH 密钥 而非密码,定期更新插件与系统。

0