Skip to content

Jenkins - 自动化部署

自动化部署是持续交付和持续部署的核心组成部分。Jenkins 提供了多种方法和插件来将应用程序部署到不同的环境。

虽然存在像 ‘Deploy to container’ 这样的旧插件,用于将 WAR/EAR 文件直接部署到传统的应用服务器(Tomcat、JBoss/WildFly),但现代部署通常涉及容器、云平台或制品仓库。

这是一种将应用程序部署到传统服务器(虚拟机或物理机)的常见方法。它通常包括:

  • 前置条件: 安装 ‘SSH Agent’ 插件。
  • 凭据: 将 SSH 私钥安全地存储在 Jenkins Credentials 中。
  • Pipeline 步骤: 使用 sshagent 步骤来包装需要 SSH 访问的命令。在包装器内部,使用 sh 步骤配合 scp(复制文件)和 ssh(执行远程命令,如重启服务、运行部署脚本)等命令。

示例代码片段(Declarative Pipeline):

stage('Deploy to Staging') {
steps {
sshagent(credentials: ['your-ssh-key-credential-id']) {
sh 'scp target/myapp.war user@staging.example.com:/opt/tomcat/webapps/'
sh 'ssh user@staging.example.com systemctl restart tomcat'
}
}
}

容器化技术非常流行。Jenkins 与 Docker 集成良好:

  • 前置条件: 在 Jenkins Agent 上安装 Docker(或使用 Docker Agent)。安装 ‘Docker Pipeline’ 和 ‘Docker Commons’ 插件。
  • 凭据: 将 Docker 注册表凭据(例如 Docker Hub、AWS ECR、Google GCR)存储在 Jenkins Credentials 中。
  • Pipeline 步骤: 使用 Docker Pipeline 步骤,例如 docker.build('myimage:latest') 来构建镜像,docker.withRegistry('https://registry.example.com', 'docker-registry-credential-id') { ... } 来推拉镜像,并可能使用 sh 'docker run ...' 或编排工具命令(见下文)。

示例代码片段(Declarative Pipeline):

stage('Build and Push Docker Image') {
steps {
script {
def customImage = docker.build('my-org/myapp:${env.BUILD_NUMBER}')
docker.withRegistry('https://docker.io', 'dockerhub-credentials') {
customImage.push()
customImage.push('latest')
}
}
}
}
stage('Deploy to Kubernetes') {
// Requires Kubernetes CLI (kubectl) configured on agent and appropriate plugins
steps {
echo 'Deploying using kubectl...'
// Example: sh 'kubectl apply -f deployment.yaml'
// Or use Kubernetes pipeline steps: https://plugins.jenkins.io/kubernetes-cli/
}
}

主流云提供商都有专用的 Jenkins 插件,可实现无缝部署:

  • AWS: CodeDeploy、Elastic Beanstalk、S3、ECS、EKS、Lambda 的插件。使用这些插件提供的相应 Pipeline 步骤(例如 s3Upload、ecsDeploy)。
  • Azure: App Service、AKS、Azure Functions、Container Instances 的插件。使用相关步骤(例如 azureWebAppPublish)。
  • Google Cloud: GKE、App Engine、Cloud Functions、Cloud Run 的插件。使用 ‘Google Cloud SDK’ 或特定插件提供的步骤。

云平台的凭据应安全地存储在 Jenkins Credentials 中。

流水线通常不直接部署,而是将构建好的制品(JAR、WAR、NPM 包、Docker 镜像)发布到诸如 Nexus Repository Manager 或 JFrog Artifactory 的仓库中。下游流程或部署工具随后会拉取这些制品。

  • 前置条件: Nexus Platform 或 Artifactory 的插件。
  • 构建工具集成: 配置 Maven/Gradle/NPM 以发布到仓库。
  • Pipeline 步骤: 使用构建工具命令(mvn deploy、gradle publish)或专用插件步骤(nexusPublisher、rtUpload)。

最佳部署策略取决于您的应用程序架构、基础设施和团队实践。Jenkins 提供了实现各种方法的灵活性,通常可以在单个流水线中结合多种方法(例如,构建 Docker 镜像,推送到注册表,通过 SSH 或 Kubernetes 命令触发部署)。