Yellow 就怕你碌碌无为,还安慰自己平凡可贵 -------------yolo

利用K8S的jenkins动态slave+gitee + dockerhub实现完整的develops

环境要求

  完整的K8S环境+gitee账号+dockerhub账号

实现目标

  由于是简单测试 本次使用一个简单的nginx镜像 然后自定义首页来实现效果

简单的逻辑结构

  1 首先梳理整个步骤 首先开发人员需要在本地调试代码并且运维人员写好dockerfile 同时写好K8S的yaml,本次实验用的是jenkinsfile 所以还需要编写好jenkinsfile

       2  简单的代码目录结构如下

 

 

   3 结构梳理

  • jenkins点击构建之后回去代码库拉代码
  • 由于我们选择了Jenkinsfile 所以代码拉去之后会按照Jenkinsfile 里面的内容执行 
  •  Jenkinsfile 内容为pipeline 由Groovy 编写 所以我们按照我们的需求编写 我的pipeline如下

node('haimaxy-jnlp') {
    stage('Prepare') {
        echo "1.Prepare Stage"
        checkout scm
        script {
            build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
   
            if (env.BRANCH_NAME != 'master') {
                build_tag = "${env.BRANCH_NAME}-${build_tag}"
            }
        }
    }
    stage('Test') {
      echo "2.Test Stage"
    }
    stage('Build') {
        echo "3.Build Docker Image Stage"
        sh "docker build -t zfno111/nginx-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 zfno111/nginx-demo:${build_tag}"
        }
    }
    stage('Deploy') {
        echo "5. Deploy Stage"
        if (env.BRANCH_NAME == 'master') {
            input "确认要部署线上环境吗?"
        }
        sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s.yaml"
        sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s.yaml"
        sh "kubectl apply -f k8s.yaml --record"
    }
}

  关于上面的内容做一个简单理解:  

  node('haimaxy-jnlp') jenkins部署内容 实现动态slave, 

  stage('Prepare') 这个阶段取出build_tag这个后续也会给docker镜像用,如果分支是主分支名字前面会加上master

  Build阶段完成docker镜像打包 按照dockerfile打包,这里会用到build_tag

  Push阶段 把docker推送到dockerhub上并且打上标签

  Deploy阶段 实施部署按照K8S.yaml里面的内容实现 同时更改一些标签

K8S.yaml内容如下

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
  namespace: default
spec:
  selector:
    matchLabels:
      app: nginx-demo
  template:
    metadata:
      labels:
        app: nginx-demo
    spec:
      containers:
      - image: zfno111/nginx-demo:<BUILD_TAG>
        imagePullPolicy: IfNotPresent
        name: nginx-demo
        env:
        - name: branch
          value: <BRANCH_NAME>

    这里完成将容器部署到集群的操作

接下来看下实战效果

比如我们修改了Nginx的前端页面 

    echo "这是第一次测试的首页文件" > index.html
 
然后我们在jenkins上面打包

 

 等待完成之后

 

 由于我们没有使用svc和igress所以直接curl K8S内部的集群端口

 

 发现正常

 

 

后记。。 其实在做整个CD之前还有需要插件和细节  比如JENKINS master-slave的动态部署    jenkins优化 与K8S的关联等等等  后续有时间再来详解

 

posted @ 2021-04-16 16:52  zfno11  阅读(488)  评论(0编辑  收藏  举报