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


































































































































































相关文章
|
13天前
|
jenkins 测试技术 持续交付
Docker最佳实践:构建高效的CI/CD流水线
【10月更文挑战第17天】在现代软件开发实践中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)已成为提高开发效率和软件质量的重要手段。Docker作为一种容器技术,为构建一致且隔离的开发环境提供了强有力的支撑。本文将探讨如何利用Docker来优化CI/CD流程,包括构建环境的标准化、镜像管理以及与CI/CD工具(如Jenkins、GitLab CI)的集成。
34 5
|
12天前
|
Kubernetes 持续交付 Docker
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
54 2
|
24天前
|
运维 jenkins 持续交付
自动化部署的魅力:如何用Jenkins和Docker简化运维工作
【10月更文挑战第7天】在现代软件开发周期中,快速且高效的部署是至关重要的。本文将引导你理解如何使用Jenkins和Docker实现自动化部署,从而简化运维流程。我们将从基础概念开始,逐步深入到实战操作,让你轻松掌握这一强大的工具组合。通过这篇文章,你将学会如何利用这些工具来提升你的工作效率,并减少人为错误的可能性。
|
25天前
|
运维 监控 Devops
自动化运维的魔法:打造高效DevOps流水线
【10月更文挑战第6天】 在现代软件开发的快节奏中,自动化运维成为提高效率、保障质量的重要手段。本文将带你了解如何构建高效的DevOps流水线,从持续集成到部署,再到监控和反馈,我们将一步步揭开自动化运维的神秘面纱。你将学习到如何通过代码和工具的结合,实现软件交付过程的自动化,以及如何通过这一流程提升团队的协作和响应速度。让我们开始探索自动化运维的奇妙之旅吧!
|
15天前
|
安全 Devops 网络安全
【DevOps】Docker 最佳实践指南(绝对干货)
Docker 是一种领先的容器化平台,可简化应用开发、部署和管理。本文档介绍 Docker 的最佳实践,涵盖安全性、网络、镜像、主机安全及资源限制等方面,帮助用户高效利用 Docker,确保应用的安全性和性能。
82 0
|
2月前
|
Devops jenkins 持续交付
DevOps实践:构建和部署一个Docker化的应用
【9月更文挑战第14天】在当今快节奏的软件开发领域,DevOps已经成为提升效率、加速交付的关键。本文将引导你理解DevOps的核心概念,并通过一个实际的示例—构建和部署一个Docker化的应用—来深入探讨其实践方法。我们将从简单的应用出发,逐步实现Docker容器化,并最终通过CI/CD流水线自动化部署过程。这不仅是对DevOps流程的一次实操演练,也是对现代软件开发理念的一次深刻体验。
|
2月前
|
运维 Devops jenkins
自动化运维:打造高效DevOps流水线
【8月更文挑战第44天】本文将通过深入浅出的方式,带你构建一个自动化的DevOps流水线,提升开发和部署效率。从基础概念到实际操作,我们一步步剖析如何实现代码提交、自动测试、构建、部署的全过程自动化。你将学会使用Jenkins、Git、Docker等工具,并结合Shell脚本编写,完成一个完整的自动化流程。文章末尾附有完整的示例代码,助你快速上手实践。
|
3月前
|
Java Spring 传感器
AI 浪潮席卷,Spring 框架配置文件管理与环境感知,为软件稳定护航,你还在等什么?
【8月更文挑战第31天】在软件开发中,配置文件管理至关重要。Spring框架提供强大支持,便于应对不同环境需求,如电商项目的开发、测试与生产环境。它支持多种格式的配置文件(如properties和YAML),并能根据环境加载不同配置,如数据库连接信息。通过`@Profile`注解可指定特定环境下的配置生效,同时支持通过命令行参数或环境变量覆盖配置值,确保应用稳定性和可靠性。
59 0
|
3月前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
42 0
|
3月前
|
JavaScript jenkins 持续交付
自动化部署与持续集成:使用Jenkins和Docker优化开发流程
【8月更文挑战第31天】在软件开发的世界里,时间就是一切。本文将引导你通过Jenkins和Docker的强大组合,实现自动化部署和持续集成,让你的开发流程如丝般顺滑。我们将从基础设置开始,逐步深入到构建管道,最终实现一键部署的梦想。准备好让你的开发效率飞跃,一起探索这个令人兴奋的旅程吧!