devOps-jenkins流水线使用(docker in docker)

简介: 1. 容器安装jenkins (docker in docker)2. jenkins 流水线使用3. jenkins Generic Webhook Trigger 使用4. jenkins 集成 allure5. jenkins docker in dcoker 镜像构建

gitlab 安装



docker run -itd \
  -p 8443:443 - 8085:8085 -p 222:22 \
  -u root \
  --name gitlab \
  --restart always \
  --volume /srv/gitlab/config:/etc/gitlab \
  --volume /srv/gitlab/logs:/var/log/gitlab \
  --volume /srv/gitlab/data:/var/opt/gitlab \
  --privileged=true \
  gitlab/gitlab-ce:latest



/srv/gitlab/config目录,编辑 gitlab.rb


╰─# pwd
/srv/gitlab/config
╭─root@gitlab /srv/gitlab/config 
╰─# ls
gitlab.rb  gitlab-secrets.json  ssh_host_ecdsa_key  ssh_host_ecdsa_key.pub  ssh_host_ed25519_key  ssh_host_ed25519_key.pub  ssh_host_rsa_key  ssh_host_rsa_key.pub  trusted-certs
╭─root@gitlab /srv/gitlab/config 
╰─# vim gitlab.rb

修改external_url

image.png




docker 安装jenkins



docker run --name jenkins -itd \
       -p 8088:8080 \
       -p 50000:50000 \
       -u root --privileged=true \
       -v /var/jenkins_home:/var/jenkins_home \
       -v /var/run/docker.sock:/var/run/docker.sock \
       -v /usr/bin/docker:/usr/bin/docker \
       jenkins/jenkins:lts


-u root --privileged=true  : 使用root用户登录,在流水线中,具有对在root用户和用户组操作权限。

比如: jenkins 容器内容, 通过docker run 运行镜像时,指定的外部存储,以root用户创建,使用jenkins 用户因权限,无法删除。在root 的用户可以删除



jenkins容器中查看运行docker权限



进入jenkins容器中

docker exec -it jenkins bash

查看docker 运行权限

jenkins@1526e057673c:/$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
jenkins@1526e057673c:/$ 


通过 docker ps 命令, jenkins 用户是没有权限,执行挂载的 docker




解决无权限执行挂载的docker问题



查看 docker容器中,是否有root用户组, 并将jenkins 用户添加到root组中


jenkins@1526e057673c:/$ cat /etc/group | grep root
root:x:0:
jenkins@1526e057673c:/$ 


把jenkins 用户添加root组中:



# docker exec -it -u root  jenkins bash
root@1526e057673c:/# 


使用root 用户重新进入jenkins容器中

root@1526e057673c:/# usermod -aG root jenkins


root用户退出jenkins容器中


root@1526e057673c:/# exit  // 退出jenkins容器



使用jenkins 用户再次进入jenkins容器中,执行docker ps 验证权限

jenkins@1526e057673c:/$ docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED          STATUS                    PORTS                                                                                                             NAMES
1526e057673c   jenkins/jenkins:lts       "/usr/bin/tini -- /u…"   15 minutes ago   Up 15 minutes             0.0.0.0:50000->50000/tcp, :::50000->50000/tcp, 0.0.0.0:8088->8080/tcp, :::8088->8080/tcp                          jenkins
25b80990c9f8   gitlab/gitlab-ce:latest   "/assets/wrapper"        13 hours ago     Up 28 minutes (healthy)   0.0.0.0:222->22/tcp, :::222->22/tcp, 0.0.0.0:85->80/tcp, :::85->80/tcp, 0.0.0.0:8443->443/tcp, :::8443->443/tcp   gitlab
jenkins@1526e057673c:/$ 


注意: 以上操作完成以后,在jenkins 容器中,执行docker ps ,有可能会出现一下问题


jenkins@1526e057673c:/$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
jenkins@1526e057673c:/$ exit


说明  /var/run/docker.sock  文件没有可执行权限, 需要给权限大一些


╭─root@dev /srv/gitlab/config 
╰─# where docker                                                                                                                                                                                     1 ↵
/usr/bin/docker
╭─root@dev /srv/gitlab/config 
╰─# chmod 777 /var/run/docker.sock



插件安装



Allure
AnsiColor
Blue Ocean
Generic Webhook Trigger
Git
Gitlab
HTTP Request




构建凭据



创建 gitlab Api token: 用于jenkins 访问 gitlab api 的凭证

image.png



系统设置



Dashboard 》 系统管理 》Configure Sytem:


设置gitlab connect 配置:


image.png






创建流水线



构建pytest-demo 作业:


全局配置


设置gitlab connection:


image.png



参数化配置



image.png


构建触发器


从gitlab api 返回的 数据中,通过$.ref 关键字,匹配并提出 分支 名称,赋值与branch,用于在流水线中引用。


image.png



从gitlab api 返回的 数据中,通过$.user_username关键字,匹配并提出 开发者 名称,赋值与userName,用于在流水线中引用。

image.png



从gitlab api 返回的 数据中,通过$.project.id关键字,匹配并提出 项目 ID,赋值与projectId,用于在流水线中引用。


image.png





从gitlab api 返回的 数据中,通过$.checkout_sha关键字,匹配并提出 提交的状态,赋值与commitSha,用于在流水线中引用。在流水线中,通过projectId + commitSha 修改gitlab的流水线的提交状态


image.png




从gitlab api 返回的 数据中,提出object_kind, before, after ,用于 过滤特殊的push请求。如:新建一个分支或者标签

image.png




image.png



image.png




打印流水线执行日志信息配置:



image.png




配置过滤  创建分支, 删除分支 动作,不触发构建


image.png


Request parameter 配置


image.png



Token的配置


token的作用: 区分过滤指定token的事件流水线

image.png




在gitlab中添加jenkins的hook


项目pytest-demo 》settings 》Webhooks

image.png



image.png



image.png


高级项目配置


在项目中的根目录下,包含一个Jenkinsfile文件,用于配置流水线


image.pngimage.png



执行脚本配置

image.png




流水线脚本案例



流水线语法参考


pipeline {
    agent {
        docker { 
            image 'maven:3.6.3-jdk-8' 
            args '-v $HOME/.m2:/root/.m2'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -v'
            }
        }
    }
}






共享库使用


示例:

#!groovy
@Library('jenkinslibrary@main') _
//func from shareibrary
def gitlab = new org.devops.gitlab()
//获取gitlab提交的分支名
branchName = branch - "refs/heads/"
//设置构建描述
currentBuild.description = "Trigger by ${userName} ${branch}"
// 更改gitlab流水线状态,初始状态为 running
gitlab.ChangeCommitStatus(projectId,commitSha,"running")
//pipeline
pipeline{
    agent any
    stages{
        stage("CheckOut"){
            steps{
                script{
                    println("${branchName}")
                }
            }
        }
    }
    post {
        always{
            script{
                println("always")
            }
        }
        success{
            script{
                println("success")
                gitlab.ChangeCommitStatus(projectId,commitSha,"success")
            }
        }
        failure{
            script{
                println("failure")
                gitlab.ChangeCommitStatus(projectId,commitSha,"failed")
            }
        }
        aborted{
            script{
                println("aborted")
                gitlab.ChangeCommitStatus(projectId,commitSha,"canceled")
            }
        }
    }
}



在以上的配置中引用了共享库,

@Library('jenkinslibrary@main') _

使用共享库,调用gitlab的API 来更改 流水线的状态



gitlab构建共享库



image.png



image.png



image.png


由于在共享库中,使用了创建gitlab-token,

在jenkins中添加一个凭据用户存储Gitlab的token,这里定义的凭据名称是gitlab-token


使用流水线语法生成语句:

image.png





重新构建流水线, 加载共享库失败



image.png


设置共享库配置


这里的错误,启动共享库失败,需要在系统管理 -> configure system -> 设置共享库

image.png



image.png


设置共享库之后,提交代码,触发构建,由于在共享库中,使用了 httprequest, 缺省插件的错误



image.png



在系统管理-插件管理- 安装插件 http request 插件



image-20221209001422194.png



插件安装成功以后, 提交代码,重新构建,状态成功更改


image-20221209001819308.png




流水线常用语法



根据分支动态checkout代码

image.png



docker 编译

image.png























jenkins更多语法参考



相关文档

http://docs.idevops.site/jenkins/


实例代码

https://github.com/zeyangli


































































































































































相关文章
|
3天前
|
存储 运维 Kubernetes
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
|
3天前
|
jenkins 持续交付 开发工具
Jenkins 快速入门 (含Jenkins + Docker + Git 简单的自动化实操)(下)
Jenkins 快速入门 (含Jenkins + Docker + Git 简单的自动化实操)
|
7天前
|
运维 前端开发 Devops
云效产品使用报错问题之流水线打包docker镜像时报网络代理有问题如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
23天前
|
jenkins 测试技术 持续交付
软件测试|docker搭建Jenkins+Python+allure自动化测试环境
通过以上步骤,你可以在Docker中搭建起Jenkins自动化测试环境,实现Python测试的自动化执行和Allure报告生成。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
45 6
|
27天前
|
jenkins 持续交付
Jenkins构建简单流水线
Jenkins构建简单流水线
12 0
|
1月前
|
jenkins Java 持续交付
Docker搭建持续集成平台Jenkins最简教程
Jenkins 是一个广泛使用的开源持续集成工具,它能够自动化构建、测试和部署软件项目。在本文中,我们将使用 Docker 搭建一个基于 Jenkins 的持续集成平台。
121 2
|
1月前
|
JavaScript jenkins 持续交付
Jenkins自动构建 CI/CD流水线学习笔记(从入门到入土,理论+示例)
Jenkins自动构建 CI/CD流水线学习笔记(从入门到入土,理论+示例)
61 0
|
1月前
|
JavaScript Java jenkins
如何利用CentOS7+docker+jenkins+gitee部署springboot+vue前后端项目(保姆教程)
如何利用CentOS7+docker+jenkins+gitee部署springboot+vue前后端项目(保姆教程)
87 0
|
1月前
|
jenkins Java 持续交付
Docker Swarm总结+Jenkins安装配置与集成(5/5)
Docker Swarm总结+Jenkins安装配置与集成(5/5)
55 0
|
1月前
|
jenkins Java 持续交付
Docker Swarm总结+Jenkins安装配置与集成snarqube和目标服务器(4/5)
Docker Swarm总结+Jenkins安装配置与集成snarqube和目标服务器(4/5)
44 0