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

跑在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"

label 'maven'

stage('Build App') {

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

def pom = readMavenPom file: 'pom.xml'

version = pom.version

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

stage('Test') {

sh "${mvnCmd} test"

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

stage('Code Analysis') {

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

stage('Archive App') {

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

stage('Create Image Builder') {

expression {

openshift.withCluster() {

openshift.withProject(env.DEV_PROJECT) {

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

openshift.withCluster() {

openshift.withProject(env.DEV_PROJECT) {

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

stage('Build Image') {

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

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

openshift.withCluster() {

openshift.withProject(env.DEV_PROJECT) {

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

stage('Create DEV') {

expression {

openshift.withCluster() {

openshift.withProject(env.DEV_PROJECT) {

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

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) {

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

stage('Deploy DEV') {

openshift.withCluster() {

openshift.withProject(env.DEV_PROJECT) {

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

stage('Promote to STAGE?') {

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

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

openshift.withCluster() {

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

stage('Deploy STAGE') {

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走完,部署成功:

验证部署的应用:

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

这个对应源码中的:

参考链接: