Jenkins持续集成

news2024/11/17 8:52:26

文章目录

  • Jenkins介绍
    • Jenkins的特征
  • Jenkins架构
  • Gitlab安装
    • 1. Gitlab代码托管服务器安装
    • 2. Gitlab添加组、创建用户、创建项目
  • jenkins安装
    • 安装Jenkins
    • Jenkins插件管理
    • Jenkins用户权限管理
    • Jenkins凭证管理
      • 安装Git插件和Git工具
      • 设置SSH免密登录
  • Maven安装和配置
  • Jenkins+Docker+springCloud
    • 安装Docker
      • 使用Dockerfile制作微服务镜像
    • 安装Harbor
      • 在Harbor创建用户和项目
      • 从Harbor下载镜像
    • Nginx安装与配置
    • Jenkins上配置
    • 微服务项目配置
  • 部署前端静态web网站

Jenkins介绍

Jenkins 是一个开源的持续集成(Continuous Integration)工具,它可以帮助开发团队自动化构建、测试和部署应用程序。以下是使用 Jenkins 进行持续集成的一般步骤:

Jenkins官网: http://jenkins-ci.org/

Jenkins的特征

  • 开源的Java语言开发持续集成工具,支持持续集成,持续部署。
  • 易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理。
  • 消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告。
  • 分布式构建:支持Jenkins能够让多台计算机一起构建/测试。
  • 文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
  • 丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等。

Jenkins架构

在这里插入图片描述

  • 首先,开发人员每天进行代码提交,提交到Git仓库。
  • 然后,Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK,Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程。
  • 最后,Jenkins把生成的jar或war包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用。

Gitlab安装

1. Gitlab代码托管服务器安装

  1. 安装相关依赖
yum -y install policycoreutils policycoreutils-python openssh-server openssh-clients postfix
  1. 启动ssh服务&设置为开机启动
systemctl enable sshd && sudo systemctl start sshd
  1. 设置postfix开机自启,并启动postfix支持gitlab发信功能
systemctl enable postfix && systemctl start postfix
  1. 开放ssh以及http服务,然后重新加载防火墙列表
    如果关闭防火墙就不需要做该配置。
firewall-cmd --add-service=ssh --permanent
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
  1. 下载gitlab包,并且安装
    软件源地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
    注意:centos7只能安装el6,或者el7的gitlab。
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-14.6.0-ce.0.el7.x86_64.rpm --no-check-certificate
rpm -i gitlab-ce-14.6.0-ce.0.el7.x86_64.rpm
  1. 修改gitlab配置
vim /etc/gitlab/gitlab.rb

# 修改gitlab访问地址和端口,默认为80,我们改为82
external_url 'http://192.168.1.22:82'
nginx['listen_port'] = 82
  1. 重载配置及启动gitlab
gitlab-ctl reconfigure
gitlab-ctl restart
  1. 获取初始密码
--重载配置后控制台会打印如下信息
Username: root  管理员账号
Password: You didn't opt-in to print initial root password to STDOUT.
Password stored to /etc/gitlab/initial_root_password.   初始密码所在文件

--拿到初始密码
cat  /etc/gitlab/initial_root_password
Password: 7UgjZYA9VYEbGzp83FZdAbw/7RwxZuy7rGpIKQ08H9w=
  1. 把端口添加到防火墙
firewall-cmd --zone=public --add-port=82/tcp --permanent
firewall-cmd --reload
  1. 访问gitlab:http://192.168.1.22:82/
    输入管理员账号root,密码7UgjZYA9VYEbGzp83FZdAbw/7RwxZuy7rGpIKQ08H9w=,登录即可。

  2. 修改管理员账号密码
    默认的管理员账号密码24小时后会失效,需要自己重置。
    访问:http://192.168.1.22:82/admin/users/root/edit 页面修改账号root的密码。

2. Gitlab添加组、创建用户、创建项目

  1. Gitlab添加组—itheima_group
    使用管理员 root 创建组,一个组里面可以有多个项目分支,可以将开发添加到组里面进行设置权限,不同的组就是公司不同的开发项目或者服务模块,不同的组添加不同的开发即可实现对开发设置权限的管理。

在这里插入图片描述

  1. 创建用户—zhangsan
    在这里插入图片描述

创建好用户后为新增的用户设置密码:
在这里插入图片描述

  1. 将用户添加到组中
    在这里插入图片描述

在这里插入图片描述

Gitlab用户在组里面有5种不同权限:
Guest:可以创建issue、发表评论,不能读写版本库。
Reporter:可以克隆代码,不能提交,QA、PM可以赋予这个权限。
Developer:可以克隆代码、开发、提交、push,普通开发可以赋予这个权限。
Maintainer:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心开发可以赋予这个权限。
Owner:可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组组长可以赋予这个权限。

  1. 在用户组中创建项目
    在这里插入图片描述

jenkins安装

Jenkins需要依赖JDK,所以先安装JDK1.8。

tar -zxvf jdk-8u171-linux-x64.tar.gz -C /opt/install/

# /opt/install/jdk1.8.0_171/bin/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

  1. 下载并安装jenkins
    Jenkins下载地址1(官网):https://jenkins.io/zh/download/
    Jenkins下载地址2:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/
yum -y install epel-release
yum -y install daemonize

wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.319.1-1.1.noarch.rpm

rpm -ivh jenkins-2.319.1-1.1.noarch.rpm
  1. 修改Jenkins配置
vim /etc/sysconfig/jenkins

# jdk目录
JENKINS_JAVA_CMD=/opt/install/jdk1.8.0_171/bin/java
#jenkins用户
JENKINS_USER="root"
#jenkins端口
JENKINS_PORT="8888"
  1. 启动Jenkins
# systemctl start jenkins
# systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: active (running) since Thu 2022-01-06 16:33:56 CST; 31s ago
  1. 开放8888端口
firewall-cmd --zone=public --add-port=8888/tcp --permanent
firewall-cmd --reload
  1. 访问Jenkins:http://192.168.1.25:8888/
  2. 获取并输入admin账户密码
# cat /var/lib/jenkins/secrets/initialAdminPassword
d59cfa55bd8f4e39ac91ef1aa26effa3
  1. 跳过插件安装
    因为Jenkins插件需要连接默认官网下载,速度非常慢,而且经常会失败,所以我们暂时先跳过插件安装。

在这里插入图片描述

在这里插入图片描述

  1. 添加第一个管理员账号
    在这里插入图片描述

  2. Jenkins准备就绪了
    在这里插入图片描述

Jenkins插件管理

Jenkins本身不提供很多功能,我们可以通过使用插件来满足我们的使用。例如从Gitlab拉取代码,使用Maven构建项目等功能需要依靠插件完成。接下来演示如何下载插件。

jenkins插件默认下载地址:https://updates.jenkins-ci.org/download/plugins
jenkins插件默认存储目录:/var/lib/jenkins/plugins

  1. 修改插件下载地址为国内
    Jenkins国外官方插件地址下载速度非常慢,所以可以修改为国内插件地址。
    (1)Jenkins -> Manage Jenkins -> Manage Plugins -> Available。
    (2)修改地址文件,替换为国内插件地址。
cd /var/lib/jenkins/updates
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

(3)点击Advanced,把Update Site改为国内插件下载地址。

在这里插入图片描述

默认地址:https://updates.jenkins.io/update-center.json
国内插件下载地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

(4)Sumbit后,浏览器访问 http://192.168.1.25:8888/restart 重启Jenkins。

  1. 下载中文汉化插件
    (1)Jenkins -> Manage Jenkins -> Manage Plugins -> Available,搜索Chinese。
    在这里插入图片描述

(2)重启后就看到Jenkins汉化了!(PS:但可能部分菜单汉化会失败)。

在这里插入图片描述

Jenkins用户权限管理

我们可以利用 Role-based Authorization Strategy 插件来管理Jenkins用户权限。

  1. 安装 Role-based Authorization Strategy 插件
  2. 开启权限全局安全配置
    系统管理(Manage Jenkins) -> 全局安全配置(Configure Global Security)-> 授权策略 -> 选【Role-Based Strategy】-> 应用。
  3. 创建角色
    (1)系统管理(Manage Jenkins) -> Manage and Assign Roles -> Manage Roles。
    (2)添加角色。
    在这里插入图片描述
  • Global roles:管理员等高级用户可以创建基于全局的角色。
  • Item roles:针对某个或者某些项目的角色。
    在这里添加如下三个角色:

baseRole:该角色为全局角色。这个角色需要绑定Overall(全部)下面的Read权限,是为了给所有用户绑
定最基本的Jenkins访问权限。注意:如果不给后续用户绑定这个角色,会报错误:用户名 is
missing the Overall/Read permission。

role1:该角色为项目角色。使用正则表达式绑定 itcast.,意思是只能操作itcast开头的项目。
role2:该角色也为项目角色。绑定 itheima.
,意思是只能操作itheima开头的项目。

  1. 创建用户
    (1)系统管理(Manage Jenkins) -> 管理用户(Manage Users) -> 新建用户。
    (2)分别创建两个用户:lisi、wangwu。
    在这里插入图片描述

在这里插入图片描述

  1. 给用户分配角色
    (1)系统管理(Manage Jenkins) -> Manage and Assign Roles -> Assign Roles。
    (2)绑定规则如下。

lisi 用户分别绑定baseRole和role1角色。
wangwu 用户分别绑定baseRole和role2角色。
在这里插入图片描述

  1. 创建项目测试权限
    (1)以zhangsan管理员账户创建两个项目,分别为itcast01和itheima01。zhangsan管理员可以看到所有的项目。
    在这里插入图片描述

(2)lisi账号只能看到项目itcast01。
在这里插入图片描述

(3)wangwu账号只能看到项目itheima01。
在这里插入图片描述

Jenkins凭证管理

凭据可以用来存储需要密文保护的数据库密码、Gitlab密码信息、Docker私有仓库密码等,以便Jenkins可以和这些第三方的应用进行交互。

  1. 安装Credentials Binding插件
    要在Jenkins使用凭证管理功能,需要安装Credentials Binding插件。

安装Git插件和Git工具

接下来以使用Git工具到Gitlab拉取项目源码为例,演示Jenkins如何管理Gitlab的凭证。

  1. Jenkins上安装 Git 插件
    在这里插入图片描述

  2. 在Jenkins机器上安装 Git 工具

# yum install git -y
# git --version
git version 1.8.3.1
  1. 创建凭证
    系统管理 -> Manage Credentials。

在这里插入图片描述
在这里插入图片描述

  1. 测试凭证是否可用
    (1)新建任务 -> 输入一个任务名称 -> 源码管理。
    在这里插入图片描述

(2)立即构建。
在这里插入图片描述

(3)构建完成后查看 控制台输出。

在这里插入图片描述

(4)到 Jenkins 机器上查看,发现已经从Gitlab成功拉取了代码到Jenkins中。

# cd /var/lib/jenkins/workspace/test01
# ll
total 20
-rw-r--r--. 1 root root 2636 Dec 14 22:05 email.html
-rw-r--r--. 1 root root 1374 Dec 14 22:05 Jenkinsfile
-rw-r--r--. 1 root root  625 Dec 14 22:05 pom.xml
-rw-r--r--. 1 root root  579 Dec 14 22:05 sonar-project.properties
drwxr-xr-x. 3 root root   17 Dec 14 22:05 src
-rw-r--r--. 1 root root 1499 Dec 14 22:05 web_demo.iml

设置SSH免密登录

在这里插入图片描述

SSH免密登录示意图

  1. 在 Jenkins 机器以root用户生成公钥和私钥
# ssh-keygen -t rsa
# cd /root/.ssh/
# ll
-rw-------. 1 root root 1675 Dec 15 10:52 id_rsa 私钥
-rw-r--r--. 1 root root  394 Dec 15 10:52 id_rsa.pub 公钥
  1. 把公钥放在Gitlab中
    以root账户登录 Gitlab -> 点击头像 -> Settings -> SSH Keys。把文件id_rsa.pub的内容粘贴进去。
    在这里插入图片描述

  2. 在Jenkins中添加私钥为凭证
    系统管理 -> Manage Credentials。
    在这里插入图片描述
    在这里插入图片描述

  3. 测试凭证是否可用
    (1)新建任务 -> 输入一个任务名称 -> 源码管理。
    在这里插入图片描述

(2)立即构建。
在这里插入图片描述

(3)构建完成后查看 控制台输出。
在这里插入图片描述

(4)到 Jenkins 机器上查看,发现已经从Gitlab成功拉取了代码到Jenkins中。

# cd /var/lib/jenkins/workspace/test02
# ll
total 20
-rw-r--r--. 1 root root 2636 Dec 15 10:57 email.html
-rw-r--r--. 1 root root 1374 Dec 15 10:57 Jenkinsfile
-rw-r--r--. 1 root root  625 Dec 15 10:57 pom.xml
-rw-r--r--. 1 root root  579 Dec 15 10:57 sonar-project.properties
drwxr-xr-x. 3 root root   17 Dec 15 10:57 src
-rw-r--r--. 1 root root 1499 Dec 15 10:57 web_demo.iml

Maven安装和配置

在Jenkins集成服务器上,我们需要安装Maven来编译和打包项目。

  1. 安装Maven与配置环境变量
    maven下载地址:https://maven.apache.org/download.cgi
wget https://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz

tar -xzf apache-maven-3.8.4-bin.tar.gz -C /opt/install
cd /opt/install/apache-maven-3.8.4/

# pwd
/opt/install/apache-maven-3.8.4

--配置环境变量
# vim /etc/profile
export JAVA_HOME=/opt/install/jdk1.8.0_171
export PATH=$PATH:$JAVA_HOME/bin
export MAVEN_HOME=/opt/install/apache-maven-3.8.4
export PATH=$PATH:$MAVEN_HOME/bin

# source /etc/profile
# mvn -v
Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537)
Maven home: /opt/install/apache-maven-3.8.4
Java version: 1.8.0_171, vendor: Oracle Corporation, runtime: /opt/install/jdk1.8.0_171/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.49.1.el7.x86_64", arch: "amd64", family: "unix"

--修改本地仓库目录为/opt/install/apache-maven-3.8.4/repo
# vim /opt/install/apache-maven-3.8.4/conf/settings.xml 
<localRepository>/opt/install/apache-maven-3.8.4/repo</localRepository>
  1. 全局工具配置关联JDK和Maven
    (1)系统管理 -> 全局工具配置 -> JDK -> 新增JDK。
    在这里插入图片描述

(2)系统管理 -> 全局工具配置 -> Maven -> 新增Maven。
在这里插入图片描述

  1. 添加Jenkins全局变量
    系统管理 -> 系统配置 -> 全局属性 -> 环境变量。
    在这里插入图片描述

  2. 测试Maven是否配置成功
    在Jenkins上随便找之前好的一个任务,比如 test02。
    在这里插入图片描述

再次构建,控制台看到把项目打成 war,代码Maven配置成功。
在这里插入图片描述

Jenkins+Docker+springCloud

在这里插入图片描述

在这里插入图片描述
大致流程说明:
1)开发人员每天把代码提交到Gitlab代码仓库。
2)Jenkins从Gitlab中拉取项目源码,编译并打成jar包,然后构建成Docker镜像,将镜像上传到Harbor私有仓库。
3)Jenkins发送SSH远程命令,让生产部署服务器到Harbor私有仓库拉取镜像到本地,然后创建容器。
4)最后,用户可以访问到容器。

安装Docker

  1. 卸载旧版本
yum list installed | grep docker
yum -y remove docker的包名称
--删除docker的所有镜像和容器
rm -rf /var/lib/docker
  1. 安装必要的软件包
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
  1. 设置下载的镜像仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
  1. 列出有哪些docker版本
# yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64            18.06.3.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.2.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.1.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.0.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.03.1.ce-1.el7.centos             docker-ce-stable
  1. 安装指定版本(这里使用18.06.3.ce-3.el7版本)
yum install docker-ce-18.06.3.ce
  1. 查看版本
# docker -v
Docker version 18.06.3-ce, build d7080c1
  1. 启动Docker
# systemctl start docker
# systemctl enable docker
# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) 
  1. 添加阿里云镜像下载地址
# vim /etc/docker/daemon.json
{
	"registry-mirrors": ["https://zydiol88.mirror.aliyuncs.com"]
}
  1. 重启Docker
# systemctl restart docker
# systemctl status docker 
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) 

使用Dockerfile制作微服务镜像

下面演示利用Dockerfile制作一个Eureka注册中心的镜像。

  1. 上传 tensquare-eureka-server-1.0-SNAPSHOT.jar 包到 production-server 机器上
  2. 编写Dockerfile文件
# vim Dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} /target/tensquare-eureka-server-1.0-SNAPSHOT.jar
EXPOSE 10086
ENTRYPOINT ["java","-jar","/target/tensquare-eureka-server-1.0-SNAPSHOT.jar"]
  1. 构建镜像
docker build --build-arg JAR_FILE=tensquare-eureka-server-1.0-SNAPSHOT.jar -t tensquare-eureka-server:v1.0 .
  1. 查看镜像是否构建成功
# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
tensquare-eureka-server   v1.0                70b977ee0289        35 seconds ago      150MB
  1. 创建容器
docker run -i --name=tensquare-eureka-server -p 10086:10086 tensquare-eureka-server:v1.0
  1. 浏览器访问容器:http://192.168.1.30:10086/

安装Harbor

  1. 安装Docker并启动Docker(已完成)
  2. 安装docker-compose
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m)  \
-o /usr/local/bin/docker-compose
  1. 给docker-compose添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
  1. 查看docker-compose是否安装成功
# docker-compose -version
docker-compose version 1.21.2, build a133471
  1. 下载Harbor压缩包并解压
    下载地址:https://github.com/goharbor/harbor/releases
wget https://github.com/goharbor/harbor/releases/download/v2.4.1/harbor-offline-installer-v2.4.1.tgz

tar -xzf harbor-offline-installer-v2.4.1.tgz -C /opt/install
  1. 修改Harbor的配置
cd /opt/install/harbor/
cp harbor.yml.tmpl harbor.yml

# vim harbor.yml
hostname: 192.168.1.29
port: 85

--将https的都注释掉
#https:
  # https port for harbor, default is 443
 # port: 443
  # The path of cert and key files for nginx
 # certificate: /your/certificate/path
 # private_key: /your/private/key/path
  1. 安装Harbor
./prepare
./install.sh
  1. 启动Harbor
--启动。 ps. 如果下面的命令启动失败则用该命令 docker-compose -f /opt/install/harbor/harbor.yml up -d 启动 
docker-compose up -d
--停止
docker-compose stop
--重启
docker-compose restart
  1. 浏览器访问Harbor:http://192.168.1.29:85
    默认账户admin,默认密码Harbor12345。

在Harbor创建用户和项目

  1. 创建项目tensquare

Harbor的项目分为公开和私有的:
公开项目:所有用户都可以访问,通常存放公共的镜像,默认有一个library公开项目。
私有项目:只有授权用户才可以访问,通常存放项目本身的镜像。

在这里插入图片描述

  1. 创建用户harborZhangsan/harborZhang3
    在这里插入图片描述

  2. 给私有项目分配用户
    在这里插入图片描述
    在这里插入图片描述

角色权限说明
访客对于指定项目拥有只读权限
开发人员对于指定项目拥有读写权限
维护人员对于指定项目拥有读写权限,创建 Webhooks
项目管理员除了读写权限,同时拥有用户管理/镜像扫描等管理权限
  1. 把镜像上传到Harbor
    下面演示将production-server机器上的镜像上传到位于docker-server机器上的Harbor。
1. 在production-server机器上完成下面步骤

(1) 把Harbor地址加入到Docker信任列表
# vim /etc/docker/daemon.json
{
    "registry-mirrors":[
        "https://zydiol88.mirror.aliyuncs.com"
    ],
    "insecure-registries":[
        "192.168.1.29:85" --这个是harbor地址
    ]
}

(2) 重启docker
systemctl restart docker

(3) 登录Harbor
docker login -u harbor账号 -p harbor密码 192.168.1.29:85

(4) 给需要上传到Harbor的镜像打标签
--查看当前机器有哪些镜像
# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
tensquare-eureka-server                                 v1.0                b82ccd24a80b        About an hour ago   150MB

--给 tensquare-eureka-server 镜像打标签
docker tag tensquare-eureka-server:v1.0 192.168.1.29:85/tensquare/tensquare-eureka-server:v1.0

(5) 推送镜像到Harbor
docker push 192.168.1.29:85/tensquare/tensquare-eureka-server:v1.0
  1. 登录到Harbor便可以看到推送的镜像了
    在这里插入图片描述

从Harbor下载镜像

下面演示从Harbor上下载镜像。

  1. 在需要从Harbor上拉取镜像的机器需要完成如下步骤
(1) 安装Docker,并启动Docker

(2) 把Harbor地址加入到Docker信任列表
# vim /etc/docker/daemon.json
{
    "registry-mirrors":[
        "https://zydiol88.mirror.aliyuncs.com"
    ],
    "insecure-registries":[
        "192.168.1.29:85" --这个是harbor地址
    ]
}

(3) 重启docker
systemctl restart docker

(4) 登录Harbor
docker login -u harbor账号 -p harbor密码 192.168.1.29:85
  1. 拉取镜像
    Harbor提供了镜像拉取命令。
    在这里插入图片描述
docker pull 192.168.1.29:85/tensquare/tensquare-eureka-server@sha256:f8e52604958377d7934d3f211d0537df2fbd41a085e7f48673f963ce03b82a54

或者如下拉取:
docker pull 192.168.1.29:85/tensquare/tensquare-eureka-server:v1.0

Nginx安装与配置

(1) 安装必要环境
yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel

(2) 解压并安装
tar -zxvf nginx-1.20.2.tar.gz -C /opt/install/
cd /opt/install/nginx-1.20.2
./configure
make
make install

--采用默认的配置安装,则启动命令在/usr/local/nginx/sbin
# cd /usr/local/nginx/sbin
# ./nginx -v
nginx version: nginx/1.20.2

--启动
# ./nginx
--停止
# ./nginx -s stop
--退出
# ./nginx -s quit
--重启
# ./nginx -s reload

--查看是否启动了
# ps -ef | grep nginx
root     11112     1  0 23:30 ?        00:00:00 nginx: master process ./nginx
nobody   11113 11112  0 23:30 ?        00:00:00 nginx: worker process
root     11115  8395  0 23:30 pts/0    00:00:00 grep --color=auto nginx

Jenkins上配置

  1. 在Jenkins创建流水线项目tensquare-parent
    在这里插入图片描述

  2. 指定Jenkinsfile脚本位置

在这里插入图片描述
在这里插入图片描述

  1. 添加项目参数project_name
    在这里插入图片描述

  2. 添加分支参数
    在这里插入图片描述

  3. 生成Harbor凭证脚本代码

在这里插入图片描述

withCredentials([usernamePassword(credentialsId: '0d458918-e2ea-4b51-8250-91c3731be288', passwordVariable: 'password', usernameVariable: 'username')]) {
    // some block
}
  1. 在Jenkins上安装插件 Publish Over SSH
    该插件,可以实现远程发送Shell命令。
  2. 配置远程部署服务器
    (1)拷贝 jenkins-server 机器上的公钥到远程部署服务器 production-server。
--在jenkins机器执行下面命令,将公钥复制到 192.168.1.30(production-server)
ssh-copy-id 192.168.1.30

(2)系统管理 -> 系统配置 -> Publish over SSH。
在这里插入图片描述

  1. 生成远程调用部署服务器的模板代码
    在这里插入图片描述

在这里插入图片描述

sshPublisher(publishers: [sshPublisherDesc(configName: 'production-server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
  1. 添加一个port参数
    在这里插入图片描述

微服务项目配置

  1. 编写Jenkinsfile文件
    一个微服务工程只需要一个Jenkinsfile文件。
    在这里插入图片描述
//gitlab凭证ID
def git_auth = "e4e02eb6-f6bb-4040-b842-c1423c397493"
//gitlab的url地址
def git_url = "git@gitlab.master.com:itheima_group/tensquare-parent.git"
//镜像的版本号
def tag = "latest"
//Harbor的url地址
def harbor_url = "reg.myharbor.com:85"
//harbor镜像库项目名称
def harbor_project_name = "tensquare"
//Harbor的登录凭证ID
def harbor_auth = "0d458918-e2ea-4b51-8250-91c3731be288"

node {
    stage('拉取代码') {
        checkout([$class                             : 'GitSCM', branches: [[name: '*/${branch}']]
                  , doGenerateSubmoduleConfigurations: false
                  , extensions                       : []
                  , submoduleCfg                     : []
                  , userRemoteConfigs                : [
                [credentialsId: "${git_auth}", url: "${git_url}"]
        ]])
    }
    stage('代码审查') {
        //定义当前Jenkins的SonarQubeScanner工具
        def scannerHome = tool 'sonarqube-scanner'
        //引用当前JenkinsSonarQube环境
        withSonarQubeEnv('sonarqube-8.9.6.50800') {
            sh """
                         cd ${project_name}
                         ${scannerHome}/bin/sonar-scanner
                 """
        }
    }
    stage('编译/构建镜像') {
        //定义镜像名称
        def imageName = "${project_name}:${tag}"
        //编译,安装公共工程
        sh "mvn -f tensquare-common clean install"
        //编译,构建本地镜像
        sh "mvn -f ${project_name} clean package dockerfile:build"
        //给镜像打标签
        sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}"
        //登录harbor并上传镜像
        withCredentials([
                usernamePassword(credentialsId: "${harbor_auth}"
                        , passwordVariable: 'password'
                        , usernameVariable: 'username')]) {
            //登录Harbor
            sh "docker login -u ${username} -p ${password} ${harbor_url}"
            //推送镜像到Harbor
            sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
        }

        //上传完成后删除本地镜像
        sh "docker rmi -f ${imageName}"
        sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${imageName}"
    }
    stage('部署服务') {
        sshPublisher(
                publishers: [
                        sshPublisherDesc(
                                configName: 'production-server'
                                , transfers: [
                                sshTransfer(
                                        cleanRemote: false
                                        , excludes: ''
                                        , execCommand: "/opt/jenkins_shell/tensquare/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)
                ])
    }
}
  1. 在部署服务器 production-server 机器上编写部署脚本
    (1)/opt/jenkins_shell/tensquare/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 "成功删除镜像"JAR_FILE
fi

# 登录Harbor私服
docker login -u harborZhangsan -p harborZhang3 $harbor_url
# 下载镜像
docker pull $imageName
# 启动容器
docker run -di -p $port:$port $imageName
echo "容器启动成功"

(2)给该脚本执行权限。

chmod +x deploy.sh

3.为每个微服务项目编写各自的sonar-project.properties文件
下面是微服务项目 tensquare-eureka-server 的一个例子,记得到Harbor上创建对应的项目哦。

# must be unique in a given SonarQube instance
sonar.projectKey=tensquare-eureka-server
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=tensquare-eureka-server
sonar.projectVersion=1.0

# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# This property is optional if sonar.modules is set.
sonar.sources=.
sonar.exclusions=**/test/**,**/target/**
sonar.java.binaries=.

sonar.java.source=1.8
sonar.java.target=1.8
#sonar.java.libraries=**/target/classes/**

# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8

4.为每个微服务项目编写各自的Dockerfile文件
(1)每个微服务项目的pom.xml添加如下插件。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>dockerfile-maven-plugin</artifactId>
            <version>1.3.6</version>
            <configuration>
                <repository>${project.artifactId}</repository>
                <buildArgs>
                    <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                </buildArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

(2)tensquare-eureka-server 微服务的Dockerfile文件示例。

#FROM java:8
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar

EXPOSE 10086 --注意每个微服务项目的端口都不一样

ENTRYPOINT ["java","-jar","/app.jar"]

部署前端静态web网站

在这里插入图片描述
生产部署服务器 production-server 已经安装了Nginx
2. Jenkins上安装NodeJS插件
3. Jenkins配置NodeJS服务器
Manage Jenkins(系统管理) -> Global Tool Configuration(全局工具配置) -> NodeJS。
在这里插入图片描述

  1. 在Jenkins上创建前端流水线项目tensquare-ui

在这里插入图片描述
在这里插入图片描述

  1. 编写Jenkinsfifile构建脚本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】栈和队列详解

⭐️ 往期相关文章 ✨链接1&#xff1a;数据结构和算法的概念以及时间复杂度空间复杂度详解 ✨链接2&#xff1a;【数据结构】手撕顺序表 ✨链接3&#xff1a;【数据结构】手撕单链表 ✨链接4&#xff1a;【数据结构】双向带头循环链表 ⭐️ 栈和队列 &#x1f320; 栈 栈是…

react-native项目手机预览

初始化项目 使用 expo 初始化 react-native 项目&#xff0c;https://reactnative.cn/docs/environment-setup 运行项目 执行 start 命令运行项目 拿起你的iPhone手机&#xff0c;安装 expo APP&#xff0c;https://expo.dev/client 或者到 APP store 搜索下载。下载完成之…

基于TCP协议的聊天系统TCP-ChatSystem

基于TCP协议的点对点聊天系统 网络协议&#xff1a;TCP 聊天形式&#xff1a;点对点 所用技术&#xff1a;socket、多路转接、线程池、互斥锁、条件变量、MFC等。 功能点&#xff1a;注册、登录、添加好友、聊天等。 实现示意图 客户端登陆注册消息流转图&#xff1a; 客…

【MATLAB第54期】基于LSTM长短期记忆网络的多输入多输出滑动窗口回归预测模型

【MATLAB第54期】基于LSTM长短期记忆网络的多输入多输出滑动窗口回归预测模型 往期第13期已实现多输入单输出滑动窗口回归预测 本次在此代码基础上&#xff0c;新增多输出滑动窗口功能。 多输入单输出滑动窗口回归预测 一、实现效果 往期文章提到了对单列时间序列数据进行滑…

spdlog入门教程(1)

spdlog入门教程&#xff08;1&#xff09; 文章目录 spdlog入门教程&#xff08;1&#xff09;1、前言1.1 为什么要使用日志库1.2 尽量使用通用日志框架而不要自己实现1.3 spdlog概述1.4 地址 2、源码编译配置spdlog3、在Qt中使用spdlog1.1 验证spdlog是否配置成功1.2 将日志输…

全网最牛,Pytest自动化测试-pytest.mark.parametrize参数化实战(详细)

目录&#xff1a;导读 前言 一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 pytest允许在多个…

删除数据库记录错误

删除数据库记录错误&#xff1a;Unexpected update count received (Actual: 2, Expected: 1). All changes will be rolled back. 解决&#xff1a;同时删掉ID为8的记录就行了 分析&#xff1a;这种情况是未设置主键约束&#xff0c;插入了相同的记录导致的。推测应该是框架对…

Clip-Path

前言 借助clip-path,我们可以实现一些复杂的animation动画效果,我们先来简单概述一下它的特性,如MDN所描述的。 The clip-path CSS property creates a clipping region that sets what part of an element should be shown. Parts that are inside the region are shown, whi…

基于aarch64分析kernel源码 一:环境搭建

一、测试环境 功能工具操作系统ubuntu 22.04编译工具gcc-12-aarch64-linux-gnu调试工具gdb-multiarch模拟器qemu 6.2.0busyboxbusybox-1.36.1kernellinux-6.4.1编辑器vscode 二、编译器 1、查找ubuntu仓库中aarch64编译器 lqlq-virtual-machine:~/my$ apt-cache search aar…

零矩阵

暴力解法&#xff1a;先全部检索&#xff0c;定位0所在的位置&#xff0c; 记录到新的数组 数组的行列分别进行去重 数组中记录的行列赋值为零 如果直接修改&#xff0c;在行被修改之后&#xff0c;修改列时会因为行已经被修改产生影响 import org.junit.Test;import java.uti…

tensorboard命令行使用方法

第一步&#xff1a;进入虚拟环境 conda activate 虚拟环境名称 第二步&#xff1a; tensorboard --logdir绝对地址 第三步&#xff1a;在浏览器输入提供的网址

day03 重新学python——python函数

文章目录 一、python函数1.函数介绍2.函数的定义3.函数的参数4.函数的返回值5.函数的说明文档6.函数的嵌套调用7.变量的作用域8.综合案例 一、python函数 1.函数介绍 函数&#xff1a;即组织好的、课重复利用&#xff0c;用来实现特殊功能的代码段&#xff0c;这样可以提高代码…

生产者消费者

前言 生产者消费者模式属于一种经典的多线程协作的模式&#xff0c;弄清生产者消费者问题能够让我们对于多线程编程有更深刻的理解&#xff0c;下面&#xff0c;为大家分享一个生产者消费者的案例。 一、案例描述 这里以快递为例&#xff0c;假设有一个快递柜&#xff0c;用来…

蚂蚁链发布零知识证明技术架构 可满足数据“隐私保护”、“可验证”双要求

7 月 8 日&#xff0c;在 2023WAIC 全球区块链产业高峰论坛上&#xff0c;蚂蚁链宣布隐私协作平台 AntChain FAIR 进行全新架构升级&#xff0c;引入零知识证明&#xff08;ZKP&#xff09;为核心的可验证计算技术&#xff0c;从可信数据流转拓展到计算过程、数据属性以及身份的…

Vmware环境下的CentOS安装

CentOS7 下载安装 因为 centos 是安装在 VMware 上面的&#xff0c;所以需要提前安装 VMware centos 下载 网址&#xff1a;http://isoredirect.centos.org/centos/7/isos/x86_64/ 镜像源&#xff1a;http://centos.mirror.rafal.ca/7.9.2009/isos/x86_64/ 安装 centos 创建…

哪些软件分析工具需要使用到pdb符号文件?

目录 1、什么是pdb文件&#xff1f;pdb文件有哪些用途&#xff1f; 2、pdb文件的时间戳与pdb文件名称 3、常用软件分析工具有哪些&#xff1f; 4、使用Windbg调试器查看函数调用堆栈时需要加载pdb文件 4.1、给Windbg设置pdb文件路径 4.2、为什么要设置系统库pdb文件下载服…

深度剖析线上应用节点流量隔离技术

作者&#xff1a;谢文欣&#xff08;风敬&#xff09; 为什么要做流量隔离 源于一个 EDAS 客户遇到的棘手情况&#xff1a;他们线上的一个 Pod CPU 指标异常&#xff0c;为了进一步诊断问题&#xff0c;客户希望在不重建此 Pod 的情况下保留现场&#xff0c;但诊断期间流量还…

Element-UI 实现动态增加多个输入框并校验

文章目录 前言实现通过按钮动态增加表单并验证必填实现动态多个输入框为行内模式&#xff0c;其它为行外模式 前言 在做复杂的动态表单&#xff0c;实现业务动态变动&#xff0c;比如有一条需要动态添加的el-form-item中包含了多个输入框&#xff0c;并实现表单验证&#xff0…

非线性激活函数

目录 理论介绍 常见的激活函数 A. sigmoid函数 B. tanh C.ReLu Leaky Relu 函数 Parametric ReLU (PReLU) Exponential Linear Unit (ELU) 实验结果及分析 理论介绍 在神经网络的计算中&#xff0c;无非就是矩阵相乘&#xff0c;输入的是线性&#xff0c;不论输出层有…

如何修复ssh漏洞进行版本升级

目录 一、ssh低版本漏洞信息 OpenSSH GSSAPI 处理远端代码执行漏洞 OpenSSH GSSAPI认证终止信息泄露漏洞 OpenSSH X连接会话劫持漏洞 二、升级ssh版本进行修复漏洞 第一步 安装Telnet服务 第二步 重启服务 第三步 安装依赖环境 第四步 备份ssh老版本文件 第五步 导入…