本文主要演示如何在阿里云 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
默认用户名密码为 admin/admin, 登录后请修改.
2. 创建集群证书, 镜像仓库证书并构建和部署示例应用
(1) 配置 Kubernetes Cloud 动态创建 slave pod:
系统管理 -> 系统设置 -> Cloud -> Kubernetes URL:
系统管理 -> 系统设置 -> Cloud -> Kubernetes URL:
Kubernetes.Credentials:
点击添加证书:
测试连通性:
系统管理 -> 系统设置 -> Cloud -> Jenkins URL and tunnel:
保存配置.
(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, 本示例中源码仓库分支为 master, 镜像为 registry.cn-beijing.aliyuncs.com/haoshuwei:stable
完成.
二 构建环境与示例项目说明
(1) 示例项目中使用的源码仓库
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 集群插件说明
插件配置如下:
对应的 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-java'
- }
- }
- // "stages" 定义项目构建的多个模块, 可以添加多个 "stage", 可以多个 "stage" 串行或者并行执行
- stages{
- // 定义第一个 stage, 完成克隆源码的任务
- stage('Git'){
- steps{
- Git branch: '${BRANCH}', credentialsId: '', url:'https://github.com/AliyunContainerService/jenkins-demo.git'
- }
- }
- // 添加第二个 stage, 运行源码打包命令
- stage('Package'){
- steps{
- sh "mvn package -B -DskipTests"
- }
- }
- // 添加第四个 stage, 运行容器镜像构建和推送命令, 用到了 environment 中定义的 groovy 环境变量
- stage('Image Build And Publish'){
- steps{
- 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 {
- 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 {
- step([$class: 'KubernetesDeploy', authMethod: 'certs', apiServerUrl: '$API_SERVER_URL', credentialsId:'k8sCertAuth', config: 'deployment.yaml',variableState: 'ORIGIN_REPO,REPO,IMAGE_TAG'])
- }
- }
- }
- }
- }
- }
来源: https://yq.aliyun.com/articles/685219