• 【Jenkins使用之五】jenkins集成Gitlab-拉取代码


    【Jenkins使用之五】jenkins集成Gitlab
    环境
      CentOS Linux release 7.6.1810
      jdk1.8.0_65
      apache-tomcat-8.5.45
      Jenkins-2.235.5
      apache-maven-3.6.3
      git-2.9.5
      gradle-6.6.1
      SonarQube-7.8
      sonar-scanner-cli-4.2.0.1873

    拓扑:
      node1:安装GitLab、SonarQube
      node2:安装Jenkins、Git、MAVEN

    一、SSH key
    SSH(Secure Shell Protocol):是一种协议,在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输,确保了传递的数据安全。
    SSH key即SSH密钥对,可以让您方便的登录到SSH服务器,而无需输入密码,也就是免密登录。SSH 密钥对总是成双出现的,一把公钥,一把私钥。公钥可以自由的放在您所需要连接的SSH服务器上,而私钥保存在客户端。

    1、公钥和私钥作用
    (1)什么是公钥登录
    公钥登录,很多时候也说public key认证,公钥登录的原理:首先用户将自己的公钥存储在需要登录的远程机器上面,然后登录的时候,远程主机会向用户发送一段随机字符串,接着用户使用自己的私钥加密字符串,并发给远程主机。最后,远程主机使用存储的公钥进行解密,若解密成功,则说明用户可信,准许登录,不在提示输入密码。

    备注:
    1)服务端会将客户端发的公钥写入到~/.ssh/authorized_keys 文件末尾。
    2)公钥和私钥在客户端(登录端)生成

    (2)什么是口令登录
    口令登录,即登录的时候需要输入登录密码。

    1)客户端向服务器发出请求
    2)服务器将自己的公钥返回给客户端;
    3)客户端用服务器的公钥加密登录信息, 再将信息发送给服务器;
    4)服务器接收到客户端传送的登录信息, 用自己的私钥解码, 如果结果正确, 则同意登录, 建立起连接。

    备注:公钥和私钥在服务端生成

    2、密钥对的生成

    sh-keygen命令,可以生成公钥和私钥,默认生成到用户的家目录下的.ssh文件夹里面
    示例:ssh-keygen -t rsa -C "cac2020@163.com"
    私钥默认会被保存在 ~/.ssh/id_rsa
    公钥默认会被保存在 ~/.ssh/id_rsa.pub
    参数解析:
      -f 指定要生成文件的文件名称
      -t 设置认定方式,值为rsa,即非对称加密;或dsa,即数字签名和认证
      -c 指定公钥中的备注信息。在gitlab里备注一般使用邮箱,因为像gitlab、github等都是通过邮箱来区分的,邮箱仅仅是识别用的key

    二、为什么GitLab需要SSH Key
    因为GitLab需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitLab只要知道了你的公钥,就可以确认只有你自己才能推送。另外,CI/CD(服务器环境,不能阻塞态等待输入)
    https开头的就是用的https了,git@ 开头的就是用的ssh了.

    场景一:不同账号生成不同SSH Key

    (1)打开Git Bash,输入ssh-keygen -t rsa -C "cac2020@163.com" ,三个回车,没有输入密码,最后在用户家目录下找到.ssh目录

    (2)拷贝公钥里面的内容,粘贴到GitLab-->Settings下面SSH Keys里

    (3)配置完成上面操作后,会发现Gitlab里项目地址已经变成了:git@192.168.76.65:sonartest/maven-basic.git SSH的了.
    然后到本地项目目录下Git Bash执行 git config --global credential.helper store,再次pull或者push的时候还要输入用户名和密码,输入之后 下次就不用再输入了。注意:如果账或者邮箱错误 可以重新按照以上步骤重新生成。

    参考:另外一种免密登录的配置方式

    场景二:同一账号多个终端生成不同SSH Key
    GitLab允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitLab,就可以在每台电脑上往GitLab推送了。那最好这里-C指定的title最好是主机名来区分。

    场景三:一个终端配置多个ssh key
    大多数时候,我们的机器上会有很多的git host,比如公司gitlab、github、oschina等,那我们就需要在本地配置多个ssh key,使得不同的host能使用不同的ssh key。以前用github的ssh key,后来工作原因多了一个gitlab的账号,在绑定gitlab的ssh key时,发现将github的ssh key覆盖了。怎么同时绑定github和gitlab的ssh key,并不产生冲突呢?技巧是在.ssh目录下新建一个config文件配置一下,就能解决gitlab与github的ssh key的冲突。
    做法如下:问题的关键是生成密钥对的时候需要指定文件
    (1)生成公司的GitLab秘钥ssh key

    ssh-keygen -t rsa -C 'yourEmail@xx.com' -f ~/.ssh/gitlab-rsa

    (2)生成github秘钥ssh key

    ssh-keygen -t rsa -C 'yourEmail2@xx.com' -f ~/.ssh/github-rsa

    (3)登录ssh-agent 添加添加私钥

    eval `ssh-agent`
    ssh-add ~/.ssh/id_rsa_github
    ssh-add ~/.ssh/id_rsa_gitlib
    ssh-add ~/.ssh/id_rsa_oschina
    ssh-add ~/.ssh/id_rsa_foxmail

    (4)在~/.ssh目录下新建名称为config的文件(无后缀名)。用于配置多个不同的host使用不同的ssh key,内容如下:

    Host github.com
        HostName github.com
        User smallajax@foxmail.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_rsa_github
    Host gitlib.com
        HostName gitlib.com
        User smallajax@foxmail.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_rsa_gitlib
    Host oschina.com
        HostName oschina.com
        User smallajax@foxmail.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_rsa_oschina
    Host 192.168.1.222
        HostName 192.168.1.222
        User smallajax@foxmail.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_rsa_foxmail
    # 配置文件参数
    # Host : Host可以看作是一个你要识别的模式,对识别的模式,进行配置对应的的主机名和ssh文件
    # HostName : 要登录主机的主机名
    # User : 登录名,填邮箱或者用户名都可以
    # IdentityFile : 指明上面User对应的identityFile路径

    (5)按照上面的步骤分别往gitlab和github上添加生成的公钥gitlab_id-rsa.pub和github_id-rsa.pub

    然后就可以clone、push、pull了,注意在内网、虚机、Docker安装的Gitlab,可能会出现问题:

    git@192.168.76.65: Permission denied (publickey,password,keyboard-interactive).
    fatal: Could not read from remote repository.

    那么宿主机的22端口可能被占用等引起。

    参考:git多账号设置免密登录
    git多账号免密登录2

    附:对于Http协议登录,git可以记住首次输入的密码,后面不再输入

    (1)取消全局用户名和邮箱设置

    git config --global --unset user.name
    git config --global --unset user.email

    (2)启用git 认证保存

     git config --global credential.helper store

    (3)首次pull push clone需要输入密码 后面不再输入

    三、jenkins集成Gitlab

    1、安装Git
    安装Git:因为我们需要从GitLab上拉取代码。

    参考:git安装

    2、jenkins安装GitLab插件

    3、配置jenkins访问Gitlab凭证
    这里涉及两种凭证:
    第一个是拉取代码库的凭证,这个凭证有多种方式,这里介绍两种:
    (1)配置Username with password类型,使用http协议

    ID设立一个简洁,有含义的名称,因为后面我们将要在脚本中通过这个id名称来调用这个账户来连接gitlab获取数据

    (2)配置SSH Username with private key类型,使用SSH协议,需要配置免密登录
    #首先在jenkins所在主机node2下生成一对公钥和私钥

    [root@node2 ~]# ssh-keygen -t rsa -C 'cac2020@163.com'
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    Created directory '/root/.ssh'.
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:vWziB4fz4ilri49Glp7OHzySj6upKitkQuLRP7DlTaQ cac2020@163.com
    The key's randomart image is:
    +---[RSA 2048]----+
    |                 |
    |       .         |
    |  .   o          |
    |.o o E . .       |
    |+ . *.o S..      |
    |.+ .+* .+...     |
    |+  +o.= .=+      |
    |o  o+*o+.+o      |
    |Boo+B=*=+o       |
    +----[SHA256]-----+

    #然后将公钥内容加到Gitlab里的SSH keys  见上面 二 部分。

    #然后将私钥加到Jenkins里的凭证里  在项目里使用

    第二个是jenkins访问Gitlab提供的API接口的凭证

    Jenkins连接gitlab需要配置access token,所以先在gitlab上生成access token,后将该token配置在Jenkins上。(access token只需配置一次,后续每个工程直接使用即可)
    (1)在Gitlab里生成personal access token

    (2)在jenkins配置凭证
    Credentials配置GitLab API token类型

    (3)配置jenkins全局配置

     

    4、项目构建触发方式-Build Triggers
    我们这里项目类型是pipeline流水线类型,这里将两个常见的触发类型
    4.1 定时触发
    勾选Build periodically,下面配置cron表达式,这个常见。

    4.2 webhook触发事件触发

    就是开发人员随时开发 随时发布  随时测试这种场景,需要GitLab配置webhook。Build Triggers 模块下配置触发器,webhook 相关的触发有如下三种:

    方式一:Generic Webhook Trigger

    方式二:Build when a change is pushed to GitLab. GitLab CI Service URL: http://x.x.x.x:8888/project/project-name
    这种方式依赖Gitlab Hook Plugin,GitLab Plugin,Gitlab Authentication plugin插件

    如果报错参考:Hook executed successfully but returned HTTP 403 

    方式三:Trigger builds remotely (e.g., from scripts)

    (1)在Jenkins所在主机生成一个Token,Build Triggers下勾选 Trigger builds remotely (e.g., from scripts),填入Authentication Token(身份验证令牌)框

    [root@node2 repo]# openssl rand -hex 12
    9f87e6362bb720f3b7b78121

    (2)生成当前jenkins构建用户的API token,我这里使用的是admin用户,生成的API Token是119e934834ed454acfb8bbffb244ef9d97

    (3)组装HookURL,配置到GitLab里

    格式:http://jenkins用户名:apitoken@jenkinsURL/job/构建任务名/build?token=(1)步骤中生成的Authentication Token

    我这个是:http://admin:119e934834ed454acfb8bbffb244ef9d97@134.32.80.196:8080/job/test3-pipeline/build?token=9f87e6362bb720f3b7b78121

     

    可能产生的问题:问题:Hook executed successfully but returned HTTP 403 (No valid crumb was included in the request)

    参考:
    Gitlab Jenkins WebHook 持续集成配置踩坑记 
    Build Triggers 

    5、拉取代码
    test3-pipeline任务核心就是 pipeline里的配置,这个环节有两种类型:Pipeline script 和 Pipeline script from scm

    示例GitLab项目:项目下面只有一个README.md文件:


    5.1 Pipeline script类型
    可以使用pipeline声明式语法,也可以使用脚本式语法。这里用的git命令拉取代码。

    node(){
        def workspace = pwd()  
        stage 'checkout'
            dir('base'){
                git credentialsId: 'gitlab-wangjy', url: 'http://192.168.82.46:19527/wjy/citest.git'
            }
            sh """
            echo $workspace
            """
    }
    
    命令解释:
    (1)def workspace = pwd() 
    此处等同于linux命令行中pwd命令,等于把当前路径赋值给workspace变量,
    (2)dir('base')
    创建base目录:用于存放本次从gitlab中拉取的代码
    base目录绝对路径是:Jenkins家目录下/workspace/任务名称/base,我这里是/data/.jenkins/workspace/test3-pipeline
    (3)注意这里用到了git命令,所以前面要在jenkins-->Manage Jenkins-->Global Tool Configuration设置Git路径
    (4)credentialsId指上面配置的Gitlab账户凭证标识,这里使用的是Username with password类型的凭证,url就选用http类型

    查看生成的目录:

    [root@node106 base]# pwd
    /data/.jenkins/workspace/test3-pipeline/base
    [root@node106 base]# ll
    total 4
    -rw-r----- 1 root root 26 Sep 10 18:08 README.md

    查看任务执行日志:

    写pipeline脚本的技巧,使用Pipeline Syntax自动生成脚本:

     5.2 Pipeline script from SCM类型

    这种方式使用Jenkinsfile,使用声明式pipeline脚本,这样便于构建代码的版本化管理,这是业界推荐的一种做法。

    此选项指示Jenkins从源代码管理(SCM)仓库获取你的流水线配置文件Jenkinsfile,里面是pipeline脚本,这里的仓库就是你clone到本地的Git仓库。
    (1)首先配置jenkinsfile对应的Git仓库信息,这里需要说明

    (2)编写Jenkinsfile,这里使用pipeline声明式语法来编写

    在工程根目录下新建一个文件Jenkinsfile,因为上面配置的脚本路径就是:Jenkinsfile,没有多级目录:

    在Jenkinsfile里编写如下脚本:

    pipeline{
        agent any
        options {
            ansiColor('xterm')
        }
        stages{
            stage("代码下载"){
                steps{
                    script{
                        sh  """
                        echo 123
                        """
                checkout scm
    echo "33[31m 红任务已执行完成 33[0m" echo "33[30m 黑任务已执行完成 33[0m" echo "33[32m 绿任务已执行完成 33[0m" echo "33[33m 黄任务已执行完成 33[0m" echo "33[34m 蓝任务已执行完成 33[0m" echo "33[35m 紫任务已执行完成 33[0m" echo "33[36m 深绿任务已执行完成 33[0m" echo "33[37m 白色任务已执行完成 33[0m" } } } } }

    解释:

    ansiColor('xterm'):配置彩色打印信息到控制台;
    checkout SCM 可以用来下载git仓代码;  注意使用Pipeline script from SCM类型 默认会执行 checkout scm,脚本里显式使用checkout scm会再次拉取一遍代码

    checkout步骤将从源检出代码; scm是一个特殊变量,指示checkout步骤克隆触发此Pipeline运行的特定修订。

    另外在pipeline可以checkout指定版本的代码,不是用git命令:

    stage('get code '){       
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'git@github.dfc.com:newback/dfc.git']]])
             }
    }

    传统方式执行,打印日志到控制台:

    另外可以使用Blue Ocean插件来创建、查看pipeline视图:

    代码下载目录清单:

    [root@node2 test3-pipeline]# pwd
    /data/.jenkins/workspace/test3-pipeline
    [root@node2 test3-pipeline]# tree
    .
    ├── Jenkinsfile
    ├── pom.xml
    ├── README.MD
    └── src
    
    1 directory, 3 files

    参考:
    Jenkins Pipeline+Maven+Gitlab持续集成构建
    jenkins集成Gitlab

    checkout SCM 

  • 相关阅读:
    C语言实现表达式求值,支持+、-、*、/四则运算,并且支持多级括号,自定义了栈的操作。
    postman-Runner
    Jmeter性能测试,使用ServerAgent监控服务端性能指标
    python使用bs4爬取boss静态页面
    selenium环境搭建,浏览器驱动安装
    python使用HTMLTestRunner.py生成测试报告
    偶现bug如何处理?
    Java连接数据库,及增删改查
    Java的get、post请求
    TestNG安装及使用
  • 原文地址:https://www.cnblogs.com/cac2020/p/13644966.html
Copyright © 2020-2023  润新知