通过 Jenkins 管道在 Openshift 上部署微服务(spring 启动应用程序)
Deploy microservice (spring boot app) on Openshift via Jenkins pipeline
我需要通过 jenkins 在 openshift 中部署一个 spring 引导应用程序(docker image),为了实现这一点,我正在执行以下步骤,
- 我使用 jenkins 管道 'freestyle' 模板创建了 spring 启动应用程序的 docker 映像 -
- 在“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
还有使用 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 集成水平:
- 快速而肮脏的解决方案 - 如果您将
oc
命令行工具插入到您的 Jenkins agents\slaves(如果您 运行 在机器或虚拟机上通常最好),您可以创建一个环境变量来保存应用程序名称,只要您使用 oc new-app
或类似的方式创建它,您就可以执行 oc import-image
后跟 ImageStream 名称 nad 它会检查 docker repo 标签中的更改版本散列(如果散列更改,它将更新它)。检查 here 基本令牌注入以避免密码通过 git. 泄露
示例 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}"
}
}
}
}
- 更强大的企业解决方案 - 使用 Jenkins 的 k8s\openshift 插件(不同的插件),通用的 k8s 插件用于启动 pods 所需的环境(如前端应用程序的节点) ,在使用结束时恢复,运行 构建阶段,同时使用 openshift BuildConfig 对象构建 docker\container 图像并将行为基于
Dockerfile
配置,S2I
或由 openshift 使用 pipeline
方法完全管理(尽管与其他两个方法相比更复杂且平台投资更多),here's 对 openshift 4.6 的一个相当最新的解释,尽管自版本 3.x 以来也存在.这种方法允许更具声明性、可重现性和长期一致的构建策略,并且是我们当前组织中目前使用的方法,用于节省资源和最初随着容器的兴起而来的一致性。
- halfway - 使用来自 SCM 平台的 webhook 触发 openshift 构建(可以查看 here)。从 Jenkins 中删除了一些依赖(并且没有亲自测试过)但是如果你真的不能用其他选项做到这一点,这可能是最后一根稻草。
我需要通过 jenkins 在 openshift 中部署一个 spring 引导应用程序(docker image),为了实现这一点,我正在执行以下步骤,
- 我使用 jenkins 管道 'freestyle' 模板创建了 spring 启动应用程序的 docker 映像 -
- 在“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
还有使用 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 集成水平:
- 快速而肮脏的解决方案 - 如果您将
oc
命令行工具插入到您的 Jenkins agents\slaves(如果您 运行 在机器或虚拟机上通常最好),您可以创建一个环境变量来保存应用程序名称,只要您使用oc new-app
或类似的方式创建它,您就可以执行oc import-image
后跟 ImageStream 名称 nad 它会检查 docker repo 标签中的更改版本散列(如果散列更改,它将更新它)。检查 here 基本令牌注入以避免密码通过 git. 泄露
示例 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}"
}
}
}
}
- 更强大的企业解决方案 - 使用 Jenkins 的 k8s\openshift 插件(不同的插件),通用的 k8s 插件用于启动 pods 所需的环境(如前端应用程序的节点) ,在使用结束时恢复,运行 构建阶段,同时使用 openshift BuildConfig 对象构建 docker\container 图像并将行为基于
Dockerfile
配置,S2I
或由 openshift 使用pipeline
方法完全管理(尽管与其他两个方法相比更复杂且平台投资更多),here's 对 openshift 4.6 的一个相当最新的解释,尽管自版本 3.x 以来也存在.这种方法允许更具声明性、可重现性和长期一致的构建策略,并且是我们当前组织中目前使用的方法,用于节省资源和最初随着容器的兴起而来的一致性。
- halfway - 使用来自 SCM 平台的 webhook 触发 openshift 构建(可以查看 here)。从 Jenkins 中删除了一些依赖(并且没有亲自测试过)但是如果你真的不能用其他选项做到这一点,这可能是最后一根稻草。