Jenkins 构建企业级 DevOps 容器云平台2

#配置 jenkins 连接到我们存在的 k8s 集群

(1)访问http://192.168.172.163:30002/configureClouds/新增一个云,在下拉菜单中选择 kubernets 并添加

(2)填写云 kubernetes 配置内容

kubernetes https://192.168.172.163:6443

如果是vip写vip地址

 (3)测试 jenkins 和 k8s 是否可以通信

点击连接测试,如果显示 Connection test successful 或者显示Connected to Kubernetes 1.20 说明测试成功,Jenkins 可以和 k8s 进行通信

kubectl get svc -n jenkins-k8s

NAME              TYPE      CLUSTER-IP      EXTERNAL-IP  PORT(S)                          AGE

jenkins-service  NodePort  10.109.88.145  <none>        8080:30002/TCP,50000:30814/TCP  108m

jenkins地址对应name

配置 k8s 集群的时候 jenkins 地址需要写上面域名的形式,配置之后执行如下: http://jenkins-service.jenkins-k8s.svc.cluster.local:8080 应用------>保存

#配置 pod-template

(1)配置 pod template

访问 http://192.168.172.163:30002/configureClouds/

添加 Pod 模板------>Kubernetes Pod Template--->按如下配置

(2)在上面的 pod template 下添加容器 添加容器------>Container Template------>按如下配置------>

Docker 镜像:使用 jenkins-jnlp.tar.gz 解压出来的镜像,把这个镜像上传到 k8s 的各 node 节 点,手动解压:docker load -i jenkins-jnlp.tar.gz

解压出来的镜像是 god/jenkins-jnlp:v1

在每一个 pod template 右下脚都有一个 Advanced,点击 Advanced,出现如下

在 Service Account 处输入 jenkins-k8s-sa,这个 sa 就是我们最开始安装 jenkins 时的 sa (3)给上面的 pod template 添加卷

添加卷------>选择 Host Path Volume

/var/run/docker.sock /var/run/docker.sock

/root/.kube /home/jenkins/.kube 上面配置好之后,应用------>保存

#添加 dockerhub 凭据

首页------>系统管理----→管理凭据--→全局--→添加凭据

添加自己的dockerhub用户

username:cadrcadr password:**** ID:dockerhub 描述:这个地方随便写 上面修改好之后选择确定即可

#测试通过 Jenkins 发布代码到 k8s 开发环境、测试环境、生产环境 在 k8s 的控制节点创建名称空间:

63 ~]# kubectl create ns devlopment namespace

63 ~]# kubectl create ns production namespace

63 ~]# kubectl create ns qatest namespace

回到 jenkins 首页:

pod模版 标签列表对应pipeline

新建一个任务

------>输入一个任务名称处输入 jenkins-variable-test-deploy------>流水线----- ->确定------>在 Pipeline script 处输入如下内容

node('testhan') {

    stage('Clone') {

        echo "1.Clone Stage"

        git url: "https://github.com/cadrcadr/jenkins-sample.git"

        script {

            build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()

        }

    }

    stage('Test') {

      echo "2.Test Stage"

    }

    stage('Build') {

        echo "3.Build Docker Image Stage"

        sh "docker build -t cadrcadr/jenkins-demo:${build_tag} ."

    }

    stage('Push') {

        echo "4.Push Docker Image Stage"

        withCredentials([usernamePassword(credentialsId: 'dockerhub', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {

            sh "docker login -u ${dockerHubUser} -p ${dockerHubPassword}"

            sh "docker push cadrcadr/jenkins-demo:${build_tag}"

        }

    }

    stage('Deploy to dev') {

        echo "5. Deploy DEV"

sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-dev-god.yaml"

      sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-dev-god.yaml"

//        sh "bash running-devlopment.sh"

        sh "kubectl apply -f k8s-dev-god.yaml  --validate=false"

}

stage('Promote to qa') {

def userInput = input(

            id: 'userInput',

            message: 'Promote to qa?',

            parameters: [

                [

                    $class: 'ChoiceParameterDefinition',

                    choices: "YES\nNO",

                    name: 'Env'

                ]

            ]

        )

        echo "This is a deploy step to ${userInput}"

        if (userInput == "YES") {

            sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-qa-god.yaml"

sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-qa-god.yaml"

//            sh "bash running-qa.sh"

            sh "kubectl apply -f k8s-qa-god.yaml --validate=false"

            sh "sleep 6"

            sh "kubectl get pods -n qatest"

        } else {

            //exit

        }

    }

stage('Promote to pro') {

def userInput = input(

            id: 'userInput',

            message: 'Promote to pro?',

            parameters: [

                [

                    $class: 'ChoiceParameterDefinition',

                    choices: "YES\nNO",

                    name: 'Env'

                ]

            ]

        )

        echo "This is a deploy step to ${userInput}"

        if (userInput == "YES") {

            sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-prod-god.yaml"

            sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-prod-god.yaml"

//            sh "bash running-production.sh"

            sh "cat k8s-prod-god.yaml"

            sh "kubectl apply -f k8s-prod-god.yaml --record --validate=false"

        }

    }

}

god 变成自己的 dockerhub 用户名 k8s-prod-god.yaml

应用------>保存------>立即构建 在左侧可以看到构建任务,如下所示:

点击 Console Output,可以看到 pipeline 定义的步骤的详细信息

点击 Input request,部署应用到预生产环境

点击 Input request,部署应用到生产环境

看到 Finished:SUCCESS,,说明 pipeline 构建任务完成

报错 1

解决方法:请修改 Pipeline script 处标签更改为自己的 dockerhub 的 username。

6、验证开发、预生产、生产环境部署的应用是否正常运行

]# kubectl get pods -n devlopment

NAME READY STATUS RESTARTS AGE

jenkins-demo-784885d9c9-b4jkg 1/1 Running 0

]#kubectl get pods -n qatest

NAME READY STATUS RESTARTS AGE jenkins-demo-784885d9c9-59tsm 1/1 Running 0 5m19s

]#kubectl get pods -n production

NAME READY STATUS jenkins-demo-784885d9c9-42hz4 1/1 running

Jenkins 管理插件 BlueOcean 配置和使用

# BlueOcean 是什么?

为了适应 Jenkins Pipeline 和 Freestyle jobs 任务,Jenkins 推出了 BlueOcean UI,其目的就 是让程序员执行任务时,降低工作流程的复杂度和提升工作流程的清晰度,它具有如下特征: 1、清晰的可视化:对 CI/CD pipelines, 可以快速直观的观察项目 pipeline 状态。

2、pipeline 可编辑:引导用户通过直观的、可视化的过程来创建 Pipeline,从而使 Pipeline 的创 建变得平易近人。

3、pipeline 精确度:通过 UI 直接介入 pipeline 的中间问题。

#安装 BlueOcean 插件 主页—>系统管理→插件管理→可选插件—>过滤 BlueOcean→直接安装

安装完成后,重启 jenkins

http://192.168.172.163:30002/restart

重启进入 jenkins 之后,在主页左侧可以看到打开 Blue Ocean

Jenkins 实现 k8s 应用按照指定版本回滚

回到首页:

新建一个任务------>输入一个任务名称处输入 jenkins-variable-test-deploy-rollout------>流水 线------>确定------>在 Pipeline script 处输入如下内容

node('testhan') {

  stage('git clone') {

    git url: "https://github.com/luckylucky421/jenkins-rollout"

    sh "ls -al"

    sh "pwd"

}

stage('select env') {

  def envInput = input(

    id: 'envInput',

    message: 'Choose a deploy environment',

    parameters: [

      [

        $class: 'ChoiceParameterDefinition',

        choices: "devlopment\nqatest\nproduction",

        name: 'Env'

      ]

    ]

)

echo "This is a deploy step to ${envInput}"

sh "sed -i 's/<namespace>/${envInput}/' getVersion.sh"

sh "sed -i 's/<namespace>/${envInput}/' rollout.sh"

sh "bash getVersion.sh"

// env.WORKSPACE = pwd()

// def version = readFile "${env.WORKSPACE}/version.csv"

// println version

}

stage('select version') {

  env.WORKSPACE = pwd()

def version = readFile "${env.WORKSPACE}/version.csv"

println version

  def userInput = input(id: 'userInput',

    message: '选择回滚版本',

    parameters: [

      [

        $class: 'ChoiceParameterDefinition',

        choices: "$version\n",

        name: 'Version'

      ]

        ]

)

    sh "sed -i 's/<version>/${userInput}/' rollout.sh"

}

stage('rollout deploy') {

    sh "bash rollout.sh"

}

}

点击应用->保存-立即构建

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容