jenkins-demo 项目地址 这里最重要的就是 Jenkinsfile 和 jenkins-demo.yaml 文件
- 新建好 pipeline之后 , 选择 Pipeline script from SCM ,这里我们使用在git上的jenkinsfile 文件进行配置
- gitee 项目上添加 Jenkinsfile 文件 , 切记这个名字不能改
开始编写 Jenkinsfile 脚本文件
- 使用Jenkins自带的流水线语法
- 以git拉取代码为例
- 直接将生成的流水线脚本文件放到我们自己的Jenkinsfile文件 , 后续的脚本文件都将使用这种方式生成
- 构建maven打包 , 使用 maven 命令 ,maven地址使用自己之前配置的
- 构建docker镜像
- 创建全局凭据 , 不在Jenkisfile中暴露账号密码
- 引用凭据 推送到阿里云镜像
steps{ withCredentials([usernamePassword(credentialsId: 'f1ae8e1e-b082-49de-89fb-a99e514b62bb', passwordVariable: 'password', usernameVariable: 'username')]) { sh'''docker login -u $username -p $password registry.cn-hangzhou.aliyuncs.com docker tag jenkins-demo registry.cn-hangzhou.aliyuncs.com/conlon/jenkins-demo-repository:latest docker push registry.cn-hangzhou.aliyuncs.com/conlon/jenkins-demo-repository:latest''' } }
- 将k8s运行需要的yaml文件传送到master
stage('将k8s运行需要的yaml文件传送到master ') { steps { sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s_node1_141', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'jenkins-demo.yaml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) } }
- 运行自己的 jenkins-demo.yaml 文件
steps { sh'''ssh root@192.168.228.141 kubectl apply -f /usr/local/k8s/jenkins-demo.yaml ssh root@192.168.228.141 kubectl rollout restart deployment jenkins-demo -n jenkins-demo-np''' }
出现的问题
- 因为我不是使用的default的命名空间所以我需要创建自己的命名空间
- kubectl get namespace
- vim jenkins-demo-namespace.yaml
apiVersion v1 kind Namespace metadata name jenkins-demo-np
- kubectl apply -f jenkins-demo-namespace.yaml
- 在创建 jenkins-demo.yaml 文件中的 ingress的时候 有一个 ingressClassName 的配置 这里是需要我们自己先去k8s上创建这个kind的
- 这里的那么就是 name: nginx-example 就是 ingress 配置中的 ingressClassName: nginx-example
apiVersion networking.k8s.io/v1 kind IngressClass metadata labels app.kubernetes.io/component controller name nginx-example annotations ingressclass.kubernetes.io/is-default-class"true"spec controller k8s.io/ingress-nginx
- 执行 kubectl apply -f jenkins-demo.yaml 命令后
- kubectl get pod -n jenkins-demo-np 查看pod的情况 出现如下报错
[root@node1 ~]# kubectl get pod -n jenkins-demo-npNAME READY STATUS RESTARTS AGE jenkins-demo-858847849d-kgqqj 0/1 ImagePullBackOff 0 77s # 阿里云的镜像 pull 不下来 ,使用了 docker login 登录还是不行# 这篇文章详细的解释了这个问题 https://www.cnblogs.com/unchch/p/11771005.html
- 执行命令创建 secret
kubectl create secret docker-registry aliyun-docker-secret --namespace=jenkins-demo-np \ --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=dkz13887548339 \ --docker-password=dkz13887548339
- 这个时候在去拉取镜像就不会报错了
- 需要提前配置 centos无密码登录的操作
- 配置了无密码登录报错
+ssh root@192.168.228.141 kubectl apply -f /usr/local/k8s/jenkins-demo.yaml Host key verification failed. # 我已经配置了无密码登录了 ,为啥还报错呢 , 因为在jenkins中执行这个命令的是Jenkins这个用户
# 而我在上面这一步配置的是 root 的用户 所以需要修改jenkins配置
- Jenkins 进行如下修改 ,解决后课正常执行 , 自动部署了 参考文章
vim /etc/sysconfig/jenkins # 修改这个参数 jenkins 为 rootJENKINS_USER="jenkins"JENKINS_USER="root"重启Jenkins