Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件,Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。
Jenkins具有非常优秀显著的特性。

  • 安装和配置简单
  • 支持分布式部署
  • 持续集成和持续交付
  • 集成git、maven、sonar部署插件等类似maven生命周期,集成各种插件。

    安装

    jar包安装

  1. 安装jdk1.8的jdk环境
  2. 下载Jenkins的war包 中文官网地址:https://www.jenkins.io/zh/
  3. 运行命令:java –jar Jenkins.war –httpPort=8080
  4. 打开浏览器进入链接 http://localhost:8080

    注意事项:

  5. 替换国外的插件安装地址:点击左边菜单栏的Manage Jenkins—>Manage plugins—>高级—>替换地址https://jenkins-zh.gitee.io/update-center-mirror/tsinghua/update-center.json

image.png

  1. 当你进入http://localhost:8080 先进行解锁Jenkins 选择你所需的插件,可以选择无脑的安装推荐的插件,其次创建你登录的管理员用户,最重要的是安装全局安装配置。位置在Manage Jenkins—>Manage plugins—>Global Tool Configuration

image.png

  1. 利用jenkins构建maven项目时需要安装maven的插件,在插件管理中搜索Maven Integration

image.png

构建maven项目

在左边菜单栏目中选择新建item,输入你的项目名称,选择maven项目,在源码管理中选择自己的项目仓库地址,其它地方暂不做修改,(github仓库的地址是用https而不是ssh的形式),点击保存应用。
image.png

此时,选择build构建此项目,项目便可以正常启动了,是不是很简单呢。
image.png

参考博文:https://blog.csdn.net/achi010/article/details/93708768

Docker-compose安装(推荐)

compose文件

  1. version: '3.1'
  2. services:
  3. jenkins:
  4. image: jenkinsci/blueocean:latest
  5. volumes:
  6. - /etc/localtime:/etc/localtime:ro
  7. - ./volume/data/jenkins/:/var/jenkins_home
  8. - /var/run/docker.sock:/var/run/docker.sock
  9. - ./maven-setting/apache-maven-3.8.1:/maven-setting/apache-maven-3.8.1
  10. - ./repository:/repository
  11. ports:
  12. - "8080:8080"
  13. expose:
  14. - "8080"
  15. - "50000"
  16. privileged: true
  17. user: root
  18. restart: always
  19. container_name: jenkins
  20. environment:
  21. - TZ=Asia/Shanghai

ip+8080访问,进入到容器内部将密码粘贴(cat /var/jenkins_home/secrets/initialAdminPassword) ,查看日志可以查看对应的密码,我这里是:6f49641e1b254762a77cdcae11797af5,密码输入完成后选择自动安相应插件。
image.png

插件下载

  1. 安装maven插件 —-jenkins利用Maven编译,打包所需插件

image.png

  1. 安装插件:Deploy to container —-支持自动化代码部署到tomcat容器

image.png

  1. 安装插件:Publish Over SSH :通过ssh连接

image.png

  1. 安装ssh插件

image.png

  1. 安装docker代理插件:Docker Pipeline

在使用流水线时假设你没有单独安装maven,可以使用代理下载maven但是需要提前安装mav插件,否则会提示:Invalid agent type “docker” specified. Must be one of [any, label, none]

系统配置

image.png

  1. 配置ssh

image.png

配置全局配置

image.png

安装jdk

可以从下拉列表选择从com.sun下载,选择版本后,记得填写好自己的oracle的账号密码,因为下载需要账号和密码,也可以通过挂在宿主机形式挂载的话就要像我compose文件那样

安装maven

maven我是通过挂在的形式去实现的,先把maven包拷贝到宿主机指定目录,然后通过挂在到容器内的你自己定义好的目录,在通过jenkins部署时配置下环境变量让它生效即可,然后将你的脚本放到对应ssh服务器的文件夹中,当然你也可以通过touch文件在执行compose up启动也可
image.png
image.png
image.png

Compose 实现自动化部署Springboot

  1. 在我们的boot项目pom文件中使用编译自动打包上传

     <build>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
             <plugin>
                 <groupId>com.spotify</groupId>
                 <artifactId>docker-maven-plugin</artifactId>
                 <version>1.2.2</version>
                 <executions>
                     <!-- 用户只需执行mvn package,就会自动执行mvn docker:build  测试环境无需这样做 -->
                     <execution>
                         <id>build-image</id>
                         <phase>package</phase>
                         <goals>
                             <goal>build</goal>
                         </goals>
                     </execution>
                 </executions>
                 <configuration>
                     <imageName>${project.artifactId}:${project.version}</imageName>
                     <dockerHost>http://192.168.1.148:2375</dockerHost>
                     <baseImage>java:8</baseImage>
                     <entryPoint>["java", "-jar", "-Dspring.profiles.active=sit","/${project.build.finalName}.jar"]
                     </entryPoint>
                     <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
                     <resources>
                         <resource>
                             <targetPath>/</targetPath>
                             <directory>${project.build.directory}</directory><!--jar 包所在的路径,即对应 target 目录-->
                             <include>${project.build.finalName}.jar</include> <!-- 就是我们pkg打包后的simone-app-1.0-SNAPSHOT.jar -->
                         </resource>
                     </resources>
                 </configuration>
             </plugin>
         </plugins>
     </build>
    
  2. 然后再jenkins中配置对应的命令。点击系统配置,然后配置上对应的ssh参数,因为我们点击构建的时候会把代码上传到jenkins某个路径下,并且将boot项目打包成一个image镜像文件,我们配置ssh参数是为了下面的脚本能够执行,因为它会先在root目录下,然后我们通过我们的命令执行对应的docker-compose.yml文件,就会把我们的镜像通过compose的方式进行打包部署

image.png

  1. 填写我们要执行的脚本命令

image.png
image.png

version: '3'
services:
  simone-app:
    image: simone-app:1.0-SNAPSHOT
    container_name: simone-app-container
    restart: always
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 20020:20020
    volumes:
      - /volume/logs:/var/logs
networks:
  devops:
    name: devops
    external: true

k8s 实现自动化部署Springboot

  1. 第一步:我的jenkins是148服务器,k8s部署在110服务器,首先通过命令将maven配置同时进行maven pkg,但是在构建过程中遇到了问题,说我们命令没有权限执行

image.png
我本事是以root用户运行的,并且具备对应权限运行不知道为啥还会爆出权限不足,可能这个root是个假的root吧, 因为当映射本地数据卷时,/muvolume/jenkins目录的拥有者为root用户,而容器中root估计是个假人 所以需要对maven对应的安装目录进行赋权。

chmod 777 -R /root/project-server/jenkins/maven-setting/apache-maven-3.8.1
  1. 第二步:是通过将打包好的jar包打成镜像文件并上传到我们148的harbor私有仓库上去
  2. 第三部是ssh到我们110服务器也就是我们k8smaster主机上,执行对应的Delpoment脚本实现部署

image.png

FROM openjdk:8u201-jdk-alpine3.9

MAINTAINER heian<1158139789@qq.com>

#系统编码
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8

#声明一个挂载点,容器内此路径会对应宿主机的某个文件夹
VOLUME /tmp

#应用构建成功后的jar文件被复制到镜像内,名字也改成了app.jar
ADD target/getway-1.0-SNAPSHOT.jar app.jar

#启动容器时的进程
ENTRYPOINT ["java","-Xms256m","-Xmx512m","-jar","/app.jar"]

EXPOSE 30020
cho "开始部署嘞,兄弟们,工作名称为:" +  ${JOB_NAME}
export MAVEN_HOME=/maven-setting/apache-maven-3.8.1
export PATH=$PATH:$MAVEN_HOME/bin
mvn --version
mvn clean package -Dmaven.test.skip=true
echo "maven package 结束" +  ${JOB_NAME}
echo "------------- 远程148机器的root用户目录 ----------------"
echo "开始部署嘞,兄弟们,工作名称为:" +  ${JOB_NAME}
echo "构建镜像 开始"
cd /root/project-server/jenkins/volume/data/jenkins/workspace/${JOB_NAME}/simone-getway/
docker build -t simone-getway:1.0 -f ./Dockerfile  .
echo "构建镜像 结束,开始上传到harbar私有仓库"
oldImg="simone-getway:1.0"
myImg="192.168.1.148:81/myshop/simone-getway:1.0"
docker login 192.168.1.148:81 -u admin -p Harbor12345
docker tag ${oldImg}  ${myImg}
docker push ${myImg}
docker images
echo "-----镜像上传结束-----"
echo "------------- 远程110机器的root用户目录 ----------------"
echo "准备发布Deplyment"
kubectl create -f << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: simone-getway
  namespace: default
spec:
  replicas: 1      #Pod副本期待数量
  selector:
    matchLabels:   #定义RS的标签
      app: simone-getway #符合目标的Pod拥有此标签
  template:
    metadata:
      labels:
        app: simone-getway
    spec:
      containers:
      - image: 192.168.1.148:81/myshop/simone-getway:1.0
        imagePullPolicy: IfNotPresent
        name: simone-getway
        ports:
          - containerPort: 30020
            protocol: TCP
        volumeMounts:
          - name: logdir
            mountPath: /logs
          - name: localtime
            mountPath: /etc/localtime
          - name: timezone
            mountPath: /etc/timezone            
      imagePullSecrets:
      - name: docker-harbor-registry
      volumes:
        - name: logdir
          emptyDir: {}
        - name: localtime
          hostPath:
            path: /etc/localtime
        - name: timezone
          hostPath:
            path: /etc/timezone 
EOF
kubectl get pods