一、计划

在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. 【python】python返回结果多了none(递归时)

    把每个返回值的print使用return替代即可 例子: def trim(s): if s[:1]==" ": s=s[1:] retrim(s) elif s[-1:]==&q ...

  2. [源码阅读] 阿里SOFA服务注册中心MetaServer(3)

    [源码阅读] 阿里SOFA服务注册中心MetaServer(3) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(3) 0x00 摘要 0x01 概念 1.1 分布式一致性 1.2 ...

  3. 自定义 Spring Boot Starter

    关于Starter Spring Boot秉承"约定大于配置"的开发方式,使得我们基于Spring Boot开发项目的效率变得十分高.相信使用过Spring Boot的小伙伴都会发 ...

  4. BASH提示符颜色、显示返回值,终端标题显示当前目录与正在执行的命令

    BASH的PS1变量控制提示符相关的东西,善用它可以让BASH用起来舒服很多 提示符颜色 提示符显示上一个命令的返回值(exit code),并根据是否0调整颜色 提示符生成的时间(这样就知道上一条命 ...

  5. Spring Aop 详解二

    这是Spring Aop的第二篇,案例代码很详解,可以查看https://gitee.com/haimama/java-study/tree/master/spring-aop-demo. 阅读前,建 ...

  6. Pyqy5 让窗口居中

    # QDesktopWidget import sys from PyQt5.QtWidgets import QDesktopWidget,QMainWindow,QApplication from ...

  7. 使用 Filebeat 对多行日志进行处理(multiline)

    Filebeat 收集日志的过程中,默认是按行收取的,也就是每一行都会默认是一个单独的事件并添加时间戳.但是在收集一些特殊日志的时候,往往一个事件包含有多行,例如 Java 的堆栈跟踪日志: 20-0 ...

  8. LuoguP3615 如厕计划

    题面 现有两个厕所,一个女士专用,一个通用,给出\(2*n\)个排成一列的人的性别 每人如厕需要一分钟,假如女厕是空的,女生中最靠前的可以直接进入. 需要通过调换顺序使得所有人都上完厕所最后的时间为n ...

  9. 在充电桩联网部署方案中4G DTU的优势是什么

    充电桩作为电动汽车充电生态链的一环,具有非常重要的作用,成都远向电子为电动车充电桩.充电站提供专业的无线通信组网产品与技术解决方案,协助充电桩厂家.充电桩运营商.商业充电服务商实现:充电桩设备工作状态 ...

  10. 企业级docker-registry原生镜像仓库高可用部署

    简介: 私有镜像仓库可以方便企业,或个人开发者共享内部镜像而不会泄漏私有代码,而且可以加速镜像的拉取.能更加方便得集成到容器化的 CI/CD 中去.也可建立自己的公共镜像仓库. 优势: Docker ...