Jenkins 部署与实现持续部署
- jenkins官方地址:https://jenkins.io/zh/
部署 jenkins
- ubuntu 安装包下载地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/debian
- jenkins 清华源下载地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/
- jenkinss 使用手册:https://jenkins.io/zh/doc/
- jenkins插件官网下载地址:https://updates.jenkins-ci.org/
准备 jdk 环境
//确定工作目录
pwd
/usr/local/src
//将jdk安装包传至虚拟机
ls
jdk-8u241-linux-x64.tar.gz
//解包
tar xf jdk-8u241-linux-x64.tar.gz
//创建jdk软连接
ln -sv /usr/local/src/jdk1.8.0_241 /usr/local/jdk
//创建java软连接
ln -sv /usr/local/jdk/bin/java /usr/bin/
//配置全局环境变量
vim /etc/profile
...省略...
export HISTTIMEFORMAT="%F %T `whoami` "
export export LANG="en_US.utf-8"
export JAVA_HOME=/usr/local/jdk
export CLAsspATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
//生效环境变量
source /etc/profile
//验证java
java -version
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)
通过 deb 包安装 jenkins
安装 jenkins
//确定工作目录
pwd
/usr/local/src
//将下载好的.deb安装包传至虚拟机
ls
jenkins_2.204.5_all.deb
//ubuntu安装时报错
dpkg -i jenkins_2.204.5_all.deb
Selecting prevIoUsly unselected package jenkins.
(Reading database ... 86893 files and directories currently installed.)
Preparing to unpack jenkins_2.204.5_all.deb ...
Unpacking jenkins (2.204.5) ...
dpkg: dependency problems prevent configuration of jenkins:
jenkins depends on daemon; however:
Package daemon is not installed.
dpkg: error processing package jenkins (--install):
dependency problems - leaving unconfigured
Processing triggers for ureadahead (0.100.0-21) ...
Processing triggers for systemd (237-3ubuntu10.24) ...
Errors were encountered while processing:
jenkins
//解决以上报错
apt -y install daemon
//再进行安装
dpkg -i jenkins_2.204.5_all.deb
启动并验证 jenkins
//重新加载单元文件
systemctl daemon-reload
//启动jenkins
systemctl start jenkins
//设置开机自启
systemctl enable jenkins
//查看关于jenkins相关的进程
ps -ef | grep jenkins
jenkins 18405 1 0 21:43 ? 00:00:00 /lib/systemd/systemd --user
jenkins 18406 18405 0 21:43 ? 00:00:00 (sd-pam)
jenkins 18422 1 0 21:43 ? 00:00:00 /usr/bin/daemon --name=jenkins --inherit --env=JENKINS_HOME=/var/lib/jenkins --output=/var/log/jenkins/jenkins.log --pidfile=/var/run/jenkins/jenkins.pid -- /usr/bin/java -Djava.awt.headless=true -jar /usr/share/jenkins/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080
jenkins 18423 18422 0 21:43 ? 00:00:09 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/jenkins/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080
root 18858 998 0 22:10 pts/0 00:00:00 grep --color=auto jenkins
Jenkins 配置文件
//查看jenkins主配置文件
vim /etc/default/jenkins
//查看jenkins默认配置参数
grep "^[a-Z]" /etc/default/jenkins
NAME=jenkins
JAVA_ARGS="-Djava.awt.headless=true"
PIDFILE=/var/run/$NAME/$NAME.pid
JENKINS_USER=$NAME
JENKINS_GROUP=$NAME
JENKINS_WAR=/usr/share/$NAME/$NAME.war
JENKINS_HOME=/var/lib/$NAME
RUN_STANDALONE=true
JENKINS_LOG=/var/log/$NAME/$NAME.log
JENKINS_ENABLE_ACCESS_LOG="no"
MAXOPENFILES=8192
HTTP_PORT=8080
PREFIX=/$NAME
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT"
验证 jenkins 启动日志
//jenkins日志文件
vim /var/log/jenkins/jenkins.log
...省略...
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
e93ebef28b9e4377b94b9e60b9fbb82b
This may also be found at: /var/lib/jenkins/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
2020-03-10 13:43:50.756+0000 [id=27] INFO hudson.model.UpdateSite#updateData: Obtained the latest update center data file for UpdateSource default
2020-03-10 13:43:51.038+0000 [id=27] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization
2020-03-10 13:43:51.048+0000 [id=19] INFO hudson.WebAppMain$3#run: Jenkins is fully up and running
Running from: /usr/share/jenkins/jenkins.war
2020-03-10 13:43:53.681+0000 [id=1] INFO org.eclipse.jetty.util.log.Log#initialized: Logging initialized @246ms to org.eclipse.jetty.util.log.JavaUtilLog
2020-03-10 13:43:53.770+0000 [id=1] INFO winstone.Logger#logInternal: Beginning extraction from war file
2020-03-10 13:43:53.790+0000 [id=1] WARNING o.e.j.s.handler.ContextHandler#setcontextpath: Empty contextpath
2020-03-10 13:43:53.837+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: jetty-9.4.z-SNAPSHOT; built: 2019-05-02T00:04:53.875Z; git: e1bc35120a6617ee3df052294e433f3a25ce7097; jvm 1.8.0_241-b07
2020-03-10 13:43:54.053+0000 [id=1] INFO o.e.j.w.StandardDescriptorProcessor#visitServlet: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
2020-03-10 13:43:54.083+0000 [id=1] INFO o.e.j.s.s.DefaultSessionIdManager#doStart: DefaultSessionIdManager workerName=node0
2020-03-10 13:43:54.083+0000 [id=1] INFO o.e.j.s.s.DefaultSessionIdManager#doStart: No SessionScavenger set, using defaults
2020-03-10 13:43:54.086+0000 [id=1] INFO o.e.j.server.session.HouseKeeper#startScavenging: node0 Scavenging every 660000ms
2020-03-10 13:43:54.385+0000 [id=1] INFO hudson.WebAppMain#contextinitialized: Jenkins home directory: /var/lib/jenkins found at: EnvVars.masterEnvVars.get("JENKINS_HOME")
2020-03-10 13:43:54.504+0000 [id=1] INFO o.e.j.s.handler.ContextHandler#doStart: Started w.@508dec2b{Jenkins v2.204.5,/,file:///var/cache/jenkins/war/,AVAILABLE}{/var/cache/jenkins/war}
2020-03-10 13:43:54.537+0000 [id=1] INFO o.e.j.server.AbstractConnector#doStart: Started ServerConnector@21bcffb5{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
2020-03-10 13:43:54.537+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: Started @1103ms
2020-03-10 13:43:54.538+0000 [id=20] INFO winstone.Logger#logInternal: Winstone Servlet Engine v4.0 running: controlPort=disabled
2020-03-10 13:43:55.489+0000 [id=27] INFO jenkins.InitReactorRunner$1#onAttained: Started initialization
...省略...
访问 web 界面
解锁并下一步
//根据提示获取密码解锁jenkins
cat /var/lib/jenkins/secrets/initialAdminPassword
e93ebef28b9e4377b94b9e60b9fbb82b
#将上面的获得到的密码复制到web页面点击下一步解锁jenkins
Jenkins 离线问题解决
- 如果显示jenkins已离线,将以下文件中的更新检查地址改成国内清华大学地址,然后重启jenkins即可:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
//修改更新检查地址文件
vim /var/lib/jenkins/hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
</site>
</sites>
选择安装 jenkins 插件
插件安装过程中
Nginx代理配置
//jenkins所在服务器hosts文件添加域名解析
127.0.0.1 updates.jenkins-ci.org
//在单独配置的Nginx服务器添加location进行转发
location /download/plugins {
proxy_set_header Host mirrors.tuna.tsinghua.edu.cn;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
rewrite /download/plugins(.*) /jenkins/plugins/$1 break;
proxy_pass http://mirrors.tuna.tsinghua.edu.cn;
}
-
HOST 按照这个优先顺序:请求行中的主机名,或者“host”请求头字段中的主机名,或者匹配请求的服务器名。
-
在发送请求行之前,客户端与服务器已经建立了连接。所以此时请求行中并不需要有服务器的信息。我们用telnet测试, 例如:GET /index.PHP HTTP/1.1
这就是一个完整的HTTP请求行。虽然请求行中不需要有服务器的信息,但仍然可以在请求行中包含服务器的信息。例如:GET www.test.info/index.PHP HTTP/1.1 两者一比较,就很容易理解什么叫请求行中的host了。第一个请求行中,就没有host,第二种请求行中,就带了host,为www.test.info。 -
X-Forwarded-For头域是为了说明请求经过了哪些服务器。
-
如果请求中不包含X-Forwarded-For头域,则设置X-Forwarded-For头域值为请求发送者的IP或CDN的IP
-
如果请求中包含X-Forwarded-For头域,则设置X-Forwarded-For头域值为之前该头域的值后面添加请求发送者的IP,用逗号分隔。
root@gateway:~# tail /apps/Nginx/logs/access.log
192.168.26.54 - - [10/Mar/2020:22:37:14 +0800] "GET /download/plugins/pipeline-github-lib/1.0/pipeline-github-lib.hpi HTTP/1.1" 200 8479 "-" "Java/1.8.0_241"
192.168.26.54 - - [10/Mar/2020:22:37:15 +0800] "GET /download/plugins/mapdb-api/1.0.9.0/mapdb-api.hpi HTTP/1.1" 200 396306 "-" "Java/1.8.0_241"
192.168.26.54 - - [10/Mar/2020:22:37:20 +0800] "GET /download/plugins/subversion/2.13.1/subversion.hpi HTTP/1.1" 200 7350744 "-" "Java/1.8.0_241"
192.168.26.54 - - [10/Mar/2020:22:37:21 +0800] "GET /download/plugins/ssh-slaves/1.31.1/ssh-slaves.hpi HTTP/1.1" 200 176979 "-" "Java/1.8.0_241"
192.168.26.54 - - [10/Mar/2020:22:37:21 +0800] "GET /download/plugins/matrix-auth/2.5/matrix-auth.hpi HTTP/1.1" 200 128779 "-" "Java/1.8.0_241"
192.168.26.54 - - [10/Mar/2020:22:37:22 +0800] "GET /download/plugins/pam-auth/1.6/pam-auth.hpi HTTP/1.1" 200 1504184 "-" "Java/1.8.0_241"
192.168.26.54 - - [10/Mar/2020:22:37:22 +0800] "GET /download/plugins/ldap/1.21/ldap.hpi HTTP/1.1" 200 130445 "-" "Java/1.8.0_241"
192.168.26.54 - - [10/Mar/2020:22:37:22 +0800] "GET /download/plugins/email-ext/2.69/email-ext.hpi HTTP/1.1" 200 796304 "-" "Java/1.8.0_241"
192.168.26.54 - - [10/Mar/2020:22:37:22 +0800] "GET /download/plugins/localization-support/1.1/localization-support.hpi HTTP/1.1" 200 23848 "-" "Java/1.8.0_241"
192.168.26.54 - - [10/Mar/2020:22:37:23 +0800] "GET /download/plugins/localization-zh-cn/1.0.13/localization-zh-cn.hpi HTTP/1.1" 200 542952 "-" "Java/1.8.0_241"
验证插件目录
//插件存放目录
ll /var/lib/jenkins/plugins/
total 64732
drwxr-xr-x 78 jenkins jenkins 4096 Mar 10 22:37 ./
drwxr-xr-x 15 jenkins jenkins 4096 Mar 10 22:56 ../
drwxr-xr-x 7 jenkins jenkins 4096 Mar 10 22:36 ace-editor/
-rw-r--r-- 1 jenkins jenkins 4279042 Mar 10 22:36 ace-editor.jpi
drwxr-xr-x 4 jenkins jenkins 4096 Mar 10 22:36 ant/
drwxr-xr-x 4 jenkins jenkins 4096 Mar 10 22:36 antisamy-markup-formatter/
-rw-r--r-- 1 jenkins jenkins 107210 Mar 10 22:36 antisamy-markup-formatter.jpi
-rw-r--r-- 1 jenkins jenkins 82963 Mar 10 22:36 ant.jpi
drwxr-xr-x 4 jenkins jenkins 4096 Mar 10 22:36 apache-httpcomponents-client-4-api/
-rw-r--r-- 1 jenkins jenkins 1761975 Mar 10 22:36 apache-httpcomponents-client-4-api.jpi
drwxr-xr-x 4 jenkins jenkins 4096 Mar 10 22:37 authentication-tokens/
-rw-r--r-- 1 jenkins jenkins 14638 Mar 10 22:37 authentication-tokens.jpi
drwxr-xr-x 4 jenkins jenkins 4096 Mar 10 22:36 bouncycastle-api/
-rw-r--r-- 1 jenkins jenkins 4885133 Mar 10 22:36 bouncycastle-api.jpi
drwxr-xr-x 5 jenkins jenkins 4096 Mar 10 22:37 branch-api/
-rw-r--r-- 1 jenkins jenkins 308984 Mar 10 22:37 branch-api.jpi
drwxr-xr-x 4 jenkins jenkins 4096 Mar 10 22:36 build-timeout/
-rw-r--r-- 1 jenkins jenkins 95589 Mar 10 22:36 build-timeout.jpi
drwxr-xr-x 5 jenkins jenkins 4096 Mar 10 22:36 cloudbees-folder/
-rw-r--r-- 1 jenkins jenkins 219839 Mar 10 22:36 cloudbees-folder.jpi
drwxr-xr-x 4 jenkins jenkins 4096 Mar 10 22:36 command-launcher/
-rw-r--r-- 1 jenkins jenkins 38820 Mar 10 22:36 command-launcher.jpi
创建 jenkins 管理员账户
Jenkins 实例配置
Jenkins 已就绪
登录 jenkins
Jenkins 首页
通过 tomcat 启动 jenkins
- 通过tomcat 8.5.46运行jenkins_2.204.5
//将tomcat安装包拷至虚拟机
ls /usr/local/src
apache-tomcat-8.5.45.tar.gz
//创建数据目录
mkdir /apps
//确定工作目录
pwd
/apps
//将tomcat安装包拷至数据目录
cp /usr/local/src/apache-tomcat-8.5.45.tar.gz .
//解包
tar xf apache-tomcat-8.5.45.tar.gz
//下载jenkins.war包
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.204.5/jenkins.war
//将jenkins.war考至tomcat默认web目录
cp jenkins.war ./apache-tomcat-8.5.45/webapps
//下载依赖包
sudo apt-get -y install libxrender-dev libxtst-dev
//启动tomcat
/apps/apache-tomcat-8.5.45/bin/catalina.sh start
- 浏览器访问http://192.168.26.64:8080/jenkins
验证 web 界面
通过war包直接启动 jenkins
//确定工作目录
pwd
/usr/local/src
//将jdk安装包传至虚拟机
ls
jdk-8u241-linux-x64.tar.gz
//解包
tar xf jdk-8u241-linux-x64.tar.gz
//创建jdk软连接
ln -sv /usr/local/src/jdk1.8.0_241 /usr/local/jdk
//创建java软连接
ln -sv /usr/local/jdk/bin/java /usr/bin/
//配置全局环境变量
vim /etc/profile
...省略...
export HISTTIMEFORMAT="%F %T `whoami` "
export export LANG="en_US.utf-8"
export JAVA_HOME=/usr/local/jdk
export CLAsspATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
//生效环境变量
source /etc/profile
//验证java
java -version
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)
java \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname="192.168.26.64" \
-jar jenkins.war &
#这种安装方式 jenkins的插件目录为 /root/.jenkins/pligins
Jenkins 插件管理及安装
插件安装目录
- 插件下载地址:http://updates.jenkins-ci.org/download/plugins/
安装插件
配置 jenkins 权限管理
安装 Role-based 基于角色的认证策略
- 安装基于角色认证策略的插件 Role-based
创建新用户
创建测试项目
更改认证方式
- Jenkins-系统管理-全局安全配置
- 默认创建的用户登录后可以做任何操作,取决于默认的认证授权方式。
- jenkins 中每个用户的密码都是以哈希值,保存在用户目录下的config.xml文件中的。
- 忘记jenkins用户密码时,用简单的密码做哈希,替换原密码哈希值即可重设密码。
- 路径为/var/lib/jenkins/users/root_5396110284457712874/config.xml
创建角色
- Jenkins-系统管理-Manage and Assign Roles(管理和分配角色)-Manage Roles
添加角色
对角色分配权限
将用户关联到角色
测试普通用户登录
Jenkins 邮箱配置
生成QQ邮箱登录授权
配置 jenkins 管理员邮箱
发送配置
- Jenkins-系统管理-系统配置
- 邮件配置
测试发送邮件
- Jenkins-系统管理-系统配置
- 测试邮件
基于 ssh key 拉取代码
添加 ssh key
//在jenkins服务器生成密钥对
ssh-keygen
//复制jenkins公钥添加到gitlab
cat /root/.ssh/id_rsa.pub
- 浏览器访问gitlab:http://192.168.26.104
测试 ssh key
//修改jenkins运行用户为root
vim /etc/default/jenkins
# user and group to be invoked as (default to jenkins)
JENKINS_USER=root
JENKINS_GROUP=root
- 在jenkins服务器拉取gitlab项目
//拉取gitlab项目
git clone [email protected]:test-service/test-project.git
配置 jenkins 到 gitlab 非交互拉取代码
Jenkins 服务器添加证书
- Jenkins-凭据-系统-全局凭据-添加凭据
JJenkins 修改之前 project 的设置
配置 git 项目地址和用户
- 添加完成的证书没有报错表示认证通过
- 选中在构建之前删除工作区
测试构建项目
点击立即构建
验证构建结果
服务器验证数据
将代码部署至后端服务器
- jenkins-立即构建
#cd /usr/local/src/ && rm -rf test-project && git clone [email protected]:test-service/test-project.git
#ssh [email protected] "/apps/tomcat/bin/catalina.sh stop"
#ssh [email protected] "/apps/tomcat/bin/catalina.sh stop"
#ssh [email protected] "/apps/tomcat/bin/catalina.sh stop"
#scp -r /usr/local/src/test-project/* [email protected]:/data/tomcat/tomcat_webapps/myapp/
#scp -r /usr/local/src/test-project/* [email protected]:/data/tomcat/tomcat_webapps/myapp/
#scp -r /usr/local/src/test-project/* [email protected]:/data/tomcat/tomcat_webapps/myapp/
#ssh [email protected] "/apps/tomcat/bin/catalina.sh start"
#ssh [email protected] "/apps/tomcat/bin/catalina.sh start"
#ssh [email protected] "/apps/tomcat/bin/catalina.sh start"
----------------------------------------------------------------------------
cd /var/lib/jenkins/workspace/test-gitlab/ && tar czf myapp.tar.gz ./*
scp -r myapp.tar.gz [email protected]:/data/tomcat/tomcat_webdir/
scp -r myapp.tar.gz [email protected]:/data/tomcat/tomcat_webdir/
scp -r myapp.tar.gz [email protected]:/data/tomcat/tomcat_webdir/
ssh [email protected] "/apps/tomcat/bin/catalina.sh stop"
ssh [email protected] "/apps/tomcat/bin/catalina.sh stop"
ssh [email protected] "/apps/tomcat/bin/catalina.sh stop"
ssh [email protected] "cd /data/tomcat/tomcat_webdir/ && rm -rf ./myapp/* && tar xf myapp.tar.gz -C ./myapp/"
ssh [email protected] "cd /data/tomcat/tomcat_webdir/ && rm -rf ./myapp/* && tar xf myapp.tar.gz -C ./myapp/"
ssh [email protected] "cd /data/tomcat/tomcat_webdir/ && rm -rf ./myapp/* && tar xf myapp.tar.gz -C ./myapp/"
ssh [email protected] "/apps/tomcat/bin/catalina.sh start"
ssh [email protected] "/apps/tomcat/bin/catalina.sh start"
ssh [email protected] "/apps/tomcat/bin/catalina.sh start"
构建触发器(钩子)
- 构建触发器(webhook),有的人称为钩子,实际上是一个 HTTP 回调,其用于再开发人员向 gitlab 提交代码后能够触发 jenkins 自动执行代码构建操作。
- 以下为新建一个开发分支,只有在开发认人员向开发(develop)分支提交代码的时候才会触发代码构建,而向主分支提交的的代码不会自动构建,需要运维人员手动部署代码到生产环境。
192.168.26.24 #测试环境
192.168.26.34 #生产环境
192.168.26.44 #生产环境
Gitlab 新建 develop 分支
Gitlab 定义分支名称并创建
Jenkins 安装插件
- 注意事项:https://jenkins.io/security/advisory/2018-05-09/#Security-263
- 系统管理-管理插件-可选插件 搜索安装 Gitlab Hook 和 Gitlab Authentication
Jenkins 修改登录认证方式
Jenkins 新建 develop job
- 复制项目使用 SSH 克隆的 URL
Jenkins 构建 shell 命令
- 构建脚本将 develop 分支中代码拉取至测试环境机器192.168.26.24
cd /var/lib/jenkins/workspace/test-gitlab-develop && tar czf myapp.tar.gz ./*
scp -r myapp.tar.gz [email protected]:/data/tomcat/tomcat_webdir/
ssh [email protected] "/apps/tomcat/bin/catalina.sh stop"
ssh [email protected] "cd /data/tomcat/tomcat_webdir/ && rm -rf ./myapp/* && tar xf myapp.tar.gz -C ./myapp/"
ssh [email protected] "/apps/tomcat/bin/catalina.sh start"
Jenkins 配置构建触发器
//生成随机字符
openssl rand -hex 12
4ff6efdafd962294dcc9d474
Jenkins 验证分支 job 配置文件
//job配置文件config.xml
vim /var/lib/jenkins/jobs/test-demo/config.xml
Curl 命令测试触发并验证远程触发构建
- 使用浏览器直接访问 URL 地址
- 使用 curl 命令访问 URL 地址
//使用curl命令触发webhook
http://192.168.26.54:8080/job/test-demo/build?token=4ff6efdafd962294dcc9d474
Jenkins 验证 job 是否自动构建
Gitlab 配置 webhook
测试钩子可用性
- 执行测试
- 测试结果
Jenkins 新建 production job
- 用于将测试环境的完成测试的代码发布至生产环境
- 复制测试测试环境 test-demo 的 job
指定主分支
构建环境
jenkins 执行 shell 命令
- 将开发分支的执行 shell 命令更改为正式脚本
cd /var/lib/jenkins/workspace/test-production/ && tar czf myapp.tar.gz ./*
scp -r myapp.tar.gz [email protected]:/data/tomcat/tomcat_webdir/
scp -r myapp.tar.gz [email protected]:/data/tomcat/tomcat_webdir/
ssh [email protected] "/apps/tomcat/bin/catalina.sh stop"
ssh [email protected] "/apps/tomcat/bin/catalina.sh stop"
ssh [email protected] "cd /data/tomcat/tomcat_webdir/ && rm -rf ./myapp/* && tar xf myapp.tar.gz -C ./myapp/"
ssh [email protected] "cd /data/tomcat/tomcat_webdir/ && rm -rf ./myapp/* && tar xf myapp.tar.gz -C ./myapp/"
ssh [email protected] "/apps/tomcat/bin/catalina.sh start"
ssh [email protected] "/apps/tomcat/bin/catalina.sh start"
Jenkins 验证 develop job 自动构建
构建后项目关联
- 构建完成后触发另外一个 project
配置构建后操作
验证构建后操作
jenkins 分布式
- 在众多 job 的场景下,单台 jenkins master 同时执行代码 clone、编译、打包及构建,其性能可能会出现瓶颈从而影响代码部署效率,影响 jenkins 官方提供了 jenkins 分布式构建,将众多 job 分散运行到不同的 jenkins slave 节点,大幅度提高并运行 job 的处理能力。
配置 slave节点 java 环境
-
Slave 服务器创建工作目录,如果 slave 需要执行编译 job,则也需要配置 java 环境并且安装 git、svn、maven 等与 master 相同的基础运行环境,另外也要创建与 master 相同的数据目录,因为脚本中调用的路径只有相对一个 master 的一个路径,此路径在 master 与各 node 节点必须保持一致。
-
准备 jenkins-slave 服务器,配置好jdk环境的主机 192.168.26.74
//确定工作目录
pwd
/usr/local/src
//将jdk安装包传至虚拟机
ls
jdk-8u241-linux-x64.tar.gz
//解包
tar xf jdk-8u241-linux-x64.tar.gz
//创建jdk软连接
ln -sv /usr/local/src/jdk1.8.0_241 /usr/local/jdk
//创建java软连接
ln -sv /usr/local/jdk/bin/java /usr/bin/
//配置全局环境变量
vim /etc/profile
...省略...
export HISTTIMEFORMAT="%F %T `whoami` "
export export LANG="en_US.utf-8"
export JAVA_HOME=/usr/local/jdk
export CLAsspATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
//生效环境变量
source /etc/profile
//验证java
java -version
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)
//一定记得创建jenkins-slave数据目录
mkdir /var/lib/jenkins -p
添加 slave 节点
- Jenkins—系统管理—节点管理—新建节点
- 部分 jenkins slave 信息
为 jenkins-slave 添加基于用户名密码登录的凭据
jenkins-slave 创建日志
如果 jenkins-slave 没有 java 环境报错如下
验证添加的 jenkins-slave节点
- 正常状态
- 时间不同步状态
验证 jenkins-slave 进程状态
Pipelinee
- 官方介绍地址:https://jenkins.io/2.0/
- pipeline 是帮助 jenkins 实现 CI 到 CD 转变的重要角色,是运行在 jenkins 2.X 版本的核心插件,简单来说 pipeline 就是一套运行于 jenkins 上的工作流框架,将原本独立运行于单个或多个节点任务连接起来,实现单个任务难以完成的复杂发布流程,从而实现单个任务很难的复杂流程编排和任务可视化,pipeline 的实现方式是一套 Groovy DSL,任何发布流程都可以表述为一段 Groovy 脚本。
Pipeline 语法
-
Stage:阶段,一个 pipeline 可以划分为若干个 stage,每个 stage 都是一个操作步骤,比如 clone 代码、代码编译、代码测试和代码部署,阶段是一个逻辑分组,可以跨多个 node 执行。
-
Node:节点,每个 node 都是一个 jenkins 节点,可以是 jenkins master 也可以是 jenkins agent(node) 是执行 step 的具体服务器。
-
Step:步骤,step 是 jenkins pipeline 最基础的操作单元,从在服务器创建目录到构建容器镜像,由各类 jenkins 插件提供实现,一个 step 中可以有多个 step。
Pipeline 优势
- 可持续性:jenkins 的重启或者中断后不影响已经执行的 pipeline job
- 支持暂停:pipeline 可以选择停止并等待人工输入或批准后再继续执行
- 可扩展:通过 groovy 的编程更容易的扩展插件
- 并行执行:通过 groovy 脚本可以实现 step、stage 间的并行执行和更复杂的相互依赖关系
Pipeline job 实验
创建 pipeline job
测试简单 pipeline job 运行
- 流水线定义-Pipeline script-保存
- pipeline 测试命令
node{
stage("clone 代码"){
echo "代码 clone"
}
stage("代码构建"){
echo "代码构建"
}
stage("代码测试"){
echo "代码测试"
}
stage("代码部署"){
echo "代码部署"
}
}
- Jenkins Web 界面配置
执行 pipeline job
自动生成拉取代码的 pipeline 脚本
- 生成流水线脚本
更改 pipeline job
node{
stage("clone 代码"){
git branch: 'develop', credentialsId: 'd2b765e6-7495-4efa-8a2a-d40e2153631f', url: '[email protected]:test-service/test-project.git'
}
stage("代码构建"){
echo "代码构建"
}
stage("代码测试"){
echo "代码测试"
}
stage("代码部署"){
echo "代码部署"
}
}
执行 jenkins job
验证 git clone 日志
Jenkins 服务器验证 clone 代码数据
Pipeline 中执行 shell 命令打包代码
node{
stage("clone 代码"){
sh 'rm -rf /var/lib/jenkins/workspace/pipeline-test/*'
git branch: 'develop', credentialsId: 'd2b765e6-7495-4efa-8a2a-d40e2153631f', url: '[email protected]:test-service/test-project.git'
}
stage("代码构建"){
sh 'cd /var/lib/jenkins/workspace/pipeline-test/ && tar czf code.tar.gz ./index.html'
}
stage("代码测试"){
echo "代码测试"
}
stage("代码部署"){
echo "代码部署"
}
}
Pipeline 部署示例
- 绑定对应的jenkins-slave节点,以减轻jenkins-master节点负担
node("jenkins-node1"){ #在此定义想要使用哪个节点运行job
stage("clone 代码"){
sh 'rm -rf /var/lib/jenkins/workspace/pipeline-test/*'
git branch: 'develop', credentialsId: 'd2b765e6-7495-4efa-8a2a-d40e2153631f', url: '[email protected]:test-service/test-project.git'
}
stage("代码构建"){
sh 'cd /var/lib/jenkins/workspace/pipeline-test/ && tar czf code.tar.gz ./index.html'
}
stage("代码复制"){
sh 'cd /var/lib/jenkins/workspace/pipeline-test/ && scp code.tar.gz [email protected]:/data/tomcat/tomcat_webdir/'
sh 'cd /var/lib/jenkins/workspace/pipeline-test/ && scp code.tar.gz [email protected]:/data/tomcat/tomcat_webdir/'
}
stage("停止tomcat服务"){
sh 'ssh [email protected] "/apps/tomcat/bin/catalina.sh stop"'
sh 'ssh [email protected] "/apps/tomcat/bin/catalina.sh stop"'
}
stage("代码部署"){
sh 'ssh [email protected] "rm -rf /var/lib/jenkins/workspace/pipeline-test/myapp/* && cd /data/tomcat/tomcat_webdir && tar xf code.tar.gz -C /data/tomcat/tomcat_webdir/myapp/"'
sh 'ssh [email protected] "rm -rf /var/lib/jenkins/workspace/pipeline-test/myapp/* && cd /data/tomcat/tomcat_webdir && tar xf code.tar.gz -C /data/tomcat/tomcat_webdir/myapp/"'
}
stage("启动tomcat服务"){
sh 'ssh [email protected] "/apps/tomcat/bin/catalina.sh start"'
sh 'ssh [email protected] "/apps/tomcat/bin/catalina.sh start"'
}
}
执行并验证 pipeline job
指定 node 节点运行 job
- node 节点需要安装 git 命令
//jenkins-slave-1安装 git 命令
apt-get install git -y
- node 节点需要打通与 web server 免密钥登录
//生成密钥
ssh-keygen
//传递密钥,实现免密登录,否则执行job时会报权限拒绝
ssh-copy-id [email protected]
ssh-copy-id [email protected]
验证 jenkins-slave 执行构建
验证 web 服务器代码版本
//确定工作目录
pwd
/var/lib/jenkins/workspace
//登录gitlab
git config --global user.email "[email protected]"
git config --global user.name "bokebi"
//从指定分支克隆project
git clone -b develop [email protected]:test-service/test-project.git
//确定工作目录
pwd
/var/lib/jenkins/workspace/test-project
//修改代码
vim index.html
<h1>this is a pipeline-test page</h1>
//添加至暂存区
git add ./*
//提交至本地仓库,并打上标签
git add commit -m "pipeline-test"
//提交至远程仓库
git push
视图
安装 build pipeline 插件
- jenkins-系统管理-插件管理
- 插件安装成功
创建新的视图
创建 pipeline 视图
定义视图配置信息
Web 显示界面
列表视图
定义视图名称
选择任务
最终状态
我的视图
- 我的视图会显示当前账户有权限访问的job,因此需要提前划分号权限。
创建我的视图
- 创建后点保存,就会直接看到当前账户有权限的job
最终状态
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。