01 CICD

在网盘中我会提供一个md的版本[名称为“笔记命令复制伴侣.md”

主要考虑到大家复制命令的时候,如果直接在pdf中复制,会有乱码问题,可以到md的版本中直接复制

思考:如果springboot-demo需要修改某些代码,按照上述流程,是不是又要重新打包?然后写Dockerfile,push镜像,然后写k8s配置文件等等之类的操作

思路:如果能够按照上述图解一样,在本地进行开发,然后git push到github,就能访问最终的应用该多好

1.1 环境准备

1.1.1 基础环境准备[在jenkins那台机器上安装]

  • 安装java

    (1)找到jdk资源上传到指定机器

  1. resources/cicd/jdk-8u181-linux-x64.tar.gz

(2)配置环境变量

  1. vim /etc/profile
  2. export JAVA_HOME=/usr/local/java/jdk1.8.0_181
  3. export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
  4. export PATH=$PATH:${JAVA_HOME}/bin
  5. source /etc/profile
  6. java -version
  • 安装maven

    (1)找到maven资源上传到指定机器

  1. resources/cicd/apache-maven-3.6.2-bin.tar.gz

(2)配置环境变量

  1. vim /etc/profile
  2. export MAVEN_HOME=/usr/local/maven/apache-maven-3.6.2
  3. export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
  4. source /etc/profile
  5. mvn -version

(3)配置maven的阿里云镜像

  1. <mirror>
  2. <id>alimaven</id>
  3. <name>aliyun maven</name>
  4. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  5. <mirrorOf>central</mirrorOf>
  6. </mirror>
  • 安装配置git

    (1)下载安装

  1. yum install git

(2)配置git

  1. git config --global user.name "itcrazy2016"
  2. git config --global user.email "itcrazy2016@163.com"
  3. ssh-keygen -t rsa -C "itcrazy2016@163.com" --->将公钥上传到github:/root/.ssh/id_rsa.pub

1.1.1 IDEA+Spring Boot项目

  1. 01 下载项目
  2. git clone git@github.com:itcrazy2016/springboot-demo.git
  3. 02 使用idea打开
  4. 此时项目已经和github关联

1.1.2 Gitlab

直接采用github

git@github.com:itcrazy2016/springboot-demo.git

1.1.3 Jenkins

必须在k8s集群中,因为后面需要在jenkins的目录下创建文件执行,比如这里选用w2

(1)操作前须知

jenkins官网:https://jenkins.io/

入门指南:<https://jenkins.io/zh/doc/pipeline/tour/getting-started/

(1)找到对应资源:resources/cicd/jenkins.war

  1. wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

(2)启动jenkins[记得当前机器安装了jdk/jre,不然运行不了]

  1. nohup java -jar jenkins.war --httpPort=8080 &
  2. tail -f nohup.out

(3)win浏览器访问w2的ip 121.40.56.193:8080,记录下密码,比如

cat /root/.jenkins/secrets/initialAdminPassword

(4)安装推荐的插件

(5)创建一个用户,比如

  1. username:jack
  2. password:123456

(6)安装配置git,maven

(7)在jenkins上使用centos的java,git,maven等

[系统管理]->[全局工具配置]->[Maven、JDK、Git等]

1.1.4 Docker hub

使用阿里云docker镜像仓库,或者自己搭建一个

比如使用阿里云的

  1. docker login --username=itcrazy2016@163.com registry.cn-hangzhou.aliyuncs.com

1.1.5 Kubernetes集群

直接使用之前大家自己搭建的K8s集群

1.2 必要测试

1.2.1 pipeline任务

关注: /root/.jenkins/workspace目录

(1)创建jenkins的task

(2)拉取github代码,在最下面编写pipeline,然后“保存和立即构建“,同时可以查看“Console Output”

  1. node {
  2. def mvnHome
  3. stage('Preparation') { // for display purposes
  4. git 'https://github.com/itcrazy2016/springboot-demo.git'
  5. }
  6. }

(3)来到w2节点:ls /root/.jenkins/workspace/springboot-demo

(4)配置springboot-demo的task,修改pipeline内容 ,增加maven构建,然后“保存和立即构建“,同时可以查看“Console Output”

  1. node {
  2. def mvnHome
  3. stage('Preparation') {
  4. git 'https://github.com/itcrazy2016/springboot-demo.git'
  5. }
  6. stage('Maven Build') {
  7. sh "mvn clean package"
  8. }
  9. }

(5)来到w2节点:ls /root/.jenkins/workspace/springboot-demo

小结:至此,我们已经可以通过在jenkins上手动构建的方式,拿到github上的代码,并且用maven进行构建。

1.2.2 git push触发jenkins自动构建

最好的话:当用户进行git commit/push提交代码到github时,能够通知jenkins自动构建

注意:jenkins的ip一定要是github能够访问到的地址

(1)在github上配置jenkins的webhook地址

http://121.40.56.193:8080/springboot-demo

(2)生成Personal access tokens

Jenkins访问github需要授权,所以在github上生成token交给jenkins使用,即Personal access tokens

github的Settings[个人信息右上角]—>Developer settings—>Personal access tokens—>Generate new token

最后保存好该token,比如:**72f048b514e95d6fe36f86d84374f2dcce402b43

(3)jenkins安装插件

  1. 01 安装github plugin插件:[系统管理]->[插件管理]->[可选插件]
  2. 02 安装gitlab插件和gitlab hook插件:[系统管理]->[插件管理]->[可选插件]

(4)配置GitHub Server

[系统管理]->[系统配置]->[找到github服务器]->[添加github服务器]

1.3 核心实战走起

1.3.1 build&push镜像

经过前面的折腾,肯定可以获取到代码,并且用maven进行构建了,最终拿到一个target/xxx.jar

来到w2上的workspace目录:cd /root/.jenkins/workspace

(1)准备一个文件,名称为springboot-demo-build-image.sh

  1. mkdir /root/.jenkins/workspace/scripts/
  2. vi /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh

(3)编写springboot-demo-build-image.sh文件

  1. # 进入到springboot-demo目录
  2. cd ../springboot-demo
  3. # 编写Dockerfile文件
  4. cat <<EOF > Dockerfile
  5. FROM openjdk:8-jre-alpine
  6. COPY target/springboot-demo-0.0.1-SNAPSHOT.jar /springboot-demo.jar
  7. ENTRYPOINT ["java","-jar","/springboot-demo.jar"]
  8. EOF
  9. echo "Dockerfile created successfully!"
  10. # 基于指定目录下的Dockerfile构建镜像
  11. docker build -t registry.cn-hangzhou.aliyuncs.com/itcrazy2016/springboot-demo:v1.0 .
  12. # push镜像,这边需要阿里云镜像仓库登录,在w2上登录
  13. docker push registry.cn-hangzhou.aliyuncs.com/itcrazy2016/springboot-demo:v1.0

(4)增加pipeline

  1. node {
  2. def mvnHome
  3. stage('Preparation') {
  4. git 'https://github.com/itcrazy2016/springboot-demo.git'
  5. }
  6. stage('Maven Build') {
  7. sh "mvn clean package"
  8. }
  9. stage('Build Image') {
  10. sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh"
  11. }
  12. }

(5)采坑

  1. # 01 文件权限
  2. /root/.jenkins/workspace/springboot-demo@tmp/durable-7dbf7e73/script.sh: line 1: /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh: Permission denied
  3. # 解决
  4. chmod +x /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh
  5. # 02 docker没有运行
  6. Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
  7. # 解决
  8. systemctl start docker
  9. systemctl enable docker
  10. # 03 push权限
  11. docker login --username=itcrazy2016@163.com registry.cn-hangzhou.aliyuncs.com

1.3.2 Kubernetes拉取镜像运行

经过前面的折腾,现在已经能够把镜像push到镜像仓库了,接下来就是k8s拉取镜像并且运行在集群中咯

根据前面的经验,肯定再创建一个stage,然后运行sh脚本,脚本中执行内容,包括yaml文件

(1)编写springboot-demo.yaml文件

在/root/.jenkins/workspace/scripts/目录下创建springboot-demo.yaml

  1. # 以Deployment部署Pod
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: springboot-demo
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: springboot-demo
  10. replicas: 1
  11. template:
  12. metadata:
  13. labels:
  14. app: springboot-demo
  15. spec:
  16. containers:
  17. - name: springboot-demo
  18. image: registry.cn-hangzhou.aliyuncs.com/itcrazy2016/springboot-demo:v1.0
  19. ports:
  20. - containerPort: 8080
  21. ---
  22. # 创建Pod的Service
  23. apiVersion: v1
  24. kind: Service
  25. metadata:
  26. name: springboot-demo
  27. spec:
  28. ports:
  29. - port: 80
  30. protocol: TCP
  31. targetPort: 8080
  32. selector:
  33. app: springboot-demo
  34. ---
  35. # 创建Ingress,定义访问规则
  36. apiVersion: extensions/v1beta1
  37. kind: Ingress
  38. metadata:
  39. name: springboot-demo
  40. spec:
  41. rules:
  42. - host: springboot.jack.com
  43. http:
  44. paths:
  45. - path: /
  46. backend:
  47. serviceName: springboot-demo
  48. servicePort: 80

(2)编写k8s-deploy-springboot-demo.sh文件

vi /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh

  1. kubectl delete -f springboot-demo.yaml
  2. kubectl apply -f /root/.jenkins/workspace/scripts/springboot-demo.yaml
  3. echo "k8s deploy success!"

(3)编写pipeline

  1. node {
  2. def mvnHome
  3. stage('Preparation') {
  4. git 'https://github.com/itcrazy2016/springboot-demo.git'
  5. }
  6. stage('Maven Build') {
  7. sh "mvn clean package"
  8. }
  9. stage('Build Image') {
  10. sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh"
  11. }
  12. stage('K8S Deploy') {
  13. sh "/root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh"
  14. }
  15. }

(4)采坑

  1. # 01 权限
  2. /root/.jenkins/workspace/springboot-demo@tmp/durable-8404142a/script.sh: line 1: /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh: Permission denied
  3. # 解决
  4. chmod +x /root/.jenkins/workspace/scripts/k8s-deploy-springboot-demo.sh
  5. # 02 worker02执行不了kubectl
  6. 切换到master上,cd ~ ---> cat .kube/config --->复制内容
  7. 切换到worker02 cd ~ ---> vi .kube/config --->粘贴内容

(5)win的hosts文件

  1. 192.168.0.61 springboot.jack.com