一、前言
由于是做虚拟搭建和测试,这里采用在同一虚拟机上搭建(http://192.168.11.169),具体信息如下:
服务 | 端口 | 软件及版本 |
---|---|---|
linux系统 | RHEL8 | |
gitlab | 82 | gitlab-ce-13.12.9-ce.0.el8.x86_64.rpm |
持续集成 | 8088 | Jenkins-2.190.3-1.1.noarch.rpm(不小心升级到2.308了,感觉UI更漂亮了) |
JDK | 1.8.0 | |
Git | 2.27.0 | |
maven | 3.6.3 | |
tomcat | 8080 | v8.5.61 |
二、Gitlab安装
1. 安装相关依赖并启动,设置开机自启:
PS:由于涉及到ssh和ftp的使用,除了以下方法外,也可以安装宝塔面板(默认端口8888)在其中安装和放行端口,方便快捷;
dnf -y install policycoreutils openssh-server openssh-clients postfix
systemctl enable sshd && sudo systemctl start sshd
systemctl enable postfix && systemctl start postfix
2. 防火墙开放ssh和http服务,并重载防火墙
firewall-cmd --add-service=ssh --permanent # 永久开放ssh服务
# firewall-cmd --remove-service=ssh --permanent # 永久关闭
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
3. 下载安装gitlab
这里有两种方式,可以下载并通过ftp传到服务器目录,也可以使用wget命令下载
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el8/gitlab-ce-13.12.9-ce.0.el8.x86_64.rpm
4. 修改默认端口,并重启服务
提示vim操作:在命令模式或者末行模式下,输入 “/搜索关键字” 来查询,n为下一个,N为上一个
[root@linuxprobe /]# vim /etc/gitlab/gitlab.rb
##! **Override only if you use a reverse proxy**
##! Docs: https://docs.gitlab.com/omnibus/settings/nginx.html#setting-the-nginx-listen-port
nginx['listen_port'] = 82 # 修改端口
## GitLab URL
##! URL on which GitLab will be reachable.
##! For more details on configuring external_url see:
##! https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab
##!
##! Note: During installation/upgrades, the value of the environment variable
##! EXTERNAL_URL will be used to populate/replace this value.
##! On AWS EC2 instances, we also attempt to fetch the public hostname/IP
##! address from AWS. For more details, see:
##! https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html
external_url 'http://192.168.11.169:82' # 修改外部访问ip+端口
PS:在后面安装启动Tomcat时,发现tomcat所使用的8080端口被占用了,导致无法访问,这里有两种方式解决:
1.更换Tomcat端口
2.修改gitlab配置文件,更换gitlab中puma或unicorn进程端口
netstat -lpnut | gerp 8080 # 查看端口占用,发现是puma进程
[root@linuxprobe ~]# netstat -lpnut | grep puma
tcp 0 0 127.0.0.1:8089 0.0.0.0:* LISTEN 2197/puma 5.1.1 (un
systemctl status 2197 # 查看此进程信息(属于哪个服务),发现是gitlab的一个关键子进程
vim /etc/gitlab/gitlab.rb # 在配置文件中搜索8080端口,发现puma和unicorn默认都是8080端口,并且默认使用puma(enable为true),
# 所以这里采用修改puma端口,并启用puma配置的方式,试验后可行
5. 将端口添加到防火墙
PS:linux系统一般都有防火墙,例如RHEL的iptables和firewalld,一般安装好软件、修改完配置文件,依然无法访问时,我们就要考虑是不是防火墙拦截了
firewall-cmd --zone=public --add-port=82/tcp --permanent # 开放82端口
firewall-cmd --reload # 重新加载防火墙
6. 控制台设置及上传项目
登陆 http://192.168.11.169:82 修改root的默认密码即可登陆;root可以创建新用户、空项目、修改默认语言,并将本地代码上传至gitlab,http方式上传步骤如下:
git基本配置,crlf为换行符配置,可以自行考虑是否添加
git config --global user.email “your email”
git config --global user.name “your name”
git config --global core.autocrlf true
git config --global core.safecrlf truegit init :代码目录右键git bash,然后初始化git
git remote add origin http://192.168.11.169:82/coderwhat/test.git :关联远程仓库(已在控制台创建空项目)
git add .
git commit -m ‘init’
git push -u origin master :将代码推送到gitlab端
7.常用命令
gitlab-ctl reconfigure 重新配置
gitlab-ctl restart 重启
二、Jenkins安装
1. 安装JDK环境
dnf install java-1.8.0-openjdk* -y
2. 下载并安装Jenkins
https://www.jenkins.io/zh/download/
rpm -ivh jenkins-2.190.3-1.1.noarch.rpm
3. 修改用户名及端口
[root@linuxprobe /]# vim /etc/sysconfig/jenkins
## Type: integer(0:65535)
## Default: 8080
## ServiceRestart: jenkins
#
# Port Jenkins is listening on.
# Set to -1 to disable
#
JENKINS_PORT="8088" # 端口
## Type: string
## Default: "jenkins"
## ServiceRestart: jenkins
#
# Unix user account that runs the Jenkins daemon
# Be careful when you change this, as you need to update
# permissions of $JENKINS_HOME and /var/log/jenkins.
#
JENKINS_USER="root" # 用户名
4. 启动服务并添加开机自启
systemctl start jenkins
[root@linuxprobe /]# systemctl enable jenkins # 此方式无法正常添加开机启动,按照提示如下输入即可
jenkins.service is not a native service, redirecting to systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable jenkins
[root@linuxprobe /]# /usr/lib/systemd/systemd-sysv-install enable jenkins
5. 防火墙开放配置
firewall-cmd --add-service=jenkins --permanent
firewall-cmd --zone=public --add-port=8088/tcp --permanent
firewall-cmd --reload
6. 初始化及修改插件源
这时我们就可以访问http://192.168.11.169:8088/来初始化jenkins,根据提示到系统对应路径下获取默认密码,然后新增用户(这里插件可以选择 自定义 - 无 来跳过自动下载安装插件,因为官网下载速度很慢)
修改国内源方法:
a. 点击 Manage Jenkins -> Manage Plugins -> Available 生成官方插件列表到本地 /var/lib/jenkins/updates/default.json文件
b. 然后运行命令:sed -i 's/http:\/\/updates.jenkinsci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
c. 最后在 Manage Jenkins -> Manage Plugins -> Advanced 中修改 Update Site 为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
d. 重启jenkins :http://192.168.11.169:8088/restart
7.插件安装
a. 汉化 Localization: Chinese (Simplified)
在插件管理Available页面搜索 chinese,选择出现的汉化插件选择安装,最后重启(本次在实验中,虽然也报错了,但是重启后汉化依然成功)
安装时可能会出现 Trilead API failure 报错,只需下载对应版本的 trilead-api.hpi,并在 Manage Jenkins -> Manage Plugins -> Available 上传 hpi文件然后重启即可,同时安装git插件需要新版的Trilead API插件
https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/trilead-api/
b. 权限管理 Role-based Authorization Strategy
- 安装完成后,在 系统管理-> 配置全局安全 中,将授权策略修改为 Role-Based Strategy;
然后在 系统管理 -> Manage and Assign Roles -> Manage Roles 中就可以看到三种类型的用户,创建三个月角色:
- Global roles:角色全局的权限
- Item roles:角色项目的权限
- Node roles:角色节点的权限
读权限不给报错提示:
- 在 系统管理 -> 管理用户 -> 新建用户中创建如下用户
- 在 系统管理 -> Manage and Assign Roles -> Assign Roles 来分配角色,这是project用户只能查看 “web*” 项目,project1用户只能查看 “test*” 项目
- 通过如上步骤设置能得到如下结果:
project:BaseRead + web.*项目权限
project1:BaseRead + test.*项目权限
c. 凭证管理 Credentials Binding
凭证是与第三方系统交互的认证信息,如常见的用户名密码、git仓库的ssh密钥等,安装此插件可以帮助我们与其他系统交互;
在 系统管理 -> Manage Credentials -> 全局-> 添加凭据 中总共有5种类型的凭证可供添加:
- Username with password:用户名和密码
- SSH Username with private key: 使用SSH用户名和密钥
- Secret file:需要保密的文本文件,使用时Jenkins会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的Secret file就会被删除。
- Secret text:需要保存的一个加密的文本串,如钉钉机器人或Github的api token
- Certificate:通过上传证书文件的方式
这里以集成gitlab为例,通过凭证来连接:
- Jenkins安装Git插件,RHEL8上安装Git工具
dnf install git
git --version
- 在 系统管理 -> Manage Credentials -> 全局-> 添加凭据 下添加一个
用户名密码凭证
:
- 在刚才添加的 freestyle 项目中修改源码管理并选择已添加的用户凭证:
- 这时我们可以使用点击立即构建,在 Build History 中就能看到 build 记录,同时在控制台能看到调用凭证的日志,同时在
var/lib/jenkins/workspace/
目录下也能看到jenkins拉取到的源码:
[root@linuxprobe /]# cd var/lib/jenkins/workspace/web123
[root@linuxprobe web123]# ll
total 16
-rw-r--r-- 1 root root 2636 Aug 31 11:00 email.html
-rw-r--r-- 1 root root 1374 Aug 31 11:00 Jenkinsfile
-rw-r--r-- 1 root root 625 Aug 31 11:00 pom.xml
-rw-r--r-- 1 root root 579 Aug 31 11:00 sonar-project.properties
drwxr-xr-x 3 root root 18 Aug 31 11:00 src
- 然后我们再尝试使用
ssh密钥方式
首先是准备工作,需要生成密钥文件,同时需要搞清楚一个概念:Gitlab是存放公钥的,Jenkins等是存放私钥的,这样就可以通过ssh密钥登陆Gitlab服务器了;
[root@linuxprobe keygen]# ssh-keygen -t rsa # 生成rsa ssh密钥
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa. # 私钥
Your public key has been saved in /root/.ssh/id_rsa.pub. # 公钥
The key fingerprint is:
SHA256:oDTDOwftEJY1qKod/cC6f9jlwn+5041FWsxqJSFeZMI root@linuxprobe.com
The key's randomart image is:
+---[RSA 3072]----+
| o+o ...o |
| ooo . Eoo |
| .B o . o + |
| .. O . . . * |
| . o+ o S B |
|. . +o . + . |
|.. o * o + + |
|. o . * . + o . |
| .o.. o...o |
+----[SHA256]-----+
- 将公钥添加到gitlab中,以root账户登陆, 头像 -> Preferences -> SSH密钥 ,将id_rsa.pub中的内容复制过来保存;将私钥添加到Jenkins凭证中,添加选下如下:
7. 最后就是测试了,我们把之前的test_model修改一下配置,Credentials选择使用ssh密钥的凭证;同样的,编译、日志、源码都与之前http方式结果一致,测试成功。
d.自动部署到容器 Deploy to container
Jenkins本身无法实现远程部署到Tomcat的功能,需要安装Deploy to container插件实现,搜索安装即可,这样在项目“构建后操作”中就能看到Deploy war/ear to a container:
三、maven安装及Jenkins集成
1. 解压缩放到自定义目录下
https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/
mkdir -p /opt/maven
tar xzvf apache-maven-3.6.3-bin.tar.gz -C /opt/maven/
mv /opt/maven/apache-maven-3.6.3/* /opt/maven/
2. 配置环境变量并校验
vim /etc/profile
# 在文件的末尾添加环境变量
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export MAVEN_HOME=/opt/maven
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
mvn -v # 查看maven版本并校验
3. 修改本地仓库位置、配置镜像地址
https://developer.aliyun.com/mirror/maven?spm=a2c6h.13651102.0.0.3e221b11gTmVMo
mkdir /opt/mvnrepo
vim /opt/maven/conf/settings.xml
# 修改本地仓库和配置镜像
<localRepository>/opt/mvnrepo/</localRepository>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
4. Jenkins集成maven
在Jenkins中集成maven主要有以下步骤:
- 在 系统管理 -> 全局工具配置 中配置JDK和Maven;
- 在 配置管理 -> 系统配置 -> 全局属性 -> 环境变量 中添加 JAVA_HOME、MAVEN_HOME、PATH+EXTRA;
- 校验:增加maven打包命令执行打包,看日志是否成功打包;
四、Tomcat
1. 解压缩放到自定义目录下
https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.61/bin/
mkdir -p /opt/tomcat
tar xzvf apache-tomcat-8.5.61.tar.gz -C /opt/tomcat/
mv apache-tomcat-8.5.61/* /opt/tomcat/
rm -rf apache-tomcat-8.5.61/
如果8080端口默认没有开放,就在防火墙配置一下
firewall-cmd --zone=public --add-port=8088/tcp --permanent
firewall-cmd --reload
启动直接在此目录下运行startup.sh即可
cd /opt/tomcat/bin
bash startup.sh
bash shutdown.sh
2.配置Tomcat角色权限(中间件)
访问:http://192.168.11.169:8080/ 后,点击 Managing Tomcat 框中的manager webapp,会出现403 拒绝访问提示,这是因为还没有配置Tomcat用户权限,无法进行管理,包括后续Jenkins也是需要用到;
在/opt/tomcat/conf/tomcat-users.xml
文件对应脚标添加如下,用户的用户名和密码均为 tomcat:
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,tomcat,admin-gui,admin-script"/>
</tomcat-users>
同时需要注释掉/opt/tomcat/webapps/manager/META-INF/context.xml
中的下列内容:
<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
最后重启,点击manager webapp输入用户名和密码,即可进入管理页面
五、Jenkins 拉取、打包、部署Maven项目
这里会基于上述的 git拉取代码、maven打包项目、安装插件使用tomcat角色权限自动部署 来进行实践,根据自动构建项目的常见类型可分为三种:
- 自由风格软件项目(FreeStyle Project):就是一个free,但也会少很多定制功能
- Maven项目(Maven Project):
- 流水线项目(Pipeline Project):
5.1 freestyle project
在前期环境准备好的基础上,需要做一下配置操作:
- 新建项目,配置好git;
- 增加 构建步骤 -> 执行shell 添加打包命令及日志
echo "开始编译和打包"
mvn clean package
echo "编译和打包结束"
- 在 系统管理 -> 管理凭据 添加tomcat用户认证,认证信息在 4.2 章节中配置;然后在构建后步骤增加tomcat的配置
- 根据项目日志即可尝试访问部署好的地址:
后面跟的是war包名:http://192.168.11.169:8080/web_demo-1.0-SNAPSHOT/
PS:这里有一个小插曲,前面尝试编译时一直报错,这里截取关键日志如下:
[DeployPublisher][INFO] Deploying /var/lib/jenkins/workspace/freestype_demo/target/web_demo-1.0-SNAPSHOT.war to container Tomcat 8.x Remote with context null
ERROR: Build step failed with exception
org.codehaus.cargo.container.ContainerException: Failed to redeploy [/var/lib/jenkins/workspace/freestype_demo/target/web_demo-1.0-SNAPSHOT.war]
...
Caused by: org.codehaus.cargo.container.tomcat.internal.TomcatManagerException: The username you provided is not allowed to use the text-based Tomcat Manager (error 403)
...
Caused by: java.io.IOException: Server returned HTTP response code: 403 for URL: http://192.168.11.169:8080/manager/text/list
...
从日志中可以看出,提示的是用户权限问题,仔细检查/opt/tomcat/conf/tomcat-users.xml
后发现,复制时漏掉了一个符号,修改重启服务器才恢复
5.2 maven project
-
安装Maven Integration插件,这样便能在创建项目时选择“构建一个maven项目”了(安装插件是如果出现异常,有可能是网络问题,需要开梯子才能顺利安装,这里就涉及到更换了清华源为什么没有生效的问题了,可以研究一下):
-
第1,3,4步骤与freestyle project是一样的,唯一不同的便是构建项目时配置变为:
5.3 Pipeline流水线项目构建
流水线类型的优点,是可以自己随意控制整个流程阶段,编排细化任务的流程,并且可视化。支持的语法类型有两种:
- 声明式(Declarative-Pipeline):
- 脚本式(Scripted-Pipeline):
安装Pipeline插件,这样便能在创建项目时选择“流水线”类型了
5.3.1 声明式 Declarative-Pipeline
按照下方是示例编写声明式流水线,这样在编译时我们就能在项目主界面看到阶段视图了,能清楚的看到每一个stage的执行情况