zoukankan      html  css  js  c++  java
  • GitLab集成Jenkins、Harborn构建pipeline流水线任务

    一、计划

    在jenkins中构建流水线任务时,从GitLab当中拉取代码,通过maven打包,然后构建dokcer镜像,并将镜像推送至harbor当中。Jenkins中含开发、测试、生产视图,开发人员可以对开发、测试的任务具有权限;测试人员仅对测试任务具有权限;管理员具有所有权限。

    二、jenkins所需插件

    Pipeline、docker-build-step、Docker Pipeline、Docker plugin、docker-build-step
    、Role-based、Authorization Strategy
    

    在jenkins中将上诉插件安装好。

    三、Jenkins设置权限(开发、测试、生产)

    • "系统管理"--->"全局安全配置"

      BxzSqU.png

    • "系统管理"--->"Manage and Assign Roles"

      BzSrAe.png

    • 选择"Manage Roles",在"Global roles"中添加一个user角色,角色权限可以自己调整,我这里设置了该角色的所有读权限。

      DSdVFx.png

    • 编辑"Item roles",添加三个项目角色,分别代表开发、测试、生产,并设置权限。

      DSdZY6.png

      根据正则,若任务名称为dev或者DEV开头,则该项目属于开发组项目。编辑完成之后点击应用,保存。

    • 点击保存后,回到"Manage and Assign Roles"页面,点击"系统管理"--->"管理用户"--->"新建用户";创建两个用户分别代表开发人员,测试人员;生产人员就用管理员用户。

      BzkxMj.png

    • 用户创建完成之后,点击"系统管理"--->"Manage and Assign Roles"-->"Assign Roles"

      BzQtCn.png

      编辑完成之后,点击应用,保存。

    • 创建三个新的视图,并按照前面的正则在分别在三个视图创建一个空的流水线任务

      Bzl5Q0.png

    • 权限验证

      admin用户登录:

      Bz8zyq.png

      开发人员登录:

      DSdoA1.png

      测试人员登录:

      DSd7h6.png

    四、Jenkins中设置JDK、Maven

    • 登录至Jenkins容器当中

      #以root用户登录,避免后面下载maven时权限不足
      [root@node03 docker-jenkins]# docker-compose exec -u root jenkins /bin/bash 
      root@8286c620ab88:/# java -version
      openjdk version "1.8.0_242"
      OpenJDK Runtime Environment (build 1.8.0_242-b08)
      OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
      root@8286c620ab88:/# whereis java
      java: /usr/local/openjdk-8/bin/java
      

      登录到容器中发现jdk已安装;不用再安装jdk。

    • 安装maven,我这里将maven安装至容器中/usr/local/maven3.6

      root@8286c620ab88:/# cd /usr/local/
      root@8286c620ab88:/usr/local# wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
      #下载成功后解压
      root@8286c620ab88:/usr/local# tar xvf apache-maven-3.6.3-bin.tar.gz
      #重命名
      root@8286c620ab88:/usr/local# mv apache-maven-3.6.3/ maven3.6
      
    • 设置环境变量

      root@8286c620ab88:/# vim /etc/profile
      

      若没有vi或者vim命令,可以先安装:

      root@8286c620ab88:/# apt-get update
      root@8286c620ab88:/# apt-get install vim
      

      在文件末尾加上如下内容

      export JAVA_HOME=/usr/local/openjdk-8
      export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      export PATH=$PATH:$JAVA_HOME/bin
      export M2_HOME=/usr/local/maven3.6
      export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
      

      建议把JAVA_HOME和M2_HOME记住,待会需要在Jenkins页面中设置

      编辑完成之后保存退出,然后让环境变量生效,执行source /etc/profile,检验是否生效

      root@8286c620ab88:/# source /etc/profile
      root@8286c620ab88:/# java -version
      openjdk version "1.8.0_242"
      OpenJDK Runtime Environment (build 1.8.0_242-b08)
      OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
      root@8286c620ab88:/# mvn -v
      Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
      Maven home: /usr/local/maven3.6
      Java version: 1.8.0_242, vendor: Oracle Corporation, runtime: /usr/local/openjdk-8/jre
      Default locale: en, platform encoding: UTF-8
      OS name: "linux", version: "3.10.0-862.14.4.el7.x86_64", arch: "amd64", family: "unix"
      #设置完成之后即可退出容器
      
    • 为避免在jenkins容器中使用docker命令时权限不足,我这里为了方便,使用了最简单粗暴的方法,在宿主机下使用如下命令修改权限

      [root@node03 data]# chmod 777 /var/run/docker.sock
      

      其他方法可以参考:在docker容器中调用和执行宿主机的docker命令无权限问题

    • 在Jenkins页面中配置JDK和Maven,在Jenkins页面中选择"系统管理"-->"全局工具配置"

      DpG2HP.png

      DpGj4U.png编辑完成之后,点击应用,保存。

    五、GitLab中创建测试项目

    • 我这里选择从模板中创建一个Spring项目,项目名称自拟

      Dpt81g.png

    • 我自己修改了部分pom文件以及Dockerfile文件

      pom文件:

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <groupId>com.example</groupId>
          <artifactId>demo</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <packaging>jar</packaging>
      
          <name>demo</name>
          <description>Demo project for Spring Boot</description>
      
          <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>2.0.1.RELEASE</version>
              <relativePath/> <!-- lookup parent from repository -->
          </parent>
      
          <properties>
              <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
              <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
              <java.version>1.8</java.version>
          </properties>
      
          <dependencies>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
              </dependency>
      
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-test</artifactId>
                  <scope>test</scope>
              </dependency>
          </dependencies>
      
          <build>
              <finalName>SpringProject</finalName>
              <plugins>
                  <plugin>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
                  </plugin>
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-surefire-plugin</artifactId>
                      <version>2.4.2</version>
                      <configuration>
                          <skipTests>true</skipTests>
                      </configuration>
                  </plugin>
              </plugins>
          </build>
          
      </project>
      

      Dockerfile文件:

      FROM maven:3-jdk-8-alpine
      
      MAINTAINER linanjie@aliyun.com
      
      RUN mkdir -p /usr/src/app
      
      WORKDIR /usr/src/app
      
      ENV PORT 5000
      
      EXPOSE $PORT
      
      ADD ./target/SpringProject.jar ./app.jar
      
      ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
      

    六、在Jenkins开发视图中创建流水线任务(pipeline)

    • 任务名按照上面的配置,dev开头的项目属于开发组项目,test开头的项目属于项目,prod开头的属于生产项目;这里仅创建一个开发流水线任务用来演示,测试和生产的配置与开发大同小异。

      注:由于我前面设置开发人员时没有设置"添加凭证"的权限,所以需要在配置任务时,我采用管理员用户登录,因为在配置需要添加凭证才能拉取GitLab中的代码

    • 流水线任务需要编写pipeline脚本,编写脚本的第一步应该是拉取GitLab中的项目

      点击"流水线语法":

      DpyCWR.png

      选择"git":

      DpyT0O.png

      填写刚才在GitLab创建的项目地址,然后选择"凭证"-->添加-->jenkins:

      DpcJiQ.png

      在弹窗中输入对应信息,然后点击"添加":

      DpgsnP.png

      点击"添加"后,在"凭据"下拉选择刚才创建的凭据,然后点击"生成流水线脚本",将生成的脚本复制出来:

      DpR5wV.png

    • 回到配置页面编写pipeline脚本:

      pipeline{
          agent any
      	environment {
      		HARBOR_HOST = "192.168.113.48:8930"
      		BUILD_VERSION = createVersion()
      	}
      	tools{
      		// 添加环境,名称为Jenkins全局配置中自己定义的别名
      		jdk 'jdk1.8'
                    maven 'maven3.6'
          }
          stages{
      		stage("拉取代码"){
      			//check CODE
      			steps {
      				git credentialsId: 'c4d554a2-052c-40d5-bb75-12c5a70e0e97', url: 'http://192.168.113.48:8929/linaj/springproject.git'
      			}
      		}
      		stage("maven构建"){
      			steps {
      				sh "mvn clean package -Dmaven.test.skip=true"
      			}
      		}
      		stage("构建docker镜像,并push到harbor当中"){
      			//docker push
      			steps {
      				sh '''
      					docker build -t springproject:$BUILD_VERSION .
      					docker tag springproject:$BUILD_VERSION ${HARBOR_HOST}/dev/springproject:$BUILD_VERSION
      				'''
      				sh "docker login -u admin -p h12345" + " ${HARBOR_HOST}"
      				sh "docker push ${HARBOR_HOST}/dev/springproject:$BUILD_VERSION"
      				
      			}
      		}
      	}
      }
      
      def createVersion() {
          // 定义一个版本号作为当次构建的版本,输出结果 20201116165759_1
          return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}"
      }
      

      请确保Harbor中已经创建dev仓库;pipeline的写法可以自己在网上学习,脚本中应尽量不要出现明文的密码,为了演示方便,我这里直接使用了harbor的明文密码,正规来说,应该再建一个凭据来维护harborn的用户名和密码,然后再通过脚本去获取凭据中的用户名和密码

      编写完成后点击应用,保存。

    • 回到开发视图页面,构建刚才创建的流水线任务

      Dkb9Pg.png

      Dkj8U0.png

      DkjrUx.png

    • 第一次构建时间相对较久,因为maven构建时需要下载对应依赖,耐心等待构建完成,我这里因为之前已经下载过相关依赖,所以时间较短

      DAd5gs.png

    七、检验

    • 到harbor中查看,发现镜像已上传

      DAwQVf.png

      DAwFUO.png

    • 到另外一台主机拉取镜像,并以该镜像创建容器

      [root@node02 ~]# docker pull 192.168.113.48:8930/dev/springproject:20201116165759_1
      [root@node02 ~]# docker images
      REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
      192.168.113.48:8930/dev/springproject   20201116165759_1    bab09cc7b4e5        13 minutes ago      138MB
      [root@node02 ~]# docker run -p 5000:8080 -d bab0
      d5cbe48b83f3d7b69bfec02692e56e6fd9321e35ef4995faf8a9c659ef00a12d
      [root@node02 ~]# docker ps
      CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
      d5cbe48b83f3        bab0                "java -Djava.securit…"   24 seconds ago      Up 15 seconds       5000/tcp, 0.0.0.0:5000->8080/tcp   interesting_visvesvaraya
      
    • 访问接口

      DABW4O.png

      DADiV0.png

  • 相关阅读:
    Java基础—ArrayList源码浅析
    Java基础——类加载机制
    Java基础——常用类之日期时间类
    Java基础——反射
    栈队列例题3:使用两个栈实现一个队列
    栈队列例题2:SetOfStack放盘子
    栈队列例题1:设置带最小值的栈
    链表例题6:检查链表中的数据是否回文
    队列的实现
    栈的实现
  • 原文地址:https://www.cnblogs.com/linanjie/p/13986198.html
Copyright © 2011-2022 走看看