天天看点

Jenkins on ACK实战(二):这是一条简单的流水线

上一篇结束的时候,我们已经部署了一套Jenkins环境,今天我们就在这套环境里来创建一条简单的流水线来做应用的构建并发布到这个集群

开始之前

  • 在集群中创建用到的registry的访问密钥,这里我们使用阿里云容器镜像服务的北京区域
    $ docker login -u xxx -p xxx registry.cn-beijing.aliyuncs.com
    Login Succeeded
    
    $ kubectl create secret generic jenkins-docker-cfg -n ci --from-file=/root/.docker/config.json           
    > 注意:如果是在Mac上操作,需要先把~/.docker/config.json里的`credsStore`参数项删除再去login
               
  • 创建流水线部署的目标环境,这里我们选择部署到这个集群的pro namespace,对于正式环境,请选择不同的集群
    $ kubectl create ns pro           
  • 在jenkins中创建访问目标集群的密钥
    $ kubectl -n kube-system get serviceaccount admin -o go-template --template='{{range .secrets}}{{.name}}{{"\n"}}{{end}}'
    ${admin-token-6xbcz}
    
    $ kubectl -n kube-system get secrets ${admin-token-6xbcz} -o go-template --template '{{index .data "token"}}' | base64 -D
    eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2V[...]           
  • 将获取到的token保存在Jenkins里
    Jenkins on ACK实战(二):这是一条简单的流水线

配置流水线

  • 创建流水线项目
    Jenkins on ACK实战(二):这是一条简单的流水线
  • 配置pipeline逻辑,将下面一段pipeline代码写入项目的

    Pipeline script

    Jenkins on ACK实战(二):这是一条简单的流水线
    pipeline {
        agent {
            kubernetes {
                label 'jenkins-pod'
                defaultContainer 'jnlp'
                yaml """
                apiVersion: v1
                kind: Pod
                metadata:
                  labels:
                    app: jenkins-slave-pod
                spec:
                  containers:
                  - name: golang
                    image: golang:1.12
                    command:
                    - cat
                    tty: true
                  - name: kaniko
                    image: registry.cn-beijing.aliyuncs.com/acs-sample/jenkins-slave-kaniko:0.6.0
                    command:
                    - cat
                    tty: true
                    volumeMounts:
                    - name: ymian
                      mountPath: /root/.docker
                  - name: kubectl
                    image: roffe/kubectl:v1.13.2
                    command:
                    - cat
                    tty: true
                  - name: busybox
                    image: ymian/busybox
                    command:
                    - cat
                    tty: true
                  volumes:
                  - name: ymian
                    secret:
                      secretName: jenkins-docker-cfg
                      items:
                      - key: config.json
                        path: config.json
                """
            }
        }
    
        stages {
            stage('Build') {
                steps {
                    container('golang') {
                        git url: 'https://github.com/HYmian/gin-sample.git'
                        sh """
                        go build -mod vendor -v
                        """
                    }
                }
            }
    
            stage('Image Build And Publish') {
                steps {
                    container("kaniko") {
                        sh "kaniko -f `pwd`/Dockerfile -c `pwd` -d registry.cn-beijing.aliyuncs.com/${your_repo}/gin-sample"
                    }
                }
            }
    
            stage('Deploy to pro') {
                steps {
                    container("kubectl") {
                        withKubeConfig(
                            [
                                credentialsId: 'pro-env',
                                serverUrl: 'https://kubernetes.default.svc.cluster.local'
                            ]
                        ) {
                            sh '''
                            kubectl apply -f `pwd`/deploy.yaml -n pro
                            kubectl wait --for=condition=Ready pod -l app=gin-sample --timeout=60s -n pro
                            '''
                        }
                    }
                }
            }
        }
    }           
    • 我们这里为了演示方便,直接在Jenkins里写pipeline的逻辑,但是在正式使用时,应该将pipeline保存为单独的文件并和项目的代码放在同一个仓库里
    • 注意将代码里的${your_repo}替换成自己的仓库名称
  • 验证流水线,手动触发,成功后可以在

    blue ocean

    中看到结果
    Jenkins on ACK实战(二):这是一条简单的流水线

小结

本文配置了一条包含构建、打包、部署三个stage的简单流水线,pipeline是Jenkins 2.0开始引入的概念,关于pipeline的优势可以参考官方给出的

说明

可能在上面一节里,关于agent这一段的定义会让大家更迷惑一点,在下一篇文章里,我们会着重给大家介绍这一部分

继续阅读