发布流程 
使用 Gitlab 作为代码仓库 & 使用 Harbor 作为镜像仓库 
1.部署gitlab
mkdir  gitlabcd  gitlabdocker run -d \   --name gitlab \   -p 8443:443 \   -p 9999:80 \   -p 9998:22 \   -v $PWD /config:/etc/gitlab \   -v $PWD /logs:/var/log/gitlab \   -v $PWD /data:/var/opt/gitlab \   -v /etc/localtime:/etc/localtime \   --restart=always \   lizhenliang/gitlab-ce-zh:latest 
 
访问地址:http://IP:9999 
初次会先设置管理员密码 ,然后登陆,默认管理员用户名root,密码就是刚设置的。
创建项目,提交测试代码
进入后先创建项目,提交代码,以便后面测试。
unzip tomcat-java-demo-master.zip cd  tomcat-java-demo-mastergit init git remote add origin http://192.168.0.13:9999/root/java-demo.git git add . git config --global user.email "you@example.com"  git config --global user.name "Your Name"  git commit -m 'all'  git push origin master 
 
2、部署Harbor镜像仓库
2.1 安装docker与docker-compose
2.2 解压离线包部署
hostname: reg.ctnrs.com https:    harbor_admin_password: Harbor12345 
 
2.3 在Jenkins主机配置Docker可信任,如果是HTTPS需要拷贝证书
由于habor未配置https,还需要在docker配置可信任。
{"registry-mirrors" : ["https://b9pmyelo.mirror.aliyuncs.com" ],   "insecure-registries" : ["192.168.0.12" ] } 
 
在Kubernetes平台部署Jenkins 
部署nfs-pv自动供给
yum install nfs-utils mkdir  -p /nfs/kubernetesvim /etc/exports /nfs/kubernetes *(rw,no_root_squash) systemctl start nfs systemctl enable  nfs git clone  https://github.com/kubernetes-incubator/external-storage  cd  nfs-client/deploy kubectl apply -f rbac.yaml  kubectl apply -f deployment.yaml  kubectl apply -f class.yaml  kubectl get sc   
 
3.部署Jenkins
需要提前准备好PV自动供给,为Jenkins持久化数据。
cd  jenkins kubectl apply -f jenkins.yaml  kubectl get pods,svc -n ops -o wide 
 
访问地址:http://NodePort:30008 
第一次部署会进行初始化:
点无,不安装任何插件
4.安装插件
默认从国外网络下载插件,会比较慢,建议修改国内源:
cd  /nfs/kubernetes/ops-jenkins-pvc-0b76f611-9e06-433d-a666-8e7d0e9f1138/updatessed -i 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g'  default.json  sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g'  default.json kubectl delete pod jenkins-d58f4db66-9cthj -n ops 
 
http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 
管理Jenkins->系统配置–>管理插件–>分别搜索Git Parameter/Git/Pipeline/kubernetes/Config File Provider,选中点击安装。
5、添加kubernetes集群
管理Jenkins->Manage Nodes and Clouds->configureClouds->Add
构建Jenkins-Slave镜像 
jenkins-slave.zip 
6.构建Slave镜像
 
课件目录里涉及四个文件:
Dockerfile:构建镜像
 
jenkins-slave:shell脚本启动slave.jar
 
settings.xml:修改maven官方源为阿里云源
 
slave.jar:agent程序,接受master下发的任务
 
 
构建并推送到镜像仓库:
docker build -t 192.168.0.12/library/jenkins-slave-jdk:1.8 . docker push 192.168.0.12/library/jenkins-slave-jdk:1.8 
 
Jenkins在K8S中动态创建代理 
Kubernetes插件:Jenkins在Kubernetes集群中运行动态代理
插件介绍:https://github.com/jenkinsci/kubernetes-plugin 
Jenkins Pipeline 介绍 
Jenkins Pipeline是一套运行工作流框架,将原本独立运行单个或者多个节点的任 务链接起来,实现单个任务难以完成的复杂流程编排和可视化。
Jenkins Pipeline是一套插件,支持在Jenkins中实现持续集成和持续交付;
 
Pipeline通过特定语法对简单到复杂的传输管道进行建模;
 
Jenkins Pipeline的定义被写入一个文本文件,称为Jenkinsfile。
 
 
Stages 是 Pipeline 中最主要的组成部分,Jenkins 将会按照 Stages 中描述的顺序 从上往下的执行。
 
Stage:阶段,一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作, 比如:Build、Test、Deploy
 
Steps:步骤,Steps 是最基本的操作单元,可以是打印一句话,也可以是构建一 个 Docker 镜像,由各类 Jenkins 插件提供,比如命令:sh ‘mvn’,就相当于我 们平时 shell 终端中执行 mvn命令一样。
 
 
Jenkins在Kubernetes中持续部署 
自动部署应用(yaml):
将kubectl工具封装到Slave镜像中,并通过Config File Provider插件存储连接K8s集群的kubeconfig认证文件,然后 挂载到Slave容器中,这样就能用kubectl apply deploy.yaml --kubeconfig=config
注:为提高安全性,kubeconfig文件应分配权限
除了上述方式,还可以使用Kubernetes Continuous Deploy插件,将资源配置(YAML)部署到Kubernetes,这种 不是很灵活性
7.编写Pipeline脚本
创建命名空间
kubectl create ns dev kubectl create ns test  kubectl create ns prod 
 
将镜像仓库认证凭据保存在K8s Secret中
kubectl create secret docker-registry registry-pull-secret --docker-username=admin --docker-password=Harbor12345 --docker-server=192.168.0.12 -n dev kubectl create secret docker-registry registry-pull-secret --docker-username=admin --docker-password=Harbor12345 --docker-server=192.168.0.12 -n test  kubectl create secret docker-registry registry-pull-secret --docker-username=admin --docker-password=Harbor12345 --docker-server=192.168.0.12 -n prod 
 
部署文件:deploy.yaml (将部署文件跟git仓库文件放在一起)
apiVersion: apps/v1 kind: Deployment metadata:   name: web spec:   replicas: REPLICAS   selector:     matchLabels:       app: java   template:     metadata:       labels:         app: java     spec:       imagePullSecrets:       - name: SECRET_NAME       containers:       - image: IMAGE_NAME         name: java-demo         resources:           requests:             cpu: 0.5             memory: 500Mi           limits:             cpu: 1             memory: 1Gi         livenessProbe:           httpGet:             path: /             port: 8080           initialDelaySeconds: 40           periodSeconds: 10         readinessProbe:           httpGet:             path: /             port: 8080           initialDelaySeconds: 40           periodSeconds: 10 --- apiVersion: v1 kind: Service metadata:   name: java-demo spec:   selector:     app: java   ports:     - protocol: TCP       port: 80       targetPort: 8080   type : NodePort  
 
创建项目->流水线->Pipeline脚本如下:
// 公共 def registry = "192.168.0.12"  // 项目 def project = "demo"  def app_name = "java-demo"  def image_name = "${registry} /${project} /${app_name} :${BUILD_NUMBER} "  def git_address = "http://192.168.0.13:9999/root/java-demo.git"  // 认证 def secret_name = "registry-pull-secret"  def docker_registry_auth = "e2c15e7c-766e-4961-bddb-2160e6e1859b"  def git_auth = "d17ea255-ade3-4623-b2ce-0b40b87e7164"  def k8s_auth = "6f488843-b5e2-49ca-949b-eccb75b54f6c"  pipeline {   agent {     kubernetes {         label "jenkins-slave"          yaml "" "  kind: Pod metadata:   name: jenkins-slave spec:   containers:   - name: jnlp     image: " ${registry} /library/jenkins-slave-jdk:1.8"     imagePullPolicy: Always     volumeMounts:       - name: docker-cmd         mountPath: /usr/bin/docker       - name: docker-sock         mountPath: /var/run/docker.sock       - name: maven-cache         mountPath: /root/.m2   volumes:     - name: docker-cmd       hostPath:         path: /usr/bin/docker     - name: docker-sock       hostPath:         path: /var/run/docker.sock     - name: maven-cache       hostPath:         path: /tmp/m2 " ""         }              }     parameters {             gitParameter branch: '' , branchFilter: '.*' , defaultValue: 'master' , description: '选择发布的分支' , name: 'Branch' , quickFilterEnabled: false , selectedValue: 'NONE' , sortMode: 'NONE' , tagFilter: '*' , type : 'PT_BRANCH'          choice (choices: ['1' , '3' , '5' , '7' ], description: '副本数' , name: 'ReplicaCount' )         choice (choices: ['dev' ,'test' ,'prod' ], description: '命名空间' , name: 'Namespace' )     }     stages {         stage('拉取代码' ){             steps {                 checkout([$class : 'GitSCM' ,                  branches: [[name: "${params.Branch} " ]],                  doGenerateSubmoduleConfigurations: false ,                  extensions: [], submoduleCfg: [],                  userRemoteConfigs: [[credentialsId: "${git_auth} " , url: "${git_address} " ]]                 ])             }         }         stage('代码编译' ){            steps {              sh "" "                  mvn clean package -Dmaven.test.skip=true                 " ""             }         }         stage('构建镜像' ){            steps {                 withCredentials([usernamePassword(credentialsId: "${docker_registry_auth} " , passwordVariable: 'password' , usernameVariable: 'username' )]) {                 sh "" "                    echo '                     FROM lizhenliang/tomcat                     LABEL maitainer lizhenliang                     RUN rm -rf /usr/local/tomcat/webapps/*                     ADD target/*.war /usr/local/tomcat/webapps/ROOT.war                   ' > Dockerfile                   docker build -t ${image_name}  .                   docker login -u ${username}  -p '${password} ' ${registry}                    docker push ${image_name}                  " ""                 }            }          }         stage('部署到K8S平台' ){           steps {               configFileProvider([configFile(fileId: "${k8s_auth} " , targetLocation: "admin.kubeconfig" )]){                 sh "" "                    sed -i 's#IMAGE_NAME#${image_name} #' deploy.yaml                   sed -i 's#SECRET_NAME#${secret_name} #' deploy.yaml                   sed -i 's#REPLICAS#${ReplicaCount} #' deploy.yaml                   kubectl apply -f deploy.yaml -n ${Namespace}  --kubeconfig=admin.kubeconfig                 " ""               }           }         }     } } 
 
上述脚本中,registry变量值改成你的镜像仓库地址。
将之前部署该项目涉及的yaml合并到一个名为deploy.yaml文件中,并提交到该项目代码仓库,与 pom.xml同级目录,用于上述脚本自动部署使用。
1、将harbor认证和gitlab认证保存到Jenkins凭据
管理Jenkins->安全–>管理凭据->Jnekins->添加凭据->Username with password
Username:用户名
 
Password:密码 ID:留空
 
Description:描述
 
 
分别添加连接git和harbor凭据,并修改上面脚本docker_registry_auth 和git_auth变量的值为Jenkins 凭据ID。
2、将kubeconfig存储在Jenkins,用于slave镜像里kubectl连接k8s集群
管理Jenkins-> Managed files->Add->Custom file ->Content字段内容是kubeconfig(默认路径在 master节点/root/.kube/config),然后复制ID替换上述脚本中k8s_auth变量的值。
8.构建测试
流水线脚本与源代码一起版本管理 
Jenkinsfile文件建议与源代码一起版本管理,实现流水线即代码(Pipeline as Code)。 这样做的好处:
自动为所有分支创建流水线脚本
 
方便流水线代码复查、追踪、迭代
 
可被项目成员查看和编辑
 
 
参考链接:https://www.cnblogs.com/u1s1/p/14231196.html