“车”跑在Openshift上?--基于Openshift 3.11的持续部署工具链

版权说明:本文仅代表作者的个人观点。

跑在Openshift上的车-CHE,指的是Eclipse CHE。

Eclipse Che是一个现代的、开放源代码的软件开发环境。它是一个通过提供结构化的工作区、项目输入、模块化扩展插件来支持Codenvy的引擎。Che可以用作桌面IDE,RESTful工作空间服务器,或作为一个创建新的工具SDK。我们现在支持一个有标签的Docker images启动一个默认Eclipse Che。

  • 源代码从Gogs克隆、构建、测试,然后分析bug和错误的patterns
  • WAR工件被推送到Nexus Repository
  • 基于WildFly,部署Tasks应用程序WAR(tasks:latest)
  • 任务容器映像部署在DEV项目中的新容器中
  • 如果测试成功,则管道暂停,以便发布经理批准向STAGE发布
  • 如果获得批准,DEV image将在STAGE项目中标记。
  • image 部署在STAGE项目中的新容器中

首先,在环境中,有三个项目:

其中CI/CD项目中是整个CI/CD工具链:

而 DEV project和 STAGE project分别是应用的两个阶段。

应用是一个是一个war包,运行到wildfly上。

1.登录到Gogs上,查看源码:

查看pom.xml

浏览器登录运行在CI/CD项目中的CHE:

首先创建一个workspace:

import项目:

在源码中加一点内容,造成源码修改的现实:

提交代码以后,触发Pipeline的启动:

我们看一下pipeline的内容:

def version, mvnCmd = "mvn -s configuration/cicd-settings-nexus3.xml"

pipeline {

agent {

label 'maven'

}

stages {

stage('Build App') {

steps {

git branch: 'eap-7', url: 'http://gogs:3000/gogs/openshift-tasks.git'

script {

def pom = readMavenPom file: 'pom.xml'

version = pom.version

}

sh "${mvnCmd} install -DskipTests=true"

}

}

stage('Test') {

steps {

sh "${mvnCmd} test"

step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*.xml'])

}

}

stage('Code Analysis') {

steps {

script {

sh "${mvnCmd} sonar:sonar -Dsonar.host.url=http://sonarqube:9000 -DskipTests=true"

}

}

}

stage('Archive App') {

steps {

sh "${mvnCmd} deploy -DskipTests=true -P nexus3"

}

}

stage('Create Image Builder') {

when {

expression {

openshift.withCluster() {

openshift.withProject(env.DEV_PROJECT) {

return !openshift.selector("bc", "tasks").exists();

}

}

}

}

steps {

script {

openshift.withCluster() {

openshift.withProject(env.DEV_PROJECT) {

openshift.newBuild("--name=tasks", "--image-stream=jboss-eap70-openshift:1.5", "--binary=true")

}

}

}

}

}

stage('Build Image') {

steps {

sh "rm -rf oc-build && mkdir -p oc-build/deployments"

sh "cp target/openshift-tasks.war oc-build/deployments/ROOT.war"

script {

openshift.withCluster() {

openshift.withProject(env.DEV_PROJECT) {

openshift.selector("bc", "tasks").startBuild("--from-dir=oc-build", "--wait=true")

}

}

}

}

}

stage('Create DEV') {

when {

expression {

openshift.withCluster() {

openshift.withProject(env.DEV_PROJECT) {

return !openshift.selector('dc', 'tasks').exists()

}

}

}

}

steps {

script {

openshift.withCluster() {

openshift.withProject(env.DEV_PROJECT) {

def app = openshift.newApp("tasks:latest")

app.narrow("svc").expose();

openshift.set("probe dc/tasks --readiness --get-url=http://:8080/ws/demo/healthcheck --initial-delay-seconds=30 --failure-threshold=10 --period-seconds=10")

openshift.set("probe dc/tasks --liveness --get-url=http://:8080/ws/demo/healthcheck --initial-delay-seconds=180 --failure-threshold=10 --period-seconds=10")

def dc = openshift.selector("dc", "tasks")

while (dc.object().spec.replicas != dc.object().status.availableReplicas) {

sleep 10

}

openshift.set("triggers", "dc/tasks", "--manual")

}

}

}

}

}

stage('Deploy DEV') {

steps {

script {

openshift.withCluster() {

openshift.withProject(env.DEV_PROJECT) {

openshift.selector("dc", "tasks").rollout().latest();

}

}

}

}

}

stage('Promote to STAGE?') {

steps {

timeout(time:15, unit:'MINUTES') {

input message: "Promote to STAGE?", ok: "Promote"

}

script {

openshift.withCluster() {

openshift.tag("${env.DEV_PROJECT}/tasks:latest", "${env.STAGE_PROJECT}/tasks:${version}")

}

}

}

}

stage('Deploy STAGE') {

steps {

script {

openshift.withCluster() {

openshift.withProject(env.STAGE_PROJECT) {

if (openshift.selector('dc', 'tasks').exists()) {

openshift.selector('dc', 'tasks').delete()

openshift.selector('svc', 'tasks').delete()

openshift.selector('route', 'tasks').delete()

}

openshift.newApp("tasks:${version}").narrow("svc").expose()

openshift.set("probe dc/tasks --readiness --get-url=http://:8080/ws/demo/healthcheck --initial-delay-seconds=30 --failure-threshold=10 --period-seconds=10")

openshift.set("probe dc/tasks --liveness --get-url=http://:8080/ws/demo/healthcheck --initial-delay-seconds=180 --failure-threshold=10 --period-seconds=10")

}

}

}

}

}

}

}

登录到Jenkins里,查看进度:

登录SonarQube,查看代码review结果:

查看Rating为C的代码内容:

并给出了语法建议:

查看第二个bug代码:

并给出了语法建议:

Nexcus中查看war:

批准部署到Stage:

Pileline走完,部署成功:

验证部署的应用:

最后,验证一下我在源码中的变更:

这个对应源码中的:

参考链接:

https://github.com/siamaksade/openshift-cd-demo

原文发布于微信公众号 - 大魏分享(david-share)

原文发表时间:2018-10-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大魏分享(微信公众号:david-share)

厉害了!全CI/CD工具链的实现 | 基于OCP离线: Openshift3.9学习系列第五篇

干货巨献:Openshift3.9的网络管理大全.加长篇---Openshift3.9学习系列第二篇

3214
来自专栏刺客博客

(转载)灰常有趣的Docker镜像

2.1K3

了解微服务,第6部分:健康检查

随着我们的微服务和它们运营的环境变得越来越复杂,让我们的服务为Docker Swarm提供一种安全检查机制也变得日益重要。因此,我们将在博客系列的第六部分中介绍...

7253
来自专栏搜云库

Docker Registry Server 搭建,配置免费HTTPS证书,及拥有权限认证、TLS 的私有仓库

上一篇文章搭建了一个具有基础功能的私有仓库,这次来搭建一个拥有权限认证、TLS 的私有仓库。 环境准备 系统:Ubuntu 17.04 x64 IP:198.1...

4176
来自专栏jeremy的技术点滴

重搭docker集群

3585
来自专栏小狼的世界

kubeadm安装kubernetes V1.11.1 集群

如果想要用二进制方法安装最新版本的Docker,可以参考我之前的文章在Redhat 7.3中采用离线方式安装Docker

7491
来自专栏数据和云

故障分析:RAC环境下ORA-12545连接错误

崔华,网名 dbsnake Oracle ACE Director,ACOUG 核心专家 分享一则由于SCAN IP导致的连接故障 11gR2 RAC两节点的环...

2934
来自专栏技术翻译

Kubernetes揭秘:解决服务依赖问题

本系列文章探讨了企业客户在使用Kubernetes时遇到的一些常见问题。Container Service客户经常提出的一个问题是,“我如何处理服务之间的依赖关...

3992
来自专栏散尽浮华

记录一次redis cluster集群故障-运维笔记

公司的一个系统业务出现故障,提示查询redis失败。查询相关日志,分析过程记录如下:

3535
来自专栏Linyb极客之路

基于docker的微服务容器化与编排

在本人的微服务系列中,已经演示了各个spring cloud微服务组件的使用,以及相关的示例微服务应用。在每次启动微服务和对微服务进行扩容、缩容都不方便,本文使...

2013

扫码关注云+社区

领取腾讯云代金券