Jenkins 教程
https://gitee.com/fakerlove/jenkins
Jenkins 教程
1. 简介
1.1 介绍
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
我说下我以前开发的痛点,在一些中小型企业,每次开发一个项目完成后,需要打包部署,可能没有专门的运维人员,只能开发人员去把项目打成一个war包,可能这个项目已经上线了,需要把服务关,在部署到服务器上,将项目启动起来,这个时候可能某个用户正在操作某些功能上的东西,如果你隔三差五的部署一下,这样的话对用户的体验也不好,自己也是烦的很,总是打包拖到服务器上。希望小型企业工作人员学习一下,配置可能复杂,但是你配置好了之后,你只需要把代码提交到Git或者Svn上,自动构建部署,非常方便。有任何地方不懂的翻到最下方随时咨询我,想帮助更多的初学者共同一起努力成长!
1.2 环境准备
1.2.1 安装jenkins
jenkins 镜像网站
https://mirrors.cloud.tencent.com/jenkins/
https://mirrors.huaweicloud.com/jenkins/
https://mirrors.tuna.tsinghua.edu.cn/jenkins/
http://mirrors.ustc.edu.cn/jenkins/
1) 离线安装
yum install -y java-1.8.0-openjdk* -y
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.277.4-1.1.noarch.rpm
rpm -ivh jenkins-2.277.4-1.1.noarch.rpm
yum install jenkins
systemctl start jenkins
2) docker 安装
安装docker
1.启动docker,下载Jenkins镜像文件
docker pull jenkins/jenkins
2.创建Jenkins挂载目录并授权权限(我们在服务器上先创建一个jenkins工作目录 /var/jenkins_mount,赋予相应权限,稍后我们将jenkins容器目录挂载到这个目录上,这样我们就可以很方便地对容器内的配置文件进行修改。 如果我们不这样做,那么如果需要修改容器配置文件,将会有点麻烦,因为虽然我们可以使用docker exec -it --user root 容器id /bin/bash 命令进入容器目录,但是连简单的 vi命令都不能使用)
mkdir -p /var/jenkins_mount
chmod 777 /var/jenkins_mount
3.创建并启动Jenkins容器
-d 后台运行镜像
-p 10240:8080 将镜像的8080端口映射到服务器的10240端口。
-p 10241:50000 将镜像的50000端口映射到服务器的10241端口
-v /var/jenkins_mount:/var/jenkins_mount /var/jenkins_home目录为容器jenkins工作目录,我们将硬盘上的一个目录挂载到这个位置,方便后续更新镜像后继续使用原来的工作目录。这里我们设置的就是上面我们创建的 /var/jenkins_mount目录
-v /etc/localtime:/etc/localtime让容器使用和服务器同样的时间设置。
--name myjenkins 给容器起一个别名
docker run -d -p 10240:8080 -p 10241:50000 -v /var/jenkins_mount:/var/jenkins_home -v /etc/localtime:/etc/localtime --name myjenkins jenkins/jenkins
自己的jenkins
mkdir ~/jenkins
mkdir ~/jenkins/jenkins_mount
mkdir ~/jenkins/etc
mkdir ~/jenkins/maven
docker run -it -d -p 10240:8080 -p 10241:5000 -u root -v ~/jenkins/jenkins_mount:/var/jenkins_home -v /etc/localtime:/etc/localtime -v ~/jenkins/maven:/var/maven -v ~/jenkins/etc/:/etc/ --name myjenkins jenkins/jenkins:lts
4.查看jenkins是否启动成功,如下图出现端口号,就为启动成功了
docker ps -l
5.查看docker容器日志。
docker logs myjenkins
6.配置镜像加速,进入 cd /var/jenkins_mount/ 目录。
cd /var/jenkins_mount/
修改 vi hudson.model.UpdateCenter.xml里的内容
修改前
将 url 修改为腾讯云官方镜像:
https://mirrors.cloud.tencent.com/jenkins/updates/update-center.json
修改后
配置国内镜像源
mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >/etc/apt/sources.list
echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list
apt-get update
3) 访问jenkins
- 访问Jenkins页面,输入你的ip加上10240
- 管理员密码获取方法,编辑initialAdminPassword文件查看,把密码输入登录中的密码即可,开始使用。
vi /var/jenkins_mount/secrets/initialAdminPassword
- 到此以全部安装成功,尽情的使用吧!
1.2.2 安装gitlab
一、安装及配置
1.gitlab镜像拉取
# gitlab-ce为稳定版本,后面不填写版本则默认pull最新latest版本
$ docker pull gitlab/gitlab-ce
拉取镜像
2.运行gitlab镜像
docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
# -d:后台运行
# -p:将容器内部端口向外映射
# --name:命名容器名称
# -v:将容器内数据文件夹或者日志、配置等文件夹挂载到宿主机指定目录
运行成功后出现一串字符串
运行成功
docker run -d -p 443:443 -p 8088:80 -p 222:22 --name gitlab --restart always -v ~/gitlab/config:/etc/gitlab -v ~/gitlab/logs:/var/log/gitlab -v ~/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
3.配置
按上面的方式,gitlab容器运行没问题,但在gitlab上创建项目的时候,生成项目的URL访问地址是按容器的hostname来生成的,也就是容器的id。作为gitlab服务器,我们需要一个固定的URL访问地址,于是需要配置gitlab.rb(宿主机路径:/home/gitlab/config/gitlab.rb)。
# gitlab.rb文件内容默认全是注释
vim /home/gitlab/config/gitlab.rb
配置文件
# 配置http协议所使用的访问地址,不加端口号默认为80
external_url 'http://192.168.199.231'
# 配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = '192.168.199.231'
gitlab_rails['gitlab_shell_ssh_port'] = 222 # 此端口是run时22端口映射的222端口
:wq #保存配置文件并退出
修改gitlab.rb文件
# 重启gitlab容器
docker restart gitlab
此时项目的仓库地址就变了。如果ssh端口地址不是默认的22,就会加上ssh:// 协议头 打开浏览器输入ip地址(因为我的gitlab端口为80,所以浏览器url不用输入端口号,如果端口号不是80,则打开为:ip:端口号)
4.创建一个项目
第一次进入要输入新的root用户密码,设置好之后确定就行
gitlab页面
下面我们就可以新建一个项目了,点击Create a project
Create a project
创建完成后:
创建完成!
二、用户使用
1.下载git.exe
双击git.exe安装git(一直点下一步,直到完成) 点击电脑桌面空白地方右键看到如下两行即安装成功
image.png
2.登录gitlab网页
url:http://192.168.1.111 填写账号密码登录
登录页面
3.设置ssh
1.打开本地git bash,使用如下命令生成ssh公钥和私钥对
ssh-keygen -t rsa -C 'xxx@xxx.com'
然后一路回车(-C 参数是你的邮箱地址)
生成密匙
2.然后输入命令:
# ~表示用户目录,比如我的windows就是C:\Users\Administrator,并复制其中的内容
cat ~/.ssh/id_rsa.pub
公匙
3.打开gitlab,找到Profile Settings-->SSH Keys--->Add SSH Key,并把上一步中复制的内容粘贴到Key所对应的文本框
添加公匙到gitlab
4.从gitlab克隆代码
1.回到gitlab页面点击projects->your projects
2.选择一个需要克隆的项目,进入
我的项目页面
3.点击按钮复制地址
复制ssh地址
4.新建一个文件夹,我在这里在我的电脑D盘下新建project文件夹
5.进入projects文件夹右键选择->Git Bash Here
点击Git Bash Here
6.设置用户名和邮箱
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
设置名字和邮箱
7.克隆项目
git clone 项目地址
克隆项目
8.查看projects文件夹,项目已经克隆下来了
项目目录
5.提交代码到gitlab
1.基于以上步骤,在克隆的项目文件夹下新增一个测试文件
新增txt文件
2.查看同步状态 在项目文件夹下右键点击->Git Bash Here
输入
git status
状态
可以看到红色部分有需要提交的文件 3.提交代码 输入
git add 测试提交的文件.txt
(“git add“后加“.”则添加全部文件,也可以加"*.txt"表示添加全部需要提交的txt文件 )
add需要提交的文件
然后输入以下命令提交并添加提交信息
git commit -m "message"
commit
最后输出以下命令提交到gitlab
git push origin master
1.2.3 gitlab占用内存太多问题
修改/etc/gitlab/gitlab.rb
unicorn['worker_processes'] = 2
postgresql['max_worker_processes'] = 4
nginx['worker_processes'] = 4
重新运行
gitlab-ctl reconfigure #gitlab会读取配置文件参数并修改各个插件的配置文件去(我猜的)
gitlab-ctl restart
2. 入门
2.1 安装中文插件
2.2 角色控制Role-Based Strategy
点击"Manage Roles"
进行角色的管理
2.3 安装凭证
2.4 jenkins拉取项目
2.4.1 拉取gitlab 项目
1. 设置全局凭据
点击添加凭据
输入Gitee 账号、密码 ID可以任意填写,描述框可以根据项目来撰写
类型项一定要选择
2. 新建Item
Jenkins首页—Item—新建 也可以进入到已有的Item里,再新建一个Item
输入项目名称,一般用项目名称来命名,然后选择流水线,确定
项目创建完毕
3. 具体任务配置
Jenkins首页—相应Item—配置----流水线—址—生成流水线脚本
#去gitee克隆代码地址
配置在Jenkins上
复制脚本
#这下面是配置构建脚本,注意Jenkins支持任何语言编写的项目的构建
粘贴需要构建的代码链接和要执行的ssh命令,建议每次构建都加上ls -l 验证是否成功,应用 保存
4、构建验证
进入任务,点击立即构建,成功的话会显示绿色,可以在Build History验证是否成功
点击任务,进入任务页面,选择控制台输出,可以看到构建的详细日志,如果构建失败,可以在日志中查看失败原因:
2.4.2 拉取gitee 项目
1. 安装gitee 插件
2. 添加Gitee链接配置
前往 Jenkins -> Manage Jenkins -> Configure System -> Gitee Configuration -> Gitee connections
点击进行数据的配置
在 Connection name
中输入 Gitee
或者你想要的名字
Gitee host URL
中输入Gitee完整 URL地址: https://gitee.com
(Gitee私有化客户输入部署的域名)
Credentials
中如还未配置Gitee APIV5 私人令牌,点击Add ->Jenkins
Domain
选择Global credentials
Kind
选择Gitee API Token
Scope
选择你需要的范围Gitee API Token
输入你的Gitee私人令牌,获取地址:https://gitee.com/profile/personal_access_tokensID
,Descripiton
中输入你想要的 ID 和描述即可。
Credentials
选择配置好的 Gitee APIV5 Token点击
Advanced
,可配置是否忽略 SSL 错误(视您的Jenkins环境是否支持),并可设置链接测超时时间(视您的网络环境而定)点击
Test Connection
测试链接是否成功,如失败请检查以上 3,5,6 步骤。
配置成功后如图所示:
3. 新建构建任务
前往 Jenkins -> New Item , name 输入 'Gitee Test',选择 Freestyle project
保存即可创建构建项目。
4. 任务全局配置
任务全局配置中需要选择前一步中的Gitee链接。前往某个任务(如'Gitee Test')的 Configure -> General,Gitee connection 中选择前面所配置的Gitee链接,如图:
2.5 安装maven
2.6 安装tomcat
安装jdk
yum install -y java-1.8.0-openjdk* -y
安装tomcat
mkdir tomcat
cd tomcat
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-10/v10.0.6/bin/apache-tomcat-10.0.6.tar.gz
tar -zxvf apache-tomcat-10.0.6.tar.gz
编辑用户信息
vim apache-tomcat-10.0.6//conf/tomcat-users.xml
设置用户信息
<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>
开放外网访问权限
vim 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" />
-->
修改端口号--看需求
vim conf/server.xml
修改完配置为
开启tomcat
./startup.sh
输入tomcat,密码tomcat
进入管理界面
3. jenkins 风格类型
3.1 自由风格类型
拉取代码->编译->打包->部署
3.1.1 拉取代码
3.1.2 编译
构建->添加构建步骤->Executor Shell
echo "开始编译和打包"
mvn clean package
echo "编译和打包结束"
这个时候会报错,
解决方法
echo $PATH
复制path 路径,点击全局配置,添加全局属性
3.1.3 部署
把项目部署到远程的Tomcat里面
安装 Deploy to container插件
点击构建后操作
添加tomcat 的凭证
构件后操作
就可以打包成功
3.2 Maven 风格类型
3.2.1 安装Maven Integration插件
3.2.2 创建Maven项目
3.2.3 配置项目
3.3 流水线风格类型
Pipeline 脚本是由 Groovy 语言实现的,但是我们没必要单独去学习 Groovy
Pipeline 支持两种语法:Declarative(声明式)和 Scripted Pipeline(脚本式)语法
Pipeline 也有两种创建方法:可以直接在 Jenkins 的 Web UI 界面中输入脚本;也可以通过创建一
个 Jenkinsfifile 脚本文件放入项目源码库中(一般我们都推荐在 Jenkins 中直接从源代码控制(SCM)
中直接载入 Jenkinsfifile Pipeline 这种方法)。
3.3.1 安装pipline
3.3.2 创建项目
3.3.3 拉取代码
自定义流水线
构建流水线语法
拉取代码
生成pipline 代码
构件代码
pipeline {
agent any
stages {
stage('pull code') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '1527f9a8-f6ed-41b3-93a7-c05a88f36de9', url: 'https://gitee.com/fakerlove/clock']]])
}
}
stage('build project') {
steps {
sh 'mvn clean package'
}
}
stage("sa") {
steps {
echo 'goujian构件wancheng'
}
}
}
}
3.3.4 构建成功
3.4 jenkins 常见的触发器
jenkins 常见触发器
其中gitee为安装了gitee 插件后,出现的触发
默认有4种
- 触发远程构建
- 轮训SCM
- 其他工程构建后触发
- 定时构建
3.4.1 gitee 触发器
gitee 设置签发文章
https://gitee.com/help/articles/4193#article-header9
在jenkins 上设置触发器,点击生成秘钥
gitee设置webHook
修改代码,提交至gitee,jenkins立即进行了刷新测试
3.4.2 触发远程构建
设置token信息
输入网址即可进行触发
http://192.168.66.101:8888/job/web_demo_pipeline/build?token=6666
3.4.3 其他工程创建触发
创建pre_job流水线工程
配置需要触发的工程
3.4.4 定时构建
每30分钟构建一次:H代表形参 H/30 * * * * 10:02 10:32
每2个小时构建一次: H H/2 * * *
每天的8点,12点,22点,一天构建3次: (多个时间点中间用逗号隔开) 0 8,12,22 * * *
每天中午12点定时构建一次 H 12 * * *
每天下午18点定时构建一次 H 18 * * *
在每个小时的前半个小时内的每10分钟 H(0-29)/10 * * * *
每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午
4:38) H H(9-16)/2 * * 1-5
3.4.5 参数化构建
3.5 邮件发送
3.5.1 安装插件
3.5.2 开启邮箱支持
开启权限
点击生成授权码
发送配置短信,发送完成后,点击我已发送、获取密码
3.5.3 配置
配置邮件管理员
配置Extended
配置 jenkins 默认邮箱
点击测试
在项目的根目录下创建email.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
<table width="95%" cellpadding="0" cellspacing="0"
style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans- serif">
<tr>
<td>(本邮件是程序自动下发的,请勿回复!)</td>
</tr>
<tr>
<td>
<h2>
<span style="color: #0000FF; ">构建结果 - ${BUILD_STATUS}</span>
</h2>
</td>
</tr>
<tr>
<td><br/> <b><span style="color: #0B610B; ">构建信息</span></b>
<hr size="2" width="100%" align="center"/>
</td>
</tr>
<tr>
<td>
<ul>
<li>项目名称 : ${PROJECT_NAME}</li>
<li>构建编号 : 第${BUILD_NUMBER}次构建</li>
<li>触发原因: ${CAUSE}</li>
<li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>构建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
<li>项目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
</ul>
</td>
</tr>
<tr>
<td><b><span style="color: #0B610B; ">Changes Since Last Successful Build:</span></b>
<hr size="2" width="100%" align="center"/>
</td>
</tr>
编写Jenkinsfile添加构建后发送邮件
<tr>
<td>
<ul>
<li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
</ul>
${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br/>%c<br/>",showPaths=true,changesFormat="
<pre>[%a]<br/>%m</pre>
",pathFormat=" %p"}
</td>
</tr>
<tr>
<td><b>Failed Test Results</b>
<hr size="2" width="100%" align="center"/>
</td>
</tr>
<tr>
<td>
<pre style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">$FAILED_TESTS</pre>
<br/>
</td>
</tr>
<tr>
<td>
<b>
<span style="color: #0B610B; ">构建日志 (最后 100行):</span>
</b>
<hr size="2" width="100%" align="center"/>
</td>
</tr>
<tr>
<td>
<textarea cols="80" rows="30" readonly="readonly" style="font-family: Courier New">
${BUILD_LOG, maxLines=100}
</textarea>
</td>
</tr>
</table>
</body>
</html>
修改流水线的语法,在最后添加pipline 语法
pipeline {
agent any
stages {
stage('pull code') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '1527f9a8-f6ed-41b3-93a7-c05a88f36de9', url: 'https://gitee.com/fakerlove/clock']]])
}
}
stage('build project') {
steps {
sh 'mvn clean package'
}
}
stage("sa") {
steps {
echo 'goujian构件wancheng'
}
}
}
post {
always {
emailext(
subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',
body: '${FILE,path="email.html"}',
to: '203462009@qq.com' )
}
}
}
点击重新构建,构建完成后,会接收到邮件信息
3.6 SonarQube 代码审查
4. Docker+SpringCloud
4.1 环境准备
- docker
- jenkins
- maven
- harbor 私有的镜像仓库
4.1.1 docker的安装
centos 7
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce docker-ce-cli containerd.io -y
systemctl start docker
docker version
centos 8
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils
yum makecache
yum install -y wget
wget -O /etc/yum.repos.d/CenOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
yum clean all
yum install -y https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.4.3-3.1.el8.x86_64.rpm
yum install docker-ce docker-ce-cli -y
systemctl start docker
docker version
容器镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ip92h4jn.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
4.1.2 docker-compose 安装
compose 网址
https://github.com/docker/compose/releases
安装docker-compose
sudo curl -L "https://gitee.com/fakerlove/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
centos7 可以选择如下安装
yum -y install python-pip
pip install --upgrade pip
pip install docker-compose
docker-compose -version
4.1.3 harbor 安装
在github 上找到适合自己的版本
https://github.com/goharbor/harbor/tags
最低的需求配置
上传下载的软件,并解压
tar -zxvf harbor-offline-installer-v2.2.2.tgz -C /usr/local/
复制yml
cd /usr/local/harbor/
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
修改一下三个部分信息
启动脚本
./install.sh
等启动成功,输入网址
http://121.37.175.163/
如果默认80 网址,有服务,即可修改端口信息
4.1.4 Harbor 使用
创建harbor项目
创建镜像,给镜像把tag
121.37.175.163 为Harbor的网址,jenkins为Harbor的用户信息,myjenkins 为镜像名字
注意点80端口的话,打tag 时不能添加80,直接就是ip 地址即可,其中clock 为项目名。kk 为在仓库中镜像的名字
docker tag jenkins/jenkins:latest 121.37.175.163/clock/kk:1.0
添加受信任名单
vim /etc/docker/daemon.json
添加一下内容
{
"registry-mirrors": ["https://ip92h4jn.mirror.aliyuncs.com"],
"insecure-registries": ["121.37.175.163:80"]
}
使用Harbor 账户登录docker
systemctl daemon-reload
systemctl restart docker
docker login 121.37.175.163 -u admin -p 123456
上传镜像
docker push 121.37.175.163/clock/kk:1.0
如果报错
Get http://harbor.phc-dow.com/v2/: Get http://harbor.phc-dow.com:180/service/token?account=admin&client_id=docker&offline_token=true&service=harbor-registry: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) (Client.Timeout exceeded while awaiting headers)
解决方案
- 检查是否添加信任名单,
- 检查是否填写外网网址
- 检查用户名和密码
- 检查端口号,是否填写正确
- 检查防火墙和安全组是否开放
最后试试以下内容
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #最后一行写入
sysctl -p
4.2 使用DockerFile插件生成镜像
4.2.1添加打包插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<configuration>
<repository>${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
4.2.2 编写Dockerfile 文件
FROM openjdk:8-jdk-alpine
EXPOSE 8081
ARG JAR_FILE
ADD ${JAR_FILE} /app.jar
ENTRYPOINT ["java", "-jar","/app.jar"]
修改jenkins 信息
4.2.3 打包镜像,并上传服务器
可以使用阿里云的镜像容器服务,或者自己的harbor私人镜像仓库
使用流水线语法,进行上传服务
pipeline {
agent any
environment {
tag = 'latest'
//阿里云的镜像存储空间
harbor_url = 'registry.cn-shanghai.aliyuncs.com'
//镜像存储的命名空间
harbor_project_name = 'jokerak' //Harbor的凭证
harbor_auth = 'ef499f29-f138-44dd-975e-ff1ca1d8c933'
// 项目名
project_name = 'clock'
imageName = "${project_name}:${tag}"
}
stages {
stage('拉取代码') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: '*/master']],
extensions: [],
userRemoteConfigs:
[[credentialsId:
'1527f9a8-f6ed-41b3-93a7-c05a88f36de9',
url: 'https://gitee.com/fakerlove/clock']
]
])
}
}
stage('打包编译项目,创建镜像,上传镜像') {
steps {
// 打包编译项目
sh 'mvn clean package dockerfile:build'
// 给镜像打tag
sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}"
withCredentials([usernamePassword(credentialsId: '5b07edf3-bfb8-49e7-8b27-a6d600ef99d8', passwordVariable: 'password', usernameVariable: 'username')]) {
// 登录镜像
sh "docker login -u ${username} -p ${password} ${harbor_url}"
//上传镜像
sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
}
}
}
}
post {
always {
// 发送邮件
emailext(
subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',
body: '${FILE,path="email.html"}',
to: '203462009@qq.com' )
}
}
}
4.2.4 拉取镜像并部署
1) 安装插件
安装以下插件,可以实现远程发送Shell命令
首先在jenkins 所在服务器下生成ssh ,2.277 版本一下不支持一下生成公钥。不知道现在2.932 还支不支持
ssh-keygen -o
可以试一下
ssh-keygen -m PEM -t rsa -b 4096
说明:
-m 参数指定密钥的格式,PEM是rsa之前使用的旧格式
-b 指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。
拷贝公钥到服务器中
ssh-copy-id 121.37.175.163
2) 添加远程服务器
系统配置->添加远程服务器
修改公钥权限,复制公钥值jenkins目录下,以防没有权限访问
mkdir /var/lib/jenkins/.ssh
cp /root/.ssh/* /var/lib/jenkins/.ssh/
点击测试
3) 上传代码
使用流水线语法生成器
创建流水线语法
sshPublisher(
publishers:
[sshPublisherDesc(configName: '华为云服务器',
transfers: [
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: "/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project_name $project_name $tag $port",
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '')],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false)])
在部署服务的服务器上创建deploy.sh
#! /bin/sh #接收外部参数
harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
port=$5
imageName=$harbor_url/$harbor_project_name/$project_name:$tag
echo "$imageName" #查询容器是否存在,存在则删除
containerId=`docker ps -a | grep -w ${project_name}:${tag} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
#停掉容器
docker stop $containerId
#删除容器
docker rm $containerId
echo "成功删除容器"
fi
#查询镜像是否存在,存在则删除
imageId=`docker images | grep -w $project_name | awk '{print $3}'`
if [ "$imageId" != "" ] ; then
#删除镜像
docker rmi -f $imageId
echo "成功删除镜像"
fi
# 登录Harbor私服
docker login -u itcast -p Itcast123 $harbor_url
# 下载镜像
docker pull $imageName
# 启动容器
docker run -di -p $port:$port -v /etc/localtime:/etc/localtime $imageName
echo "容器启动成功"
4.2.5 出现的错误如下
找不到打包插件
更换maven 镜像
<mirror> <id> alimaven </id> <mirrorOf> * </mirrorOf> <name> aliyun maven </name> <url> https://maven.aliyun.com/repository/public </url> </mirror>
无法创建maven包
修改maven 仓库权限
chmod 777 /var/lib/res
Jenkins: unix://localhost:80: Permission denied
chmod 777 /var/run/docker.sock
4.2.6 流水线的总代码
pipeline {
agent any
environment {
tag = 'latest'
//阿里云的镜像存储空间
harbor_url = 'registry.cn-shanghai.aliyuncs.com'
//镜像存储的命名空间
harbor_project_name = 'jokerak' //Harbor的凭证
harbor_auth = 'ef499f29-f138-44dd-975e-ff1ca1d8c933'
// 项目名
project_name = 'clock'
port = '8081'
imageName = "${project_name}:${tag}"
}
stages {
stage('拉取代码') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: '*/master']],
extensions: [],
userRemoteConfigs:
[[credentialsId:
'1527f9a8-f6ed-41b3-93a7-c05a88f36de9',
url: 'https://gitee.com/fakerlove/clock']
]
])
}
}
stage('打包编译项目,创建镜像,上传镜像') {
steps {
// 打包编译项目
sh 'mvn clean package dockerfile:build'
// 给镜像打tag
sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}"
withCredentials([usernamePassword(credentialsId: '5b07edf3-bfb8-49e7-8b27-a6d600ef99d8', passwordVariable: 'password', usernameVariable: 'username')]) {
// 登录镜像
sh "docker login -u ${username} -p ${password} ${harbor_url}"
//上传镜像
sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
}
}
}
stage('拉取镜像,部署服务') {
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'cloud',
transfers: [
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: "/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project_name $project_name $tag $port",
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '')],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: false)])
}
}
}
post {
always {
// 发送邮件
emailext(
subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',
body: '${FILE,path="email.html"}',
to: '203462009@qq.com' )
}
}
}
4.3 部署静态网站
4.3.1 安装ngnix
yum install epel-release
yum -y install nginx
修改配置文件,修改端口信息
vi /etc/nginx/nginx.conf
要关闭selinux
vi /etc/selinux/config
永久关闭 SELINUX=disabled
启动ngnix
systemctl start nginx
4.3.2 安装nodejs 插件
搜索插件NodeJS
4.3.3 安装nodejs
尽量使用自己的npm,因为需要配置镜像,自己的环境搭建起来
wget https://npm.taobao.org/mirrors/node/v14.16.1/node-v14.16.1-linux-x64.tar.xz
xz -d node-v14.16.1-linux-x64.tar.xz
tar -xvf node-v14.16.1-linux-x64.tar
mkdir -p /var/lib/node
rm -rf /var/lib/node/*
cp ~/node-v14.16.1-linux-x64/* /var/lib/node -r
chmod 777 -R /var/lib/node
ln -s /var/lib/node/bin/node /usr/bin/node
ln -s /var/lib/node/bin/npm /usr/bin/npm
npm config set registry https://registry.npm.taobao.org
vim /etc/profile
export PATH=/var/lib/node/bin:$PATH
source /etc/profile
4.3.4 创建项目
一定要修改连接的根目录,不然会出现问题
创建一个Vue的项目。vue-cli3 脚手架创建项目。然后创建Jenkinsfile 文件
在流水线语法生成器,生成语法
4.3.5 Jenkinsfile 代码
4.4 SpringCloud 打包服务
注意点
- common 工程中,不能够使用springboot 的打包插件,必须移除common 父工程的打包插件
使用,-f 指定特定工程进行打包
mvn -f common clean install
4.4.1 修改配置
# 集群版
spring:
application:
name: EUREKA-HA
---
server:
port: 10086
spring: # 指定profile=eureka-server1
profiles: eureka-server1
eureka:
instance: # 指定当profile=eureka-server1时,主机名是eureka-server1
hostname: 192.168.66.103
client:
service-url: # 将自己注册到eureka-server1、eureka-server2这个Eureka上面去
defaultZone: http://192.168.66.103:10086/eureka/,http://192.168.66.104:10086/eureka/
---
server:
port: 10086
spring:
profiles: eureka-server2
eureka:
instance:
hostname: 192.168.66.104
client:
service-url:
defaultZone: http://192.168.66.103:10086/eureka/,http://192.168.66.104:10086/eureka/
4.4.2 安装插件
安装Extended Choice Parameter