一、计划

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

二、jenkins所需插件

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

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

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

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

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

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

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

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

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

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

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

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

  • 权限验证

    admin用户登录:

    开发人员登录:

    测试人员登录:

四、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页面中选择"系统管理"-->"全局工具配置"

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

五、GitLab中创建测试项目

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

  • 我自己修改了部分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中的项目

    点击"流水线语法":

    选择"git":

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

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

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

  • 回到配置页面编写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的用户名和密码,然后再通过脚本去获取凭据中的用户名和密码

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

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

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

七、检验

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

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

    [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
  • 访问接口

GitLab集成Jenkins、Harborn构建pipeline流水线任务的更多相关文章

  1. CI/CD之Gitlab集成Jenkins多分支pipeline实现质量检测和自动发布

    本次实施主要实现: 代码提交gitlab,自动触发Jenkins构建 gitlab发起Merge Request, 需要Jenkins检查通过才可以merge,实现代码review和质量管控 gitl ...

  2. gitlab与jenkins结合构建持续集成

    Jenkins是java编写,需要安装JDK,这里采用 yum 安装,对版本有需求的,可以到 oracle 官网下载 JDK. yum install -y java-1.8.0-openjdk 一. ...

  3. GitLab、Jenkins结合构建持续集成(CI)环境

    1 持续集成 概述及运行流程 1.1 持续集成概述 持续集成概述:持续集成(Continuous integration)持续集成是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干,并迚程自 ...

  4. openshift 持续集成与部署 -- 构建部署流水线

    Jenkins持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.j跟svn.git能无缝集成,也支持直接与知名源代码托管网站,比如github.bitbucket ...

  5. CICD | Jenkins & Gitlab集成:WebHook触发构建

    在上一篇博客中,我们学习了Jenkins的搭建和插件+流水线的基本使用方法,Jenkins极大地提升了部署效率. 最近想学习一下如何集成GitLab webhook,实现进一步解放双手,目标: 推送( ...

  6. gitlab 集成Jenkins

    项目:使用git+jenkins实现持续集成 开始构建  General  源码管理 我们安装的是Git插件,还可以安装svn插件  我们将git路径存在这里还需要权限认证,否则会出现error  我 ...

  7. Jenkins2构建pipeline流水线

    流水线有两种方式: 1.脚本式流水线 2.声明式流水线 构建流水线的简单示例: 脚本式流水线 node ('master'){ stage("Source"){ //从Git仓库中 ...

  8. 持续集成+自动化部署[代码流水线管理及Jenkins和gitlab集成]

    转载:https://www.abcdocker.com/abcdocker/2065 一.代码流水线管理 Pipeline名词顾名思义就是流水线的意思,因为公司可能会有很多项目.如果使用jenkin ...

  9. 持续集成与自动化部署---代码流水线管理及Jenkins和gitlab集成

    1.代码流水线管理 Pipeline名词顾名思义就是流水线的意思,因为公司可能会有很多项目.如果使用jenkins构建完成后,开发构建项目需要一项一项点击,比较麻烦.所以出现pipeline名词. 代 ...

随机推荐

  1. 多测师讲解selenium _ 获取input输入文本值_高级讲师肖sir

    1.get方法来获取到对应元素它的值 案例代码比如在输入框中输入666 driver.find_element_by_css_selector('#kw').send_keys('666')l =dr ...

  2. 浅谈Python常用英文单词

    一.交互式环境与print输出 1.print:打印/输出2.coding:编码3.syntax:语法4.error:错误5.invalid:无效6.identifier:名称/标识符7.charac ...

  3. Hudi on Flink在顺丰的实践应用

    ​ 获取PDF版本 请关注"实时流式计算" 后台回复 "flink1015"

  4. springboot2.2.2企业级项目整合redis与redis 工具类大全

    1.springboot2.2.2整合redis教程很多,为此编写了比较完整的redis工具类,符合企业级开发使用的工具类 2.springboot与redis maven相关的依赖 <depe ...

  5. Mysql索引(一篇就够le)

    我想很多人对mysql的认知可能就是CRUD(代表创建(Create).更新(Update).读取(Retrieve)和删除(Delete)操作),也不敢说自己会用和熟悉mysql,当然我就是其中一个 ...

  6. Tensorflow学习笔记No.7

    tf.data与自定义训练综合实例 使用tf.data自定义猫狗数据集,并使用自定义训练实现猫狗数据集的分类. 1.使用tf.data创建自定义数据集 我们使用kaggle上的猫狗数据以及tf.dat ...

  7. 原生js实现一个自定义下拉单选选择框

    浏览器自带的原生下拉框不太美观,而且各个浏览器表现也不一致,UI一般给的下拉框也是和原生的下拉框差别比较大的,这就需要自己写一个基本功能的下拉菜单/下拉选择框了.最近,把项目中用到的下拉框组件重新封装 ...

  8. 使用docker安装E

     环境 虚拟机软件VmWare15.5 Centos7.0 安装docker yum install docker

  9. linux(centos8):安装配置consul集群(consul 1.8.4 | centos 8.2.2004)

    一,什么是consul? 1,Consul 是 HashiCorp 公司推出的开源软件,用于实现分布式系统的服务发现与配置. Consul 是分布式的.高可用的. 可横向扩展的   2,官方网站: h ...

  10. spring boot:用zxing生成二维码,支持logo(spring boot 2.3.2)

    一,zxing是什么? 1,zxing的用途 如果我们做二维码的生成和扫描,通常会用到zxing这个库, ZXing是一个开源的,用Java实现的多种格式的1D/2D条码图像处理库. zxing还可以 ...