Serverless Kubernetes容器服务中快速部署jenkins环境及执行流水线构建

news/2024/5/20 10:03:24 标签: serverless, 运维, git

本文主要演示如何在阿里云Serverless Kubernetes服务上快速搭建jenkins持续集成环境,并基于提供的示例应用快速完成应用源码编译、镜像构建和推送以及应用部署的流水线。

先决条件:
阿里云Serverless Kubernetes集群。

一 快速开始

1. 部署jenkins

(1)下载部署文件

$ git clone https://github.com/AliyunContainerService/jenkins-on-serverless.git
$ cd jenkins-on-serverless

(2)jenkins_home持久化配置
serverless kubernetes目前不支持云盘,要持久化jenkins_home的话, 需要挂载nfs volume, 修改serverless-k8s-jenkins-deploy.yaml中注释部分字段:

        #volumeMounts:
        #  - mountPath: /var/jenkins_home
        #    name: jenkins-home
      .....
      #volumes:
      #  - name: jenkins-home
      #    nfs:
      #      path: /
      #      server:

(3)部署jenkins

$ kubectl apply -f serverless-k8s-jenkins-deploy.yaml

(4)登录jenkins
image

默认用户名密码为admin/admin,登录后请修改。
image

image

2. 创建集群证书、镜像仓库证书并构建和部署示例应用

(1)配置Kubernetes Cloud动态创建slave pod:
系统管理 -> 系统设置 -> Cloud -> Kubernetes URL:
image

系统管理 -> 系统设置 -> Cloud -> Kubernetes URL:
Kubernetes.Credentials:
image

点击添加证书:
image

测试连通性:
image

系统管理 -> 系统设置 -> Cloud -> Jenkins URL and tunnel:
image

image

保存配置。

(2)创建jenkins-docker-cfg secret用于镜像仓库权限设置
本示例中使用了阿里云镜像服务提供的北京区域镜像仓库:

$ docker login -u xxx -p xxx registry.cn-beijing.aliyuncs.com
Login Succeeded
$ kubectl create secret generic jenkins-docker-cfg  --from-file=/root/.docker/config.json

(3)构建demo-pipeline并访问应用服务
根据自己镜像仓库信息修改构建参数,并填写kubeconfig中的apiserver url, 本示例中源码仓库分支为serverless,镜像为registry.cn-beijing.aliyuncs.com/haoshuwei/jenkins-java-demo:serverless 请根据提示信息进行替换

image

image

完成。

二 构建环境与示例项目说明

(1)示例项目中使用的源码仓库,分支为serverless

https://github.com/AliyunContainerService/jenkins-demo.git

(2)kaniko 构建和推送docker镜像说明

kaniko可以不依赖docker daemon并在用户空间执行完成Dockerfile中的每一行命令,最终完成docker镜像的构建和推送。

kaniko -f `pwd`/Dockerfile -c `pwd` --destination=${origin_repo}/${repo}:${image_tag}

(3)部署应用到Kubernetes集群插件说明

插件配置如下:
image

对应的Pipeline语法为:

step([$class: 'KubernetesDeploy', authMethod: 'certs', apiServerUrl: 'https://kubernetes.default.svc.cluster.local:443', credentialsId:'k8sCertAuth', config: 'deployment.yaml',variableState: 'ORIGIN_REPO,REPO,IMAGE_TAG'])

声明的变量ORIGIN_REPO,REPO,IMAGE_TAG可在构建执行时把deployment.yaml文件中对应的变量值替换为实际值:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jenkins-java-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: jenkins-java-demo
  template:
    metadata:
      labels:
        app: jenkins-java-demo
    spec:
      containers:
      - name: jenkins-java-demo
        image: ${ORIGIN_REPO}/${REPO}:${IMAGE_TAG}
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: jenkins-java-demo
spec:
  ports:
  - port: 80
    targetPort: 8080
    name: jenkins-java-demo
  selector:
    app: jenkins-java-demo
  type: LoadBalancer

(4)Jenkinsfile说明

pipeline{
      // 定义groovy脚本中使用的环境变量
      environment{
        // 本示例中使用DEPLOY_TO_K8S变量来决定把应用部署到哪套容器集群环境中,如“Production Environment”, “Staging001 Environment”等
        IMAGE_TAG =  sh(returnStdout: true,script: 'echo $image_tag').trim()
        ORIGIN_REPO =  sh(returnStdout: true,script: 'echo $origin_repo').trim()
        REPO =  sh(returnStdout: true,script: 'echo $repo').trim()
        BRANCH =  sh(returnStdout: true,script: 'echo $branch').trim()
        API_SERVER_URL = sh(returnStdout: true,script: 'echo $api_server_url').trim()
      }

      // 定义本次构建使用哪个标签的构建环境,本示例中为 “slave-pipeline”
      agent{
        node{
          label 'slave-pipeline'
        }
      }

      // "stages"定义项目构建的多个模块,可以添加多个 “stage”, 可以多个 “stage” 串行或者并行执行
      stages{
    // 定义第一个stage, 完成克隆源码的任务
        stage('Git'){
          steps{
            git branch: '${BRANCH}', credentialsId: '', url: 'https://github.com/AliyunContainerService/jenkins-demo.git'
          }
        }

    // 添加第二个stage, 运行源码打包命令
        stage('Package'){
          steps{
              container("maven") {
                  sh "mvn package -B -DskipTests"
              }
          }
        }

    // 添加第三个stage, 运行容器镜像构建和推送命令, 用到了environment中定义的groovy环境变量
        stage('Image Build And Publish'){
          steps{
              container("kaniko") {
                  sh "kaniko -f `pwd`/Dockerfile -c `pwd` --destination=${ORIGIN_REPO}/${REPO}:${IMAGE_TAG}"
              }
          }
        }

        stage('Deploy to Kubernetes') {
            parallel {
                stage('Deploy to Production Environment') {
                    when {
                        expression {
                            "$BRANCH" == "serverless"
                        }
                    }
                    steps {
            container('kubectl') {
                step([$class: 'KubernetesDeploy', authMethod: 'certs', apiServerUrl: '$API_SERVER_URL', credentialsId:'k8sCertAuth', config: 'deployment.yaml',variableState: 'ORIGIN_REPO,REPO,IMAGE_TAG'])
            }
                    }
                }
                stage('Deploy to Staging001 Environment') {
                    when {
                        expression {
                            "$BRANCH" == "latest"
                        }
                    }
                    steps {
            container('kubectl') {
                step([$class: 'KubernetesDeploy', authMethod: 'certs', apiServerUrl: '$API_SERVER_URL', credentialsId:'k8sCertAuth', config: 'deployment.yaml',variableState: 'ORIGIN_REPO,REPO,IMAGE_TAG'])
            }
                    }
                }
            }
        }
      }
}

http://www.niftyadmin.cn/n/1587557.html

相关文章

【Machine Learning in Action --2】K-最近邻分类

1、K-近邻算法(KNN)概述 K-近邻算法采用测量不同特征值之间的距离方法进行分类。 工作原理:存在一个样本数据集合(也称作训练样本集),并且样本集中每个数据都存在标签(即我们知道样本集中每一数…

xshell使用密钥登陆linux

一、环境CentOS 7.4xshell 6二、介绍远程ssh连接服务器 默认是用的密码验证的方式,而且还是root账号,这样的验证方式会有安全隐患,容易被人暴力破解root密码。如果改成用密钥登陆服务器,就会消除这一安全隐患。三、设置方法1、xsh…

前端性能优化之预加载

网络连接的快慢&#xff0c;是前端性能的瓶颈之一&#xff0c;在这里我们能做些什么呢&#xff0c;下面介绍几个通过浏览器特性来很容易提高资源加载速度的方法&#xff1a;DNS prefetchingDNS解析的速度可用通过下面的标签来进行预解析&#xff1a;<link rel"dns-pref…

django 2.0 中各表 on_delete 的意义

见 https://blog.csdn.net/buxianghejiu/article/details/79086011

这样做动画交互,一点都不费力!

本文由云社区发表作者:paulzeng 导语&#xff1a;Lottie是Airbnb开源的一个面向 iOS、Android、React Native 的动画库&#xff0c;可实现非常复杂的动画&#xff0c;使用也及其简单&#xff0c;极大释放人力&#xff0c;值得一试。 一、简介 Lottie 是Airbnb开源的一个面向 iO…

Django中reverse反转并且传递参数

在写项目的过程中&#xff0c;有些函数不可避免的需要传入参数进去&#xff0c;所以我们在使用reverse进行反转时也需要传递参数。这个时候我们就可以使用 ‘reverse&#xff08;&#xff09;’ 中的 kwargs 参数了&#xff0c;它将传入一个字典形式的变量。kwargs 也支持传入多…

int('x', base)中的base参数

>>> int(12, 16) 16表示12就是16进制数&#xff0c;int()要将这个16进制数转化成10进制。转载于:https://www.cnblogs.com/iNeoWong/p/4820221.html

hdu2078复习时间

感觉这就是一个脑筋急转弯啊&#xff01;最多复习m门&#xff0c;又不是必须复习m门&#xff0c;没有时间限制&#xff0c;那就每天复习一门好了&#xff0c;先复习最简单的效率当然最高。 …………简单题不要想太多啊………… #include<iostream> #include<algorithm…