前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >“车”跑在Openshift上?--基于Openshift 3.11的持续部署工具链

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

作者头像
魏新宇
发布2018-12-05 15:41:42
1.4K0
发布2018-12-05 15:41:42
举报

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大魏分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档