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


































































































































































相关文章
|
2月前
|
jenkins 持续交付 开发者
自动化部署:使用Jenkins和Docker实现持续集成与交付
【8月更文挑战第31天】本文旨在为读者揭示如何通过Jenkins和Docker实现自动化部署,从而加速软件开发流程。我们将从基础概念讲起,逐步深入到实际操作,确保即使是初学者也能跟上步伐。文章将提供详细的步骤说明和代码示例,帮助读者理解并应用这些工具来优化他们的工作流程。
|
2月前
|
jenkins 持续交付 开发工具
jenkins学习笔记之一:流水线基础语法
jenkins学习笔记之一:流水线基础语法
|
23天前
|
Devops jenkins 持续交付
DevOps实践:构建和部署一个Docker化的应用
【9月更文挑战第14天】在当今快节奏的软件开发领域,DevOps已经成为提升效率、加速交付的关键。本文将引导你理解DevOps的核心概念,并通过一个实际的示例—构建和部署一个Docker化的应用—来深入探讨其实践方法。我们将从简单的应用出发,逐步实现Docker容器化,并最终通过CI/CD流水线自动化部署过程。这不仅是对DevOps流程的一次实操演练,也是对现代软件开发理念的一次深刻体验。
|
25天前
|
运维 Devops jenkins
自动化运维:打造高效DevOps流水线
【8月更文挑战第44天】本文将通过深入浅出的方式,带你构建一个自动化的DevOps流水线,提升开发和部署效率。从基础概念到实际操作,我们一步步剖析如何实现代码提交、自动测试、构建、部署的全过程自动化。你将学会使用Jenkins、Git、Docker等工具,并结合Shell脚本编写,完成一个完整的自动化流程。文章末尾附有完整的示例代码,助你快速上手实践。
|
2月前
|
Java Spring 传感器
AI 浪潮席卷,Spring 框架配置文件管理与环境感知,为软件稳定护航,你还在等什么?
【8月更文挑战第31天】在软件开发中,配置文件管理至关重要。Spring框架提供强大支持,便于应对不同环境需求,如电商项目的开发、测试与生产环境。它支持多种格式的配置文件(如properties和YAML),并能根据环境加载不同配置,如数据库连接信息。通过`@Profile`注解可指定特定环境下的配置生效,同时支持通过命令行参数或环境变量覆盖配置值,确保应用稳定性和可靠性。
46 0
|
2月前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
35 0
|
2月前
|
JavaScript jenkins 持续交付
自动化部署与持续集成:使用Jenkins和Docker优化开发流程
【8月更文挑战第31天】在软件开发的世界里,时间就是一切。本文将引导你通过Jenkins和Docker的强大组合,实现自动化部署和持续集成,让你的开发流程如丝般顺滑。我们将从基础设置开始,逐步深入到构建管道,最终实现一键部署的梦想。准备好让你的开发效率飞跃,一起探索这个令人兴奋的旅程吧!
|
2月前
|
jenkins Shell 持续交付
自动化部署:使用Jenkins和Docker实现CI/CD
【8月更文挑战第31天】 本文旨在引导读者了解如何通过Jenkins和Docker来实现持续集成和持续部署(CI/CD),从而优化开发流程,提升工作效率。文章将详细介绍配置Jenkins服务器、创建Docker镜像以及设置自动化构建和部署的步骤。通过实际操作案例,我们将展示如何将代码变更快速部署到测试或生产环境,确保软件质量与发布速度的双重保障。
|
2月前
|
前端开发 Devops 持续交付
【前端自动化新高度】Angular与Azure DevOps完美结合:从零构建持续集成与持续部署的全自动流水线,提升开发效率与软件交付质量!
【8月更文挑战第31天】Angular作为领先的前端框架,以强大功能和灵活性深受开发者喜爱。Azure DevOps提供一站式DevOps服务,涵盖源码管理、持续集成(CI)及持续部署(CD)。本文将指导你如何在Azure DevOps中搭建Angular项目的CI/CD流程,并通过具体示例代码展示整个过程。首先,我们将创建一个Angular项目并初始化Git仓库;然后,在Azure DevOps中设置CI流水线,定义YAML文件以自动化构建和部署流程。最终实现每次提交代码后自动构建并部署至Azure Web App,极大提升了开发效率和软件交付速度,使团队更专注于创新。
21 0
|
2月前
|
jenkins 持续交付 开发工具
Jenkins 与 Docker 集成的最佳实践
【8月更文第31天】随着容器技术的兴起,越来越多的团队开始采用 Docker 来构建和部署应用。Docker 提供了一种轻量级的虚拟化方法,使得应用可以在任何地方以相同的方式运行,这极大地提高了开发效率和部署的一致性。与此同时,Jenkins 作为一种广泛使用的持续集成/持续交付(CI/CD)工具,可以帮助团队自动化构建、测试和部署流程。本文将探讨如何将 Docker 与 Jenkins 集成,以简化开发环境的搭建和维护。
174 0