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
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 的凭证
系统设置
Dashboard 》 系统管理 》Configure Sytem:
设置gitlab connect 配置:
创建流水线
构建pytest-demo 作业:
全局配置
设置gitlab connection:
参数化配置
构建触发器
从gitlab api 返回的 数据中,通过$.ref 关键字,匹配并提出 分支 名称,赋值与branch,用于在流水线中引用。
从gitlab api 返回的 数据中,通过$.user_username关键字,匹配并提出 开发者 名称,赋值与userName,用于在流水线中引用。
从gitlab api 返回的 数据中,通过$.project.id关键字,匹配并提出 项目 ID,赋值与projectId,用于在流水线中引用。
从gitlab api 返回的 数据中,通过$.checkout_sha关键字,匹配并提出 提交的状态,赋值与commitSha,用于在流水线中引用。在流水线中,通过projectId + commitSha 修改gitlab的流水线的提交状态
从gitlab api 返回的 数据中,提出object_kind, before, after ,用于 过滤特殊的push请求。如:新建一个分支或者标签
打印流水线执行日志信息配置:
配置过滤 创建分支, 删除分支
动作,不触发构建
Request parameter 配置
Token的配置
token的作用: 区分过滤指定token的事件流水线
在gitlab中添加jenkins的hook
项目pytest-demo 》settings 》Webhooks
高级项目配置
在项目中的根目录下,包含一个Jenkinsfile文件,用于配置流水线
执行脚本配置
流水线脚本案例
流水线语法参考
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构建共享库
由于在共享库中,使用了创建gitlab-token,
在jenkins中添加一个凭据用户存储Gitlab的token,这里定义的凭据名称是gitlab-token
使用流水线语法生成语句:
重新构建流水线, 加载共享库失败
设置共享库配置
这里的错误,启动共享库失败,需要在系统管理 -> configure system -> 设置共享库
设置共享库之后,提交代码,触发构建,由于在共享库中,使用了 httprequest, 缺省插件的错误
在系统管理-插件管理- 安装插件 http request 插件
插件安装成功以后, 提交代码,重新构建,状态成功更改
流水线常用语法
根据分支动态checkout代码
docker 编译
jenkins更多语法参考
相关文档
http://docs.idevops.site/jenkins/
实例代码