微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Jenkins 部署与实现持续部署

file

Jenkins 部署与实现持续部署

部署 jenkins

准备 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

file

//解决以上报错
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 界面

file

解锁并下一步

//根据提示获取密码解锁jenkins
cat /var/lib/jenkins/secrets/initialAdminPassword
e93ebef28b9e4377b94b9e60b9fbb82b

#将上面的获得到的密码复制到web页面点击下一步解锁jenkins

file

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>

file

选择安装 jenkins 插件

file

插件安装过程中

file

Nginx代理配置

  • 目前jenkins官方服务器在国外,从国内在线安装插件速度非常慢,但是可以通过Nginx进行rewrite,将安装插件的请求通过清华大学镜像服务器,以实现插件安装加速,配置如下:
//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,用逗号分隔。

file

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 管理员账户

file

Jenkins 实例配置

file

Jenkins 已就绪

file

登录 jenkins

file

Jenkins 首页

file

通过 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

file

验证 web 界面

file

通过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/

file

安装插件

file

file

file

配置 jenkins 权限管理

  • 基于角色的权限管理,先创建角色和用户,给角色授权,然后把用户管理到角色。

安装 Role-based 基于角色的认证策略

  • 安装基于角色认证策略的插件 Role-based

file

创建新用户

file

file

创建测试项目

file

更改认证方式

file

  • 路径为/var/lib/jenkins/users/root_5396110284457712874/config.xml

file

创建角色

  • Jenkins-系统管理-Manage and Assign Roles(管理和分配角色)-Manage Roles

file

添加角色

file

file

对角色分配权限

file

file

用户关联到角色

file

file

file

测试普通用户登录

  • 登录成功之的界面,没有系统管理权限,只能执行被授权过的 job 且没有了管理员权限。

file

file

Jenkins 邮箱配置

生成QQ邮箱登录授权

file

配置 jenkins 管理员邮箱

file

发送配置

  • Jenkins-系统管理-系统配置
  • 邮件配置

file

测试发送邮件

  • Jenkins-系统管理-系统配置
  • 测试邮件

file

基于 ssh key 拉取代码

添加 ssh key

//在jenkins服务器生成密钥对
ssh-keygen

//复制jenkins公钥添加到gitlab
cat /root/.ssh/id_rsa.pub
  • 浏览器访问gitlab:http://192.168.26.104

file

测试 ssh key

//修改jenkins运行用户为root
vim /etc/default/jenkins

# user and group to be invoked as (default to jenkins)
JENKINS_USER=root
JENKINS_GROUP=root

file

  • 在jenkins服务器拉取gitlab项目
//拉取gitlab项目
git clone [email protected]:test-service/test-project.git

file

file

配置 jenkins 到 gitlab 非交互拉取代码

Jenkins 服务器添加证书

  • Jenkins-凭据-系统-全局凭据-添加凭据

file

file

JJenkins 修改之前 project 的设置

file

配置 git 项目地址和用户

  • 添加完成的证书没有报错表示认证通过

file

  • 选中在构建之前删除工作区

file

测试构建项目

点击立即构建

file

验证构建结果

file

服务器验证数据

file

代码部署至后端服务器

  • 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 #生产环境

file

Gitlab 新建 develop 分支

file

Gitlab 定义分支名称并创建

file

Jenkins 安装插件

  • 注意事项:https://jenkins.io/security/advisory/2018-05-09/#Security-263
  • 系统管理-管理插件-可选插件 搜索安装 Gitlab Hook 和 Gitlab Authentication

file

Jenkins 修改登录认证方式

  • 在 jenkins 系统管理-全局安全设置
  • 修改认证用户可以做任何事情
  • 取消跨站点请求伪造保护的勾选项

file

Jenkins 新建 develop job

file

file

  • 复制项目使用 SSH 克隆的 URL

file

file

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

file

Jenkins 验证分支 job 配置文件

//job配置文件config.xml
vim /var/lib/jenkins/jobs/test-demo/config.xml 

file

Curl 命令测试触发并验证远程触发构建

  • 使用浏览器直接访问 URL 地址
  • 使用 curl 命令访问 URL 地址
//使用curl命令触发webhook
http://192.168.26.54:8080/job/test-demo/build?token=4ff6efdafd962294dcc9d474

Jenkins 验证 job 是否自动构建

file

Gitlab 配置 webhook

file

测试钩子可用性

  • 执行测试

file

  • 测试结果

file

Jenkins 新建 production job

file

  • 用于将测试环境的完成测试的代码发布至生产环境

file

  • 复制测试测试环境 test-demo 的 job

file

指定主分支

file

构建环境

file

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 自动构建

file

构建后项目关联

  • 用于多个 job 相互关联,需要串行执行多个 job 的场景可以通过安装插件 Parameterized Trigger 触发执行其他 project

file

  • 构建完成后触发另外一个 project

file

配置构建后操作

file

验证构建后操作

file

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—系统管理—节点管理—新建节点

file

  • 部分 jenkins slave 信息

file

为 jenkins-slave 添加基于用户名密码登录的凭据

file

jenkins-slave 创建日志

file

如果 jenkins-slave 没有 java 环境报错如下

file

验证添加的 jenkins-slave节点

  • 正常状态

file

  • 时间不同步状态

file

验证 jenkins-slave 进程状态

file

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

file

file

测试简单 pipeline job 运行

  • 流水线定义-Pipeline script-保存
  • pipeline 测试命令
node{
    stage("clone 代码"){
        echo "代码 clone"
    }
    stage("代码构建"){
        echo "代码构建"
    }
    stage("代码测试"){
        echo "代码测试"
    }
    stage("代码部署"){
        echo "代码部署"
    }
}
  • Jenkins Web 界面配置

file

执行 pipeline job

file

自动生成拉取代码的 pipeline 脚本

file

file

更改 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

file

验证 git clone 日志

file

Jenkins 服务器验证 clone 代码数据

file

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

  • 在 gitlab 提交代码,执行 pipeline job 并验证代码是否最终部署到了 web 服务器

file

指定 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 执行构建

file

验证 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

file

file

视图

  • 视图可用于归档 job 进行分组显示,比如将一个业务的视图放在一个视图显示,安装完成 build pipeline 插件之后将会有一个+号用于创建视图。

file

安装 build pipeline 插件

  • jenkins-系统管理-插件管理

file

file

创建新的视图

file

创建 pipeline 视图

file

定义视图配置信息

file

Web 显示界面

file

列表视图

  • 列表视图使用场景比较多,用于将一个业务的 job 保存至一个列表视图进行分类管理,即不同业务的 job 放在不同的列表视图中。

定义视图名称

file

选择任务

file

最终状态

file

我的视图

  • 我的视图会显示当前账户有权限访问的job,因此需要提前划分号权限。

创建我的视图

  • 创建后点保存,就会直接看到当前账户有权限的job

file

最终状态

file

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐