通过 Jenkins 管道在 Openshift 上部署微服务(spring 启动应用程序)

Deploy microservice (spring boot app) on Openshift via Jenkins pipeline

我需要通过 jenkins 在 openshift 中部署一个 spring 引导应用程序(docker image),为了实现这一点,我正在执行以下步骤,

  1. 我使用 jenkins 管道 'freestyle' 模板创建了 spring 启动应用程序的 docker 映像 -
  2. 在“Artifactory”注册表中推送 docker 图像

以上两个步骤已完成并有效,但我正在努力通过 詹金斯管道, 这似乎是一个常见的要求,但我没有找到任何好的文档,任何帮助将不胜感激。

不幸的是,您身边没有我可以扩展来为您提供复制粘贴解决方案的代码片段,但是,使用 Jenkins 部署到 Kubernetes 的最简单方法与部署其他代码的方法完全相同 CI/CD 工具,只需在管道中执行 kubeactl apply

为此,您的存储库中应该有一个名为 k8s(或类似文件夹)的文件夹,其中包含部署过程所需的所有文件:

Whosebug-repo
├── docker
│   └── Dockerfile
├── Jenkinsfile
├── k8s
│   ├── configmap.yaml
│   └── deployment.yaml
└── src
    └── main
        ├── java
        ├── main.java
        └── resources
            └── app.properties

出于安全原因,create a ServiceAccount or User in Kubernetes and assign it roles that are necessary for deployment (i.e. updating, patching and creating Services, Deployments and so on) using RBAC

还有使用 Kubernetes plugin for Jenkins 的选项,但是,它使用起来更复杂,并且会导致供应商锁定,我会尽量避免这种情况,尤其是因为 Jenkins 在某种程度上处于灭绝的道路上(与其他 CI/CD 提供的更简单、更快速、更高效的工具相比)。

请记住,许多现代 Kubernetes 架构 deploy via ArgoCD:

这是首选的原因是因为它使用了一种称为 GitOps 的方法,并且可以轻松地与任何 CI/CD 工具结合使用,因此更容易切换,因为 ArgoCD 正在执行实际部署.此外,它还提供了一个很好的 UI,为那些不习惯每天使用 Kubernetes 的人提供清晰易懂的信息。

说了这么多完全取决于你想走什么路,但请记住,在你的 Jenkinsfile 中一个简单的 kubectl apply -f k8s/ 将完全完成你想要的,只需要你放置一个 kubeconfig file 运行 管道可以访问它的某个地方(您可以通过执行类似 kubectl --kubeconfig /path/to/kubeconfig apply -f k8s/ 的操作来指定路径)。

有一些解决方案运行取决于您的承诺水平和所需的自动化 DevOps 集成水平:

  1. 快速而肮脏的解决方案 - 如果您将 oc 命令行工具插入到您的 Jenkins agents\slaves(如果您 运行 在机器或虚拟机上通常最好),您可以创建一个环境变量来保存应用程序名称,只要您使用 oc new-app 或类似的方式创建它,您就可以执行 oc import-image 后跟 ImageStream 名称 nad 它会检查 docker repo 标签中的更改版本散列(如果散列更改,它将更新它)。检查 here 基本令牌注入以避免密码通过 git.
  2. 泄露

示例 Jenkinsfile 片段:

pipeline {
    agent { 'jenkins_slave_vm' }
    environment {
        SERVICE='myapp'
    }

    stages {
        stage('build&push') {
            steps {
                sh "docker build -t myrepo/${SERVICE}:latest -f Dockerfile.production ."
                sh "docker push myrepo/${SERVICE}:latest"
            }
        }
        stage('deploy') {
            steps {
                sh "oc login --token=${OC_IMAGE_UPDATE_TOKEN}"
                sh "oc import-image ${SERVICE}"
            }
        }
    }
}
  1. 更强大的企业解决方案 - 使用 Jenkins 的 k8s\openshift 插件(不同的插件),通用的 k8s 插件用于启动 pods 所需的环境(如前端应用程序的节点) ,在使用结束时恢复,运行 构建阶段,同时使用 openshift BuildConfig 对象构建 docker\container 图像并将行为基于 Dockerfile 配置,S2I 或由 openshift 使用 pipeline 方法完全管理(尽管与其他两个方法相比更复杂且平台投资更多),here's 对 openshift 4.6 的一个相当最新的解释,尽管自版本 3.x 以来也存在.这种方法允许更具声明性、可重现性和长期一致的构建策略,并且是我们当前组织中目前使用的方法,用于节省资源和最初随着容器的兴起而来的一致性。

pipeline examples

  1. halfway - 使用来自 SCM 平台的 webhook 触发 openshift 构建(可以查看 here)。从 Jenkins 中删除了一些依赖(并且没有亲自测试过)但是如果你真的不能用其他选项做到这一点,这可能是最后一根稻草。