Jenkins环境部署(一)
#简单写了一版平台出来忙了一些私事又可以继续更新博客了。
#作为一个运维人员经常会被别人问到你们的代码是如何发布的,当然我们可以说我们灰度发布啊等等,这里就不具体说代码发布的规范流程的毕竟这个可能要根据公司来当然使用的方式也不同这里就不一一列举了,这里记录一种很多年的系统集成工具。
一、Jenkins安装
Jenkins官网:https://jenkins.io/
#这里就不介绍了网上百度一搜太多了毕竟是一款很多年的工具了,当然如何学习网上相关博客很多,也有jenkins权威指南,当然不要忘记还是要跟着官网走一波哦:https://jenkins.io/doc/pipeline/tour/getting-started/
中文文档:https://www.jenkins.io/zh/doc/
1.1 Jenkins单独运行
java安装:
#JAVA安装就不介绍了,需要安装jdk。
# java -version
java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
jenkins的下载和安装:
# wget http://mirrors.shu.edu.cn/jenkins/war-stable/2.107.3/jenkins.war #下载jenkins的war包
#或者https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.138.2/jenkins.war
# java -jar jenkins.war --httpPort=8080 #启动jenkins服务
jenkins访问测试:
访问url:http://192.168.1.144:8080
#运行目录webroot: $user.home/.jenkins
1.2 jenkins的yum安装方式
#wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
#rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
# yum install jenkins -y
# service jenkins start
# netstat -lntup|grep :8080
tcp6 0 0 :::8080 :::* LISTEN 7498/java
#运行目录:/var/lib/jenkins/
#war包:/usr/lib/jenkins/jenkins.war
1.3 jenkins的rpm安装方式
#这种就跟上网yum方式差不多了。
# wget https://pkg.jenkins.io/redhat-stable/jenkins-2.107.3-1.1.noarch.rpm
# rpm -ivh jenkins-2.107.3-1.1.noarch.rpm
# service jenkins start
1.4 Jenkins使用tomcat容器
tomcat安装:
# wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.11/bin/apache-tomcat-9.0.11.tar.gz
#或者https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.12/bin/apache-tomcat-9.0.12.tar.gz
# tar zxf apache-tomcat-9.0.11.tar.gz
# cp -rf apache-tomcat-9.0.11 /usr/local/
# ln -s /usr/local/apache-tomcat-9.0.11 /usr/local/tomcat
# vim /etc/profile
export CATALINA_HOME=/usr/local/tomcat export CATALINA_HOME
# source /etc/profile
jenkins最新包下载并放到容器下面:
# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
# cp jenkins.war /usr/local/tomcat/webapps/
# /usr/local/tomcat/bin/catalina.sh start
#然后浏览器访问测试一下:http://192.168.1.104:8080/jenkins
1.5 Jenkins使用Docker(参照官网)
# yum install docker -y
# service docker restart
# docker network create jenkins 使用以下Docker network Create命令在Docker中创建桥接网络。
#docker run --name jenkins-docker --rm --detach --privileged --network jenkins \
--network-alias docker --env DOCKER_TLS_CERTDIR=/certs \
--volume jenkins-docker-certs:/certs/client \
--volume jenkins-data:/var/jenkins_home \
--publish 2376:2376 docker:dind --storage-driver overlay2
#上面命令的备注解释 --name jenkins-docker: (可选)指定容器名称 --rm:(可选)当Docker容器(Docker镜像的实例)关闭时自动删除它。 --detach:(可选)在后台运行Docker容器。可以通过运行#docker stop jenkins-docker来停止此实例。 --privileged: 在Docker中运行Docker当前需要特权访问才能正常工作。这一要求可能会随着更新的Linux内核版本而放宽。 --network jenkins: 使用前面创建的网络。 --network-alias docker: 创建网络别名,这样容器互访时还使用别名+端口的形式 --env DOCKER_TLS_CERTDIR=/certs:由于使用了特权容器,建议在Docker服务器中使用TLS。此环境变量控制管理Docker TLS证书的根目录。 --volume jenkins-docker-certs:/certs/client: 将容器内的/certs/client目录映射到上面创建的名为jenkins-Docker-certs的Docker卷。 --volume jenkins-data:/var/jenkins_home:将容器内的/var/jenkins_home目录映射到名为jenkins-data的Docker卷。 --publish 2376:2376:(可选)显示主机上的Docker守护进程端口。 docker:dind:使用哪个镜像文件启动容器.在run之前,也可以使用以下命令下载此images:docker image pull docker:dind。 --storage-driver overlay2: Docker卷的存储驱动程序。
#上面的版本是有tls的,当然你也可以制定镜像自己做有tls证书的自定义镜像,也可以不需要tls认证选择自己想要的jenkins版本,如下面:
# docker run --name jenkins -d -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.346.3-2-lts-jdk11
博文来自:www.51niux.com
二、Jenkins的系统管理
可参考文档:https://jenkins.io/doc/book/managing/
2.1 系统配置
jenkins主目录的设置:
#默认jenkins的主目录是家目录下的.jenkins目录下如/root/.jenkins,也就是各种运行数据都会存储在这个目录下面空间会越战越大所以一般可以选择挂载盘将此目录存放到其他的挂载盘上面。
第一种方法:使用你Web容器的管理工具设置JENKINS_HOME环境参数
# vim /usr/local/tomcat/bin/catalina.sh
export CATALINA_BASE=$CATALINA_BASE2 export CATALINA_HOME=$CATALINA_HOME2 #上面这句话和这句话是为了解决tomcat启动Cannot find /usr/local/apache-tomcat/bin/setclasspath.sh This file is needed to run this program错误 export JENKINS_HOME="/data/.jenkins" #这句话是为了改变jenkins主目录的位置
#然后重启tomcat进行查看
# ls -l /data/.jenkins/
总用量 32 -rw-r-----. 1 root root 1730 8月 29 00:01 config.xml -rw-r-----. 1 root root 156 8月 29 00:00 hudson.model.UpdateCenter.xml -rw-------. 1 root root 1712 8月 29 00:00 identity.key.enc -rw-r-----. 1 root root 94 8月 29 00:00 jenkins.CLI.xml -rw-r-----. 1 root root 7 8月 29 00:00 jenkins.install.UpgradeWizard.state drwxr-x---. 2 root root 6 8月 29 00:00 jobs drwxr-x---. 3 root root 19 8月 29 00:00 logs -rw-r-----. 1 root root 907 8月 29 00:00 nodeMonitors.xml drwxr-x---. 2 root root 6 8月 29 00:00 nodes drwxr-x---. 2 root root 6 8月 29 00:00 plugins -rw-r-----. 1 root root 64 8月 29 00:00 secret.key -rw-r-----. 1 root root 0 8月 29 00:00 secret.key.not-so-secret drwx------. 4 root root 4096 8月 29 00:00 secrets drwxr-x---. 2 root root 67 8月 29 00:01 updates drwxr-x---. 2 root root 24 8月 29 00:00 userContent drwxr-x---. 3 root root 19 8月 29 00:00 users
第二种方法:在启动Web容器之前设置JENKINS_HOME环境变量
# vim /etc/profile
export JENKINS_HOME=/data/.jenkins
# source /etc/profile
#第三种方法jenkins都说不推荐了也就不记录了。
系统消息设置:
#这个信息会显示在首页顶部. 用来向用户发布一些系统范围的通知或公告. 兼容HTML标签格式.
执行者数量设置:
#默认是2个执行者也就是说最高允许2个job运行,也就是并发数,显然不够用所以一般调大这里,不然jenkins多项目上线会出现经常排队现象。
#另外标记用来记录这个机器的名称(为了分配节点使用)后面会用到。
用法设置:
下面为解释:
尽可能的使用这个节点:这是默认和常用的设置. 在这种模式下,Jenkins会尽可能的使用这个节点.任何时候如果一个构建能使用这个节点构建,那么Jenkins就会使用它. 只允许运行绑定到这台机器的Job:这种模式下,Jenkins只会构建哪些分配到这台机器的Job. 这允许一个节点专门保留给某种类型的Job.例如,在Jenkins上连续的执行测试,你可以设置执行者数量为1,那么同一时间就只会有一个构建, 一个实行者不会阻止其它构建,其它构建会在另外的节点运行.
生成前等待时间设置:
#这个时间为构建开始前的等待时间,这里保持默认的5秒。
下面为解释:
如果设置此选项,一个计划中的构建在开始之前需要等待选项中设置的秒数。 这会对下面的情况非常有用:合并多封CVS变更通知邮件为一封(当一次提交跨越多个目录时,一些CVS的变更日志邮件发生脚本会接二连三的生成多封通知邮件)。 如果你的编码风格导致你更改一个逻辑需要几次cvs/svn操作,那么设置一个较长时间的等待会防止Jenkins过早的构建而失败。 节省构建。如果你的Jenkins有太多并且高频率的构建,设置长时间的等待会舒缓这些构建。 如果没有在项目级别设置此项,则会使用系统默认值。
scm签出重试次数设置:
使用svn或者git拉取代码失败重试的次数,一般选择默认的0.
工程命名限制设置:
命名规范,非必需。限制项目命名,勾选后可以看到具体设置,可以设置为默认或者使用正则表达式进行限制。
全局属性设置:
#这就是定义一个环境变量。
jenkins全局变量地址:https://wiki.jenkins.io/display/JENKINS/Building+a+software+project#Buildingasoftwareproject-JenkinsSetEnvironmentVariables
Jenkins默认全局设置环境变量:
BUILD_NUMBER #当前的内部版本号,例如“153” BUILD_ID #当前构建ID,例如“2005-08-22_23-59-59”(YYYY-MM-DD_hh-mm-ss,自1.597版本以来已解散) BUILD_URL #可以找到此构建结果的URL(例如http://buildserver/jenkins/job/MyJobName/666/) NODE_NAME #当前构建运行的节点的名称。等于主节点的“master”。 JOB_NAME #此构建的项目名称。这是您第一次设置时给出的工作名称。这是Jenkins Dashboard主页的第三列。 BUILD_TAG #jenkins字符串 jenkins-${JOB_NAME}-${BUILD_NUMBER}。方便放入资源文件,jar文件等,以便于识别。 JENKINS_URL #设置为运行构建的Jenkins主服务器的URL。例如,Jenkins CLI使用此值 EXECUTOR_NUMBER #标识正在执行此构建的当前执行程序(在同一计算机的执行程序之间)的唯一编号。这是您在“构建执行程序状态”中看到的数字,但该数字从0开始,而不是1。 JAVA_HOME #如果您的作业配置为使用特定的JDK,则此变量将设置为指定JDK的JAVA_HOME。设置此变量后,PATH也会更新为$JAVA_HOME/bin。 WORKSPACE #工作空间的绝对路径。 SVN_REVISION #对于基于Subversion的项目,此变量包含模块的修订号。如果指定了多个模块,则不会设置此模块。 CVS_BRANCH #对于基于CVS的项目,此变量包含模块的分支。如果CVS配置为检出主干,则不会设置此环境变量。 GIT_COMMIT #对于基于Git的项目,此变量包含为构建签出的提交的Git哈希(如ce9a3c1404e8c91be604088670e93434c4253f03)(所有GIT_ *变量都需要git插件) GIT_URL #对于基于Git的项目,此变量包含Git url(如git@github.com:user/repo.git or [https://github.com/user/repo.git]]) GIT_BRANCH #对于基于Git的项目,此变量包含为构建检出的Git分支(通常为origin/master)
使用统计设置:
通过发送匿名的使用信息以及程序崩溃报告来帮助Jenkins做的更好。(默认是勾选的可以不提交崩溃报告)
Timestamper设置:
#设置时间格式第一个是系统时间第二个是构建时间表示默认就可以。
Jenkins Location设置:
jenkins url :设置jenkins的url(发送邮件引用jenkins的地址会取这个值,如果设错了,邮件的连接就会打不开)
系统管理员邮件地址:管理员的邮件地址(在构建需要发送邮件时,会用到这个邮件地址)
GitHub设置:
2.2 全局安全配置
下面记录下每个权限所代表的意思(从左向右):
#全部 Administer #该权限允许修改系统级别的配置,也就是执行高度敏感的操作,例如挂在本地系统访问(这就赋予了基本的操作系统权限)。 Read #读权限对于查看Jenkins的大部分页面是必须的。当你不希望未认证的用户看到Jenkins页面时,该权限就很有用:从匿名用户中取消该权限,然后给受认证的用户赋予该权限。 #凭证 Create #创建权限是将凭据添加到凭据提供程序所必需的。 Delete #删除权限是删除凭证提供程序中存储的凭据所必需的。 ManageDomains #管理域权限是添加/删除/配置凭据提供程序的凭据域(凭证提供程序支持多个凭据域)所必需的。 Update #更新权限是修改凭据提供程序中的凭据所必需的。 View #查看权限是查看凭证提供程序中存储的凭据所必需的。 #代理 Build #该权限允许用户在代理上允许任务。 Configure #该权限允许用户配置代理。 Connect #该权限允许用户连接代理或者让代理上线。 Create #该权限允许用户创建代理。 Delete #该权限允许用户删除已存在的代理。 Disconnect #该权限允许用户断开或者临时下线代理。 #任务 Build #该权限允许启动一个新的构建任务。 Cancel #该权限允许取消计划或终止运行中的构建任务。 Configure #修改任务的配置。 Create #创建新的任务。 Delete #删除任务。 Discover #该权限允许查找任务。比读取的权限低,当用户试图访问任务时会重定向到登录页面。如果没有该权限,就不能查找工程名称,并会得到404错误。 Read #查看任务。(可以拒绝该权限,但允许发现,迫使匿名用户登录到看到任务) Workspace #该权限允许获取Jenkins执行构建任务时检出的工作空间内容。如果你不希望用户访问工作空间中的文件(例如:SCM检出的源码或者构建的中间产物),你可以取消该权限。 #运行 Delete #该权限允许用户从构建历史中手动删除指定的记录 Replay #能够使用编辑过的脚本执行新的管道构建。 Update #该权限允许用户修改一次构建的描述或者其他属性,例如:描述构建失败的原因。 #视图 Configure #该权限允许用户改变视图的配置。 Create #该权限允许用户创建新的视图。 Delete #该权限允许用户删除已有的视图。 #SCM Read #该权限允许用户查看视图(允许读取访问)。 Tag #该权限允许用户在代码库中给指定的构建创建新的标签
Markup Formatter设置:
#不然的话,Jenkins的view、Job和每次构建的备注及description不支持使用HTML语法编辑备注信息,非常影响观赏性,所以按上面选择。#要展示这个HTML效果需要安装OWASP Markup Formatter插件。
CSRF Protection设置:
举个例子:
# curl -u test:123456 -X POST http://192.168.1.104:8080/jenkins/job/test/reload
<!doctype html><html><head><title>HTTP Status 403 – Forbidden</title>......后面内容就不粘贴了就是403没权限。
第一种方式就是讲防止跨站点请求伪造哪里勾选去掉就可以这样远程调用接口了。
第二种方式jenkins设置CSRF 协议(CRUMB值设置):
先通过网站拿到Token:
http://192.168.1.104:8080/jenkins/user/test/configure
#点开就能看到Token值了就不截图了。
然后计算CRUMB:
# wget -q --auth-no-challenge --user test --password 123456 --output-document - 'http://192.168.1.104:8080/jenkins/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'
Jenkins-Crumb:413712d2ea3888284cfa4ea0051693e6
然后就是拿着这些东西去提交操作:
# curl -X POST -H '413712d2ea3888284cfa4ea0051693e6' http://test:bc9325d6f43317403d82c85fbdfe3a0d@192.168.1.104:8080/jenkins/job/test/reload
#其中test是用户,API Token是bc9325d6f43317403d82c85fbdfe3a0d。
剩下的保持默认就行:
#CLI可以了解:https://wiki.jenkins.io/display/JENKINS/Jenkins+CLI
2.3 凭证配置
#凭证配置需要的插件是:Credentials
基本不用改默认就是所有可见。
有许多第三方网站和应用程序可以与 Jenkins 进行交互,例如程序代码仓库,云存储系统和服务等。
此类应用程序的系统管理员可以在应用程序中配置凭证以专供 Jenkins 使用。通常通过将访问控制应用于这些凭证来完成这项工作,以“锁定”Jenkins可用的应用程序功能区域。一旦 Jenkins 管理员(即管理 Jenkins 站点的 Jenkins 用户)在 Jenkins 中添加/配置这些凭证,Pipeline 项目就可以使用凭证与这些第三方应用程序进行交互。
Providers设置:
包括选择/排除选择下面:
Jenkins 凭据提供者 #提供Jenkins根目录的凭据。 凭证将可用于:身份验证:SYSTEM;有权限的用户:任务/配置。凭证将在以下位置提供:Jenkins中的所有项目都可以使用全局范围的凭据,系统范围的凭据仅限于系统级操作,例如连接构建代理。 User Credentials Provider(用户凭据提供程序) #为每个用户提供个人凭证存储。 凭证将可用于:由定义凭证的用户执行的即时操作;具有凭据参数的作业,当具有权限的用户直接触发时:任务/构建;以用户身份运行的作业和用户具有权限:任务/构建;
Types设置:
包括选择/排除选择下面:
Username with password #可以作为单独的组件处理,也可以作为 username:password 格式的冒号分隔字符串来处理 Docker Host Certificate Authentication #Docker 主机证书身份验证凭证 SSH Username with private key #带有私钥的SSH用户名 Secret file #点击 File 字段旁边的 Choose file 按钮,选择 secret 文件并上传到 Jenkins Secret text #复制 secret 文本并粘贴到 Secret 字段 Certificate #指定证书和可选的密码。上传 PKCS#12 证书
Restrictions设置:
Add按钮里面的包括和排除设置:
Provider #Jenkins 凭据提供者;User Credentials Provider(用户凭据提供程序); Type #Username with password;Docker Host Certificate Authentication;SSH Username with private key;Secret file;Secret text;Certificate
2.4 全局工具配置(Global Tool Configuration)
Maven Configuration(Maven配置):
Default settings provider #Use default maven settings(使用默认的maven设置);Settings file in filesystem(文件系统中的设置文件),settings.xml文件的路径,相对于项目工作空间或绝对值(支持变量)。 Default global settings provider #Use default maven global settings(使用默认的maven全局设置);Global settings file on filesystem(文件系统上的全局设置文件)。
#配置Maven主要是配置Maven的settings.xml文件,Jenkins在构建Maven项目时需要依靠该配置文件来执行Maven。
JDK:
Ant:
# wget http://mirrors.shu.edu.cn/apache//ant/binaries/apache-ant-1.9.13-bin.tar.gz
# tar zxf apache-ant-1.9.13-bin.tar.gz
# cp apache-ant-1.9.13 /usr/local/ant-1.9.13 -rf
# ln -s /usr/local/ant-1.9.13 /usr/local/ant
# vim /etc/profile
export PATH=$PATH:$ANT_HOME/bin export ANT_HOME=/usr/local/ant
# source /etc/profile
#剩下的意思一样没有就安装就完事了就照着ANT或者JDK这样配置上就行。
博文来自:www.51niux.com
2.5 读取设置
放弃当前内存中所有的设置信息并从配置文件中重新读取仅用于当您手动修改配置文件时重新读取设置。
#意思很明显当你修改了config.xml文件的时候除了重启默认是不会读取config.xml文件里面的信息的当然可以点击这里让Jenkins在不重启服务的情况下加载config.xml里面的内容。
2.6 管理插件
#这个就是想用啥就安装啥插件更新删除本地上传插件之类的。
2.7 系统信息
jenkins所在机器的一些信息。
2.8 系统日志
系统日志从java.util.logging捕获Jenkins相关的日志信息。
2.9 管理节点
#这个就厉害了,这个就是jenkins多实例的设置,不然默认就jenkins所在的这台机器执行job。前置条件:节点服务器应与jenkins主服务器环境路径统一,比如:JDK,ant等。
#新建节点一般是字母和数字构成有点标示性,发布的话可能会有前端\php\java环境等等,然后末尾是编号或者是机器IP末尾,这样就不用老去看节点配置才知道节点的IP了。
#上面SSH控制代理节点的方式需要安装插件:SSH Credentials和SSH Slaves
#高级还是要点一下的,Java 路径要配置一下l例如设置成(/usr/java/jdk/bin/java),不然就跑到从节点的/data/jenkins_workspace下面去找java命令了。
#然后权限一般就是密码或者是秘钥的形式,在第一次节点连接过程中可以查看日志看看哪里有问题。另外从节点的maven啊ant啊之类的软件环境最好保持跟主节点一致。
设置两种类型的凭证:
第一种私钥凭证:
第二种用户名密码:
#好了两种方式都行然后从节点选择一种认证方式查看一下是否OK:
可以先点开从节点的日志查看下输出:
[09/01/18 22:38:14] [SSH] Starting sftp client. [09/01/18 22:38:14] [SSH] 正在拷贝最新版本的 remoting.jar... [09/01/18 22:38:14] [SSH] Copied 775,665 bytes. Expanded the channel window size to 4MB [09/01/18 22:38:14] [SSH] Starting agent process: cd "/data/jenkins_workspace" && /usr/java/jdk/bin/java -jar remoting.jar -workDir /data/jenkins_workspace 九月 01, 2018 10:38:14 下午 org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir 信息: Using /data/jenkins_workspace/remoting as a remoting work directory Both error and output logs will be printed to /data/jenkins_workspace/remoting<===[JENKINS REMOTING CAPACITY]===>channel started Remoting version: 3.21.1 这是一个Unix代理 Evacuated stdoutAgent successfully connected and online
博文来自:www.51niux.com
2.10 修改jenkins的显示语言
#上面已经看到了jenkin新版默认是中文的,但是我们不想显示中文,就看着以前的英文舒服。
第一步:
安装插件Locale
第二步:
#然后点击保存。
#想要的英文显示回来了。
2.11 Rebuilder可以进行上一步的构建
#需要安装Rebuilder插件,如果不装这个插件,比方说你发布某个job发布失败了知道问题在哪了又想重新发布,但是这时候你需要重新上传入参数,可不可以一键重新发布呢?就是提到的这个插件。
2.12 Jenkins通过CAS认证
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:
开源的企业级单点登录解决方案。
CAS Server 为需要独立部署的 Web 应用。
CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。
#首先需要先安装插件:CAS
#系统管理=》全局安全管理
#这就跟我之前记录的LDAP是一样的,类似于域管理,但是CAS显然是更好的用户管理方式。