zoukankan      html  css  js  c++  java
  • k8s版jenkins--master/slave模式实现CI/CD---带solo开源博客项目--带maven、djk、git工具

    k8s环境:
    
    192.168.0.91       master 
    
    192.168.0.92       node

    192.168.0.96 gitlab

    192.168.0.98 harbor

    k8s集群安装请参照:https://www.cnblogs.com/effortsing/p/10312081.html

    gitlab安装请参照:https://www.cnblogs.com/effortsing/p/10012158.html

    arbor安装请参照:https://www.cnblogs.com/effortsing/p/10061096.html
     

    配置jenkins主机上的docker可以登录harbor仓库并且上传镜像到harbor仓库:参照:https://www.cnblogs.com/effortsing/p/10061096.html

     
    下面所有操作都是在node节点:192.168.0.92上进行
    
    
    1、生成自定义Jenkins master镜像
    
    原始的Jenkins master镜像并不符合我们当前需求,所以在原始镜像的基础上做了一些改变,这一步并不是必须的,主要是看具体需求
    
    下载原始镜像
    
    链接:https://pan.baidu.com/s/14z5BnFAXYoMnDoXbiNgmuQ 
    提取码:ecsq
    
    
    导入镜像
    
    docker load < jenkinsci.tar
    
    
    查看镜像
    
    [root@test2 ~]# docker images
    jenkinsci/jenkins                                                 latest              b589aefe29ff        3 months ago        703 MB
    
    
    
    编写Dockerfile:

    cat>/home/jenkins-dockerfile/Dockerfile <<EOF
    FROM jenkinsci/jenkins
    USER root
    RUN apt-get update && apt-get install -y libltdl7.*
    RUN apt-get install maven -y

    RUN apt-get install git -y
    ARG dockerGid=999
    RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group
    RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
    RUN mkdir -p /opt/maven/repository
    RUN mkdir -p /ceph/maven/repository
    EOF

    
    
    该Dockerfile所做的工作为:
     
    安装Maven 
    
    配置Maven仓库位置,以便启动时挂载宿主机仓库为容器中Maven仓库
    
    设置启动用户为root

    把jenkins加入docker组,否则无法使用宿主机的docker

    安装libltdl7.* 库,否则无法使用宿主机的docker 构建镜像 docker build
    -t jenkinsci/jenkins:v1 /home/jenkins-dockerfile/ Jenkins启动YAML配置文件 jenkins命令空间创建 cat >namespace-jenkins.yaml<<EOF apiVersion: v1 kind: Namespace metadata: name: jenkins labels: name: jenkins EOF Jenkins 权限配置 此处直接将jenkins-admin集成了cluster-admin权限,可根据自己具体需要进行权限的设置 cat>jenkins-account.yaml<<EOF apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: jenkins name: jenkins-admin namespace: jenkins --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: jenkins-admin labels: k8s-app: jenkins subjects: - kind: ServiceAccount name: jenkins-admin namespace: jenkins roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io EOF Jenkins Deployment配置 此处配置简单明了,需要说明的地方是挂在卷,此处挂载了四个目录,下面分别做出挂载原因: /var/jenkins_home(容器) –> /ceph/jenkins_home(宿主机) 我们需要将容器中的Jenkins源目录挂载导本地宿主机,因为该目录下保存了Jenkins产生的所有配置、我们的自定义配置、任务配置及详情等等信息,>所以需要持久化导宿主机,以便重新启动Jenkins容器的时候能够找到相应数据,防止数据丢失。此处我们使用的ceph,保证整个kubernetes集群所有机 器能够共享同一个目录。 /opt/maven/repository(容器) –> /ceph/maven/repository(宿主机) 这一对挂载目录是Maven仓库的挂载目录,不管是Jenkins master容器或者是Jenkins slave目录都需要挂载该目录,以便容器中maven能够在下载编译代 码时能够从该仓库中找到相应Jar包,同时也保证了数据的持久化。 /usr/bin/docker(容器) –> /usr/bin/docker(宿主机) /var/run/docker.sock(容器) –> /var/run/docker.sock(宿主机) 这两对挂载目录作用是能够在容器中操作宿主机docker,具体的用途是在slave容器中编辑maven代码并生成jar之后,需要生成该代码服务的docker镜像 并上传至本地私有仓库。因此需要操作宿主机docker以便完成这一系列操作 --------------------- cat>jenkins-deployment.yaml<<EOF apiVersion: apps/v1beta2 kind: Deployment metadata: name: jenkins namespace: jenkins labels: k8s-app: jenkins spec: replicas: 1 selector: matchLabels: k8s-app: jenkins template: metadata: labels: k8s-app: jenkins spec: containers: - name: jenkins image: jenkinsci/jenkins:v1 imagePullPolicy: IfNotPresent volumeMounts: - name: jenkins-home mountPath: /var/jenkins_home - name: maven-repository mountPath: /opt/maven/repository - name: docker mountPath: /usr/bin/docker - name: docker-sock mountPath: /var/run/docker.sock ports: - containerPort: 8080 - containerPort: 50000 volumes: - name: jenkins-home hostPath: path: /ceph/jenkins_home - name: maven-repository hostPath: path: /ceph/maven/repository - name: docker hostPath: path: /usr/bin/docker - name: docker-sock hostPath: path: /var/run/docker.sock serviceAccountName: jenkins-admin EOF Jenkins Service配置 该Service配置作用是能够让用户访问到Jenkins。此处开放并配置了8080、32000端口,这两个端口在Deployment 中也应该开放。此处配置的宿主机开放端口分别为:31888、32000 cat>jenkins-service.yaml<<EOF kind: Service apiVersion: v1 metadata: labels: k8s-app: jenkins name: jenkins namespace: jenkins annotations: prometheus.io/scrape: 'true' spec: ports: - name: jenkins port: 8080 nodePort: 31888 targetPort: 8080 - name: jenkins-agent port: 50000 nodePort: 50000 targetPort: 50000 type: NodePort selector: k8s-app: jenkins EOF 启动Jenkins镜像容器 kubectl create -f namespace-jenkins.yaml kubectl apply -f jenkins-account.yaml kubectl apply -f jenkins-deployment.yaml kubectl apply -f jenkins-service.yaml
    2、生成自定义Jenkins slave镜像 需要使用官方镜像cnych-jenkins,其他的镜像里面都没有kubectl工具,都试过。我这里把官方镜像存到网盘里面了,方便以后使用 下载带kubectl版jenkins镜像

    链接:https://pan.baidu.com/s/1RyxKgbHLFTLYqH6ndA_tAg
    提取码:7sy3

    导入镜像
    
    docker load < cnych-jenkins-jnlp.tar
    
    编写Dockerfile: 
    

    cat>/home/jenkins-dockerfile/Dockerfile <<EOF
    FROM cnych/jenkins:jnlp
    USER root
    RUN apt-get update && apt-get install -y libltdl7.*
    RUN apt-get install maven -y

    RUN apt-get install git -y
    ARG dockerGid=999
    RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group
    RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
    RUN mkdir -p /opt/maven/repository
    RUN mkdir -p /ceph/maven/repository
    EOF

    该Dockerfile所做的工作为:
     
    安装Maven
    
    配置Maven仓库位置,以便启动时挂载宿主机仓库为容器中Maven仓库
    
    设置启动用户为root
    
    
    构建镜像
    
    docker build -t cnych/jenkins:v1 /home/jenkins-dockerfile/
    
    
    查看镜像
    
    [root@test2 ~]# docker images
    REPOSITORY                                                        TAG                 IMAGE ID            CREATED             SIZE
    cnych/jenkins                                                     v1                  969993fe2aa9        23 seconds ago      2.2 GB
    jenkinsci/jenkins                                                 v1                  2114cb298e17        About an hour ago   1.41 GB
    cnych/jenkins                                                     jnlp                a430a5795102        12 days ago         628 MB
    jenkinsci/jenkins                                                 latest              b589aefe29ff        3 months ago        703 MB
    coredns/coredns                                                   1.2.0               da1adafc0e78        7 months ago        34.2 MB
    infoblox/dnstools                                                 latest              d0cee038721f        8 months ago        15.7 MB
    registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel                 v0.10.0-amd64       b949a39093d6        10 months ago       44.6 MB
    registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64   3.1                 da86e6ba6ca1        14 months ago       742 kB
    
    
    3、访问并操作Jenkins-master
    
    访问jenkins
    
    http://192.168.0.92:31888
    
    查看密码
    
    [root@test2 ~]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    6f8a62f8a0f7        2114cb298e17        "/sbin/tini -- /us..."   About an hour ago   Up About an hour                        k8s_jenkins_jenkins-7b46757695-4hx6f_jenkins_e8cb1035-3fe6-11e9-a258-000c2980fc47_0
    
    docker exec 6f8a62f8a0f7 cat /var/jenkins_home/secrets/initialAdminPassword
    471234cd0eb44ec3bfc4015fbacd599b
    
    然后会要求安装一些插件,这里选择默认安装,否则下一步打开是空白页
    
    
    设置登录用户名密码:
    
    admin/jenkins@123
    
    
    这时候会跳转到首页, 此时Jenkins就可以真正使用了: 
    
    
    对jenkins进行升级
    
    
    重启jenkins(有点慢,等5分钟)
    
    
    刷新网页重新登录
    
    admin/471234cd0eb44ec3bfc4015fbacd599b
    
    
    
    查看更新后的版本
    
    
    重置admin密码
    
    进入首页-》系统管理-》全局安全配置
    
    把“启用安全”勾上和把Jenkins专有用户数据库勾上、允许用户注册勾上-》保存
    
    点击右上角的admin-》设置-》修改里面的密码为(jenkins@123)-》保存-》重新登录-》输入账号密码
    
    
    
    需要安装的插件
    Kubernetes Cli Plugin:该插件可直接在Jenkins中使用kubernetes命令行进行操作。
    
    Kubernetes plugin: 使用kubernetes则需要安装该插件
    
    Kubernetes Continuous Deploy Plugin:kubernetes部署deploymrnt.yaml 时候需要使用
    
    
    进入首页-》系统管理-》插件管理-》可选插件-》输入kubernetes-》选中所有带kubernetes的插件进行安装-》安装完返回首页
    
    
    查看所有带kubernetes的插件是否安装上
    
    进入首页-》系统管理-》插件管理-》已安装-》输入kubernetes-》
    
    也可登录该网站:https://plugins.jenkins.io/,查找需要的插件
    
    
    增加一个kubernetes云
    
    点击 系统管理->系统设置,往下拉可看到云,点击新增一个云来新增一个kubernetes云
    
    
    
    配置jenkins连接kubernetes
    
    请参照:https://www.cnblogs.com/effortsing/p/10013441.html
    
    
    配置Kubernetes Pod Template
    
    其实就是配置Jenkins的jnlp-slave
    
    在该kubernetes云下,新增Kubernetes Pod Template,配置一个模板容器配置,如下图所示:




    配置镜像,下面里面的镜像一定要写对,否则写成别的镜像,到最后编译时候就一直报错没有mvn



    配置卷:就是deployment.yaml 里面的挂载路径



    全局配置(非必须) 点击 系统管理
    ->系统设置,下拉找到全局属性,可根据需要配置Java环境变量、Maven环境变量 全局工具配置 点击 系统管理->全局工具配置,此处可配置配置一些常用的工具配置,比如java、ant、maven、docker 参照:https://www.cnblogs.com/effortsing/p/10375689.html 4、创建Pipeline测试任务 Pipeline任务采用流式的处理方法,步骤清晰,非常适合进行任务配置。点击新建 创建一个Pipeline任务 创建完成后,会进入任务配置界面,下拉找到Pipeline(中文版为:流水线),则可编写Pipeline,进行任务配置

    下面pipline里面的简单任务:查看slave镜像里面是否有java的家目录、查看maven的版本等操作,
    def label = "jnlp-slave" podTemplate(label: label, cloud: 'kubernetes',containers: [ containerTemplate(name: 'jnlp-slave', image: 'cnych/jenkins:v1') ], volumes: [hostPathVolume(mounntPath:'/opt/maven/repository',hostPath:'/ceph/maven/repository'), hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'), hostPathVolume(mounntPath:'/var/run/docker.sock',hostPath:'/var/run/docker.sock')]) { node(label) { stage('Get a Maven project') { container(label) { stage('wait for exec check'){ sh 'sleep 1'
    sh 'echo $JAVA_HOME'
    sh 'mvn -v' } stage(
    'get maven env') { sh 'cat /etc/resolv.conf' sh 'cat /etc/issue' sh 'uname -a' sh 'env' } } } } }

    查看pod个数:

    [root@test2 ~]# kubectl get pod -n jenkins
    NAME READY STATUS RESTARTS AGE
    jenkins-7b46757695-5k5lg 1/1 Running 0 4h

    
    开始构建





    查看pod个数:

    发现多了一个pod

    [root@test2 ~]# kubectl get pod -n jenkins
    NAME READY STATUS RESTARTS AGE
    jenkins-7b46757695-5k5lg 1/1 Running 0 4h
    jnlp-slave-65srw 2/2 Running 0 23s


    构建成功如下图:


    查看pod个数
    [root@test2 ~]# kubectl get pod -n jenkins

    NAME READY STATUS RESTARTS AGE
    jenkins-7b46757695-5k5lg 1/1 Running 0 4h
    jnlp-slave-65srw 2/2 Terminating 0 31s

    
    
    再次查看pod个数:发现消失


    从上边的pod个数变化中,我们可以清晰的看到 Jenkins Slave 自动创建到注销删除的过程,整个过程是自动完成的,不需要人工干预。

    [root@test2 ~]# kubectl get pod -n jenkins
    NAME READY STATUS RESTARTS AGE
    jenkins-7b46757695-5k5lg 1/1 Running 0 4h

     
    4、配置容器版jenkins使用宿主机的kubectl命令
    
    
    4.1、slave镜像需要使用cnych/jenkins:jnlp,这个官方镜像里面有kubectl工具,其他的没有,都试过,上面就是用的这个镜像,所以直接下一步
    
    
    4.2、挂载kubectl工具
    
    /root/.kube 目录,我们将这个目录挂载到容器的 /home/jenkins/.kube 目录下面这是为了让我们能够在 Pod 的容器中能够使用 kubectl 工具来访问我们的 Kubernetes 集群,
    
    方便我们后面在 Slave Pod 部署 Kubernetes 应用。添加一个挂在路径,如下图所示:
    
    4.3、pipline脚本如下: 先试试是否能使用宿主机的kubectl命令,只查看一个pod情况: def label = "jnlp-slave" podTemplate(label: label, cloud: 'kubernetes',containers: [ containerTemplate(name: 'jnlp-slave', image: 'cnych/jenkins:v1') ], volumes: [hostPathVolume(mounntPath:'/opt/maven/repository',hostPath:'/ceph/maven/repository'), hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'), hostPathVolume(mounntPath:'/var/run/docker.sock',hostPath:'/var/run/docker.sock'), hostPathVolume(mounntPath:' /home/jenkins/.kube',hostPath:'/root/.kube')]) { node(label) { stage('Get a Maven project') { container(label) { stage('wait for exec check'){ sh 'kubectl get pod -n jenkins' } } } } } 4.4、点击开始构建,如下图所示:

    4.5、查看控制台输出,如下图所示:

    
    
    
    
    
    
    
    5、使用jenkins-salve创建一个nignx项目pod
    
    5.1、导入nginx镜像
    
    下载镜像:链接:https://pan.baidu.com/s/1ZvjakBRYNWN3FFSIz0O78g 
    提取码:8nfj 
    
    
    rz nginx.tar
    
    docker load < nginx.tar
    
    
    5.2、pipline脚本如下:
    
    def label = "jnlp-slave"
    podTemplate(label: label, cloud: 'kubernetes',containers: [
        containerTemplate(name: 'jnlp-slave', image: 'cnych/jenkins:v1')
      ],
      volumes: [hostPathVolume(mounntPath:'/opt/maven/repository',hostPath:'/ceph/maven/repository'),
                hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'),
                hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'),
                hostPathVolume(mounntPath:' /home/jenkins/.kube',hostPath:'/root/.kube')]) {
        node(label) {
            stage('create a pod') {
                container(label) {
                    stage('cat the pod'){
                        sh 'kubectl get pod -n jenkins'
                    }
     
            stage('create the deploy-nginx.yaml'){
    echo 'create the deploy-nginx.yaml'
    sh '''
    cat >deploy-nginx.yaml<<EOF
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: http-test-dm2
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            name: http-test-dm2
        spec:
          containers:
          - name: http-test-con
            image: nginx
            imagePullPolicy: Never      
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: http-nginx-ser
    spec:
      type: NodePort
      ports: 
      - port: 80
        nodePort: 31000
        targetPort: 80
      selector:
        name: http-test-dm2
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: nginx
    spec:
      rules:
      - host: www.nginx2.com      
        http:
          paths:
          - path: /
            backend:
              serviceName: http-nginx-ser
              servicePort: 80
    EOF
    
    '''
                }
                    stage('deploy to k8s'){
                        sh 'kubectl create -f deploy-nginx.yaml'
                        
                    }
                  
                }
            }
        }
    }
    
    
    
    5.3、点击开始构建,如下图所示:
    
    
    5.4、查看构建好的pod,pod默认会放在在上面第3步中配置的命名空间下, [root@test2 ~]# kubectl get pod -n jenkins NAME READY STATUS RESTARTS AGE http-test-dm2-b9776b68c-8b7tk 1/1 Running 0 18s jenkins-7b46757695-5k5lg 1/1 Running 6 13d jnlp-slave-pzwtc 2/2 Terminating 0 31s [root@test2 ~]# kubectl get pod -n jenkins NAME READY STATUS RESTARTS AGE http-test-dm2-b9776b68c-8b7tk 1/1 Running 0 1m jenkins-7b46757695-5k5lg 1/1 Running 6 13d 从上面看到:http-test-dm2-b9776b68c-8b7tk 这就是刚创建的nginx容器 5.4、测试访问nginx,如下图所示: http://192.168.0.92:31000

    
    
    6、使用jenkins-salve创建一个solo开源博客项目pod(看视频是使用下面方式部署的,)
    
    参照:https://www.cnblogs.com/effortsing/p/10468840.html
    
    
    6.1、配置jenkins-slave主机节点可以免密登录harbor仓库
    
    参照:https://www.cnblogs.com/effortsing/p/10060748.html
    
    
    6.2、配置jenkins-slave主机节点上的docker可以登录harbor仓库并且上传镜像到harbor仓库
    
    参照:https://www.cnblogs.com/effortsing/p/10061096.html
    
    
    6.3、配置jenkins全局工具:添加git工具
    
    进入jenkins界面的全局工具配置里面选择自动安装git工具,目的是拉取gitlab代码
    
    
    6.4、配置jenkins全局工具:配置jdk、maven家目录,参照:https://www.cnblogs.com/effortsing/p/10480972.html
    
    
    6.5、配置jenkins全局工具:添加settings.xml,Maven Configuration -> Settings file in filesystem -> File Path  /usr/share/maven/conf/settings.xml
    
    setting.xml需要进到容器里面查看所在的位置,添加操作如下图所示:


    6.6、 安装Pipeline Maven Integration 插件 6.7、下载solo源码包、修改代码访问地址、推送到gitlab代码仓库中,参照:https://www.cnblogs.com/effortsing/p/10468840.html 6.8、配置jenkins-master、jenkins-slave主机上的git秘钥到gitlab上实现拉取代码功能, 参照:https://www.cnblogs.com/effortsing/p/10482792.html 6.9、生成pipeline可以用的git链接地址,写到pipline脚本中,这样在pipline脚本才可以从gitlab上拉取代码 参照:https://www.cnblogs.com/effortsing/p/10468840.html 里面的步骤 6.10、编写pipline脚本如下:


    注意下面pipline脚本里面的 maven build步骤,里面的JAVA_HOME和mvn工具 都是jenkins-slave里面的,而不是jenkins-master里面的工具,

    如何查看jenkins-slave里面JAVA_HOME位置:只有通过构建的时候,在pipline里面写shell命令进行查看,因为制作jenkins-slave镜像的基础

    镜像是从官方镜像拉取的,而这个官方jenkins-slave镜像是不能独立启动的,试过,用docker无法启动,只能当slave使用。但是为什么还要用这个

    镜像,就是因为这个基础镜像里面包含kubectl工具, 自己之前尝试往jenkins-master镜像里面添加kubectl工具,但是失败,


    注意:下面piplene里面的第三个stage步骤里面的JAVA_HOME路径是第一个stage步骤mvn -v 得到的结果有java路径,要填写这个,不要填写echo $JAVA_HOME得到的结果

    先编译构建一下,然后得到mvn -v 结果后,及时暂停,然后把java路径填写到第三个stage步骤里面,从新编译打包
    def label = "jnlp-slave" podTemplate(label: label, cloud: 'kubernetes',containers: [ containerTemplate(name: 'jnlp-slave', image: 'cnych/jenkins:v1') ], volumes: [hostPathVolume(mounntPath:'/opt/maven/repository',hostPath:'/ceph/maven/repository'), hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'), hostPathVolume(mounntPath:'/usr/bin/docker',hostPath:'/usr/bin/docker'), hostPathVolume(mounntPath:' /home/jenkins/.kube',hostPath:'/root/.kube')]) { node(label) { stage('create a pod') { container(label) { stage('cat the pod'){ sh 'kubectl get pod -n jenkins'
    sh 'echo $JAVA_HOME'
    sh 'mvn -v' } stage('git checkout'){ echo 'git clone' checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'c2ca4523-96d0-4fdc-a427-bfefc36a3aa5', url: 'http://192.168.0.96:8081/root/hello.git']]]) } stage('maven build'){ echo 'maven build' sh ''' export JAVA_HOME=/usr/local/newhope/java1.8 /usr/bin/mvn clean package -Dmaven.test.skip=true ''' } stage('docker build and push images'){ echo 'docker build and push images' sh ''' REPOSITORY=192.168.0.98:5000/library/solo/solo:${Tag} cat >Dockerfile<<EOF FROM 192.168.0.98:5000/library/tomcat-85:latest RUN rm -rf /usr/local/tomcat/webapps/ROOT/ COPY target/*.war /usr/local/tomcat/webapps/ROOT.war WORKDIR /usr/local/tomcat EXPOSE 8080 CMD ["./bin/catalina.sh", "run"] EOF docker build -t $REPOSITORY . docker login -u admin -p Harbor12345 192.168.0.98:5000 docker push $REPOSITORY ''' } stage('create the deploy-solo.yaml'){ echo 'create the deploy-solo.yaml' sh ''' REPOSITORY=192.168.0.98:5000/library/solo/solo:${Tag} cat >deploy-solo.yaml<<EOF apiVersion: extensions/v1beta1 kind: Deployment metadata: name: http-solo-dm2 spec: replicas: 1 template: metadata: labels: name: http-solo-dm2 spec: containers: - name: http-solo-con image: $REPOSITORY imagePullPolicy: Never ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: http-solo-ser spec: type: NodePort ports: - port: 8080 nodePort: 33580 targetPort: 8080 selector: name: http-solo-dm2 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: solo spec: rules: - host: www.solo.com http: paths: - path: / backend: serviceName: http-solo-ser servicePort: 8080 EOF ''' } stage('deploy to k8s'){ sh 'kubectl create -f deploy-solo.yaml' } } } } }

    上面pipline脚本做的事情如下:

    查看JAVA_HOME

    查看maven版本

    
    

    拉取代码:git checkout

    
    

    编译打包:maven build

    
    

    构建并推送镜像:docker build and push images

    
    

    创建yaml文件:create the deploy-solo.yaml

    
    

    部署到k8s集群里面:deploy to k8s

    6.11、启用Tag标签,参照:https://www.cnblogs.com/effortsing/p/10468840.html 里面的步骤
    
    
    6.12、开始构建,参照:https://www.cnblogs.com/effortsing/p/10468840.html 里面的步骤
    
    

    6.13、构建成功如下图所示:

    
    
    
    
    


    6.14、查看harbor仓库,多出来个镜像,如下图所示

    
    

    http://192.168.0.98:5000

    
    


    6.15、查看pod,多出来个pod,但不是Running状态

    
    

    [root@test2 ~]# kubectl get pod -n jenkins
    NAME                   READY         STATUS           RESTARTS          AGE
    http-solo-dm2-76676d9cfc-vh6gg   0/1               CrashLoopBackOff      6                      7m
    jenkins-7b46757695-tjh2j         1/1               Running               2                      11h

    
    


    查看报错日志如下:

    
    

    kubectl logs -f pods/http-solo-dm2-76676d9cfc-vh6gg -n jenkins

    
    

    [ERROR]-[2019-03-25 13:25:04]-[org.b3log.latke.Latkes:836]: Read skin [Jane]'s configuration failed: null
    [ERROR]-[2019-03-25 13:25:04]-[org.b3log.solo.SoloServletListener:302]: Can't load the default skins, please make sure skin [Jane] is under skins directory and structure correctly

    
    

    分析:可能是代码问题,可能是项目推送到gitlab上的位置不正确,这个需要结合研发来解决,做到这里已经不错了。自己搞很难的,这个暂时先放下,

     
    
    

    6.17、查看svc,多出来个svc

    
    

    [root@test2 ~]# kubectl get svc -n jenkins
    NAME                   TYPE             CLUSTER-IP             EXTERNAL-IP           PORT(S)                          AGE
    http-solo-ser          NodePort         10.100.197.60          <none>                8080:33580/TCP 7m
    jenkins                NodePort         10.97.49.156           <none>                8080:31888/TCP,50000:50000/TCP   11h

    
    
    

    报错解决:

    报错找不到mvn工具,错误如下所示:
    
    /home/jenkins/workspace/pipline-test@tmp/durable-33237322/script.sh: 4: /home/jenkins/workspace/pipline-test@tmp/durable-33237322/script.sh: /usr/bin/mvn: not found

    解决:之前编译一直显示找不到mvn工具,是因为下图中配置jenkins-slave镜像时候写错了,没有填写成编译好的cnych/jenkins:v1 镜像,

    
    
     
    
    
    参照:容器版jenkins实现CI/CD:
    https://www.cnblogs.com/effortsing/p/10468840.html

    制作jenkins镜像参照: https:
    //blog.csdn.net/a632189007/article/details/79311795

    上面链接这篇文档的核心内容如下:

    1、生成自定义Jenkins master镜像

    Dockerfile:

    FROM 192.168.1.184:5000/jenkins/jenkins:2.89.3
    ENV MAVEN_VERSION 3.0.5
    ENV JAVA_HOME /usr/java/jdk1.8.0_121
    ENV MAVEN_HOME /opt/maven/apache-maven-${MAVEN_VERSION}
    ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

    # build java
    COPY ./jdk1.8.0_121 ${JAVA_HOME}
    COPY ./libltdl.so.7 /usr/lib/libltdl.so.7

    # build maven
    COPY apache-maven-${MAVEN_VERSION}-bin.tar.gz /tmp/maven/apache-maven-${MAVEN_VERSION}-bin.tar.gz
    COPY settings.xml /tmp/maven/settings.xml
    USER root:root
    RUN mkdir -p /opt/maven/repository
    && cd /opt/maven
    && tar -zxvf /tmp/maven/apache-maven-${MAVEN_VERSION}-bin.tar.gz
    && cp /tmp/maven/settings.xml ${MAVEN_HOME}/conf/settings.xml
    && rm -rf /tmp/maven

    ENV PATH ${JAVA_HOME}/bin:${MAVEN_HOME}/bin:${PATH}


    该Dockerfile所做的工作为:
    1. 重新安装Java环境并配置环境变量;
    2. 安装Maven并配置环境变量;
    3. 配置Maven仓库位置,以便启动时挂载宿主机仓库为容器中Maven仓库;
    4. 设置启动用户为root。

    2、生成自定义Jenkins slave镜像

    Dockerfile:

    FROM jenkinsci/jnlp-slave:latest
    ENV MAVEN_VERSION 3.0.5
    ENV JAVA_HOME /usr/java/jdk1.8.0_121
    ENV MAVEN_HOME /opt/maven/apache-maven-${MAVEN_VERSION}
    ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

    # build java
    COPY ./jdk1.8.0_121 ${JAVA_HOME}
    COPY ./libltdl.so.7 /usr/lib/libltdl.so.7

    # build maven
    COPY apache-maven-${MAVEN_VERSION}-bin.tar.gz /tmp/maven/apache-maven-${MAVEN_VERSION}-bin.tar.gz
    COPY settings.xml /tmp/maven/settings.xml
    USER root:root
    RUN mkdir -p /opt/maven/repository
    && cd /opt/maven
    && tar -zxvf /tmp/maven/apache-maven-${MAVEN_VERSION}-bin.tar.gz
    && cp /tmp/maven/settings.xml ${MAVEN_HOME}/conf/settings.xml
    && rm -rf /tmp/maven
    && apt-get -yq update
    && apt-get -yq --no-install-recommends --no-install-suggests install sshpass
    && apt-get clean -y

    ENV PATH ${MAVEN_HOME}/bin:${PATH}


    该Dockerfile操作与Jenkins master的Dockerfile基本一致。不过该镜像中缺少libltdl.so.7文件,需要从宿主机中拷贝进去,该文件在slave节点容器中使用docker时会用到,因此十分重要




    容器板jenkins使用宿主机的kubectl参照:

    http://ju.outofmemory.cn/entry/363089











  • 相关阅读:
    字符串匹配常见算法(BF,RK,KMP,BM,Sunday)
    JSP基本语法总结【1】(jsp工作原理,脚本元素,指令元素,动作元素)
    JUnit【1】断言用法之assertEquals/True/False/ArrayEquals
    软件测试基础配置
    前端入门20-JavaScript进阶之异步回调的执行时机
    前端入门19-JavaScript进阶之闭包
    前端入门18-JavaScript进阶之作用域链
    前端入门17-JavaScript进阶之作用域
    前端入门16-JavaScript进阶之EC和VO
    前端入门15-JavaScript进阶之原型链
  • 原文地址:https://www.cnblogs.com/effortsing/p/10486960.html
Copyright © 2011-2022 走看看