jenkin部署spring boot项目【从0到1】

写在前面,遇到的很多错误

本来想用docker启动Jenkins的,也这样做了,但是遇到了一个非常严重的问题,就是mvn命令在docker里面不生效,然后就修改文件,但是发现vi不存在,好的。接着用yum安装vi工具,发现yum不存在,我真服了,我搞个docker还得自己去下载yum再上传到docker,这么麻烦,我用它干啥

好的,接下来我们就用最简单的java -jar来启动jenkins.war,本来找了个兼容8、11、17的版本,结果等安装好发现一堆漏洞,你敢在生产环境用么,慌的一批,好,换版本。
在这里插入图片描述

再说一下为啥网上的页面大部分都不一样,这个就是因为jenkins是前后端一体的项目,而且有了漏洞马上修复,页面也在不断优化,所以就导致不同时间的不同版本的页面是不一样的,如果不按照博客的版本其实很难安装成功

而且Jenkins启动需要Java环境,并且在2022年11月已经弃用了Java8,使用Java8的jenkins漏洞也比较多,看上图,所以咱们用最新的jenkins以及Java17来操作

假设有条分割线


Linux 系统的管理员必须在安装 Jenkins LTS 2.387.2.之前在其 Linux 服务器上安装新的存储库签名密钥。

Red Hat/CentOS LTS 版本
$ sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key

rpm --import

yum install fontconfig java-11-openjdk
yum install jenkins

硬件最低要求:

  • 256 MB 内存,但建议超过 2 GB
  • 1 GB 驱动器空间(但如果运行,建议至少 10 GB 作为 Jenkins 和 Docker 容器)

小型团队的推荐硬件配置:

  • 4 GB+ 内存
  • 50 GB+ 驱动器空间

jenkins版本和Java版本的对应关系,官网地址https://get.jenkins.io/war-stable/

jenkins版本Java版本
2.361.1开始Java 11, or Java 17
2.346.1开始Java 8, Java 11, or Java 17
2.60.1开始Java 8
1.625.1 开始Java 7

docker的文件系统被称之为镜像

一 准备工作

最好是三台服务器,分别用来放gitlab、jenkins、部署项目
我只有一台阿里云,所以就把Jenkins和部署项目放一起了

或者使用VMware来充当服务器也行

1 新建springboot项目

1.1 打开idea,File–New–Project

在这里插入图片描述

自定义项目名字和Group,这里用java8的maven项目

在这里插入图片描述
1.2 boot版本别太高,3.0以上使用Java17的,这里选择2.7.10,选一个spring web依赖,部署到服务器要验证能不能调通接口
在这里插入图片描述
然后等一会就好了

1.3 写这样的一个代码,没有其它了
在这里插入图片描述

package cn.fox.mydemo.controller;

import org.springframework.web.bind.annotation.*;

@RestController
public class MyController {

    @RequestMapping("/getStr")
    public String getStr(){
        String str = "恭喜你,调用成功!";
        System.out.println(str);
        return str;
    }
}

yml文件,这里改一个端口号,因为jenkins是8080,避免冲突改为8081

server:
  port: 8081
  servlet:
    context-path: /@artifactId@/
    encoding:
      charset: UTF-8

2 将spring boot项目放到gitee上(一般情况公司代码在gitlab上托管的)

2.1 在gitee上注册账号,新建仓库
在这里插入图片描述
2.2 初始化redme文件
在这里插入图片描述
2.3 复制项目地址
在这里插入图片描述
拉取gitee项目需要用户名(就是个人主页的红框的名字,没有@符号)密码(就是登录gitee的密码)【这里尽量不要克隆,直接把本地项目推送到gitee就行。克隆下来在把项目复制进去再提交也行】

在这里插入图片描述

2.4 在本地电脑上打开git bash here窗口,将项目推送到gitee仓库

  • 初始化gitgit init
  • 关联远程仓库 git remote add origin 你的用户名gitee项目地址
  • 拉取远程仓库代码git pull origin master
  • 将spring boot项目添加git版本控制git add .
  • 提交到本地git仓库git commit -m "初始化"
  • 推送到远程仓库giteegit push origin master

在这里插入图片描述

在这里插入图片描述

二 下载并安装jdk17、maven、git和Jenkins

1 配置jdk

Linux一般会自带jdk
输入rpm -qa | grep java 搜索jdk的安装包
输入rpm -e --nodeps + 包名 来删除包

java 17页面
https://www.oracle.com/cn/java/technologies/downloads/#java17
在这里插入图片描述

下载、解压、移动目录、配置全局变量


wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz

tar -zxvf jdk-17_linux-x64_bin.tar.gz

mv jdk-17.0.7/ /usr/local/jdk

vim /etc/profile

加入下面几行,按esc,再按:wq保存并退出

# java环境jdk路径
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin

刷新配置
source /etc/profile

查看Java版本
java -version

在这里插入图片描述

2 配置maven【打包用】

# 建立仓库位置的文件夹,-p确保目录名称存在,不存在的就建一个。
mkdir -p /mnt/repository

# 去本地目录
cd /usr/local/

# 下载二进制Linu的maven文件
wget https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
# 解压 -C<目的目录>或--directory=<目的目录> 切换到指定的目录
tar -zxvf apache-maven-3.5.4-bin.tar.gz 

# 改个文件名字
mv apache-maven-3.5.4 /usr/local/maven

# 改settings文件,这里是全路径,cd到conf目录再vim也行
vim /usr/local/maven/conf/settings.xml

  • 然后按/斜杠来查找关键字
  • 输入/localRepository再点击n来实现查找下一个关键字
  • i进入编辑状态,复制粘贴下面的两段配置
  • 最后按esc键退出编辑,按:wq保存

实在不会看一下这个Linux改文件内容的基础教程https://www.runoob.com/linux/linux-vim.html

本地仓库位置和使用阿里云镜像


<localRepository>/mnt/repository</localRepository>

<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
</mirror>

如图所示

在这里插入图片描述

在这里插入图片描述

3 安装git【拉取代码用】

git官网不支持centOS直接安装git,有两种办法

简单的办法就是直接安装,然后等一会输入y,最后查看版本【版本最高1.8】

yum install git

git --version

复杂的从源码编译安装【可以安装最新版,以及自定义目录】
https://mirrors.edge.kernel.org/pub/software/scm/git/git-manpages-2.37.0.tar.gz

4 安装jenkins

所有版本页面
https://get.jenkins.io/war-stable/
在这里插入图片描述

在这里插入图片描述

创建文件夹,进入文件夹,下载Jenkins.war文件

cd /
mkdir jenkins
cd jenkins

wget https://get.jenkins.io/war-stable/2.401.1/jenkins.war

在这里插入图片描述

启动jar包,默认8080

nohup java -jar /jenkins/jenkins.war >/jenkins/jenkins.log 2>&1 &

也可以启动的时候指定端口号

nohup java -jar /jenkins/jenkins.war --httpPort=9999 >/jenkins/jenkins.log 2>&1 &

如果是java8会出现这个错误

nohup: ignoring input
Running with Java 8 from /usr/local/jdk/jre, which is older than the minimum required version (Java 11).
Supported Java versions are: [11, 17]
See https://jenkins.io/redirect/java-support/ for more information.

-----------------------分割线--------------------------------

本来想下载这个版本,但是安装上后发现一堆漏洞,故放弃此版本
下载2.346.3,这个版本是Java8、11、17都兼容的

wget https://get.jenkins.io/war-stable/2.346.3/jenkins.war

然后出现这个错误,大致意思就是https的证书失效,不能用wget下载

--2023-06-05 11:11:30--  https://get.jenkins.io/war-stable/2.346.3/jenkins.war
Resolving get.jenkins.io (get.jenkins.io)... 52.167.253.43
Connecting to get.jenkins.io (get.jenkins.io)|52.167.253.43|:443... connected.
ERROR: cannot verify get.jenkins.io's certificate, issued by ‘/C=US/O=Let's Encrypt/CN=R3’:
  Issued certificate has expired.
To connect to get.jenkins.io insecurely, use `--no-check-certificate'.

设置运行下载失效证书的文件

sudo yum install -y ca-certificates

再次下载即可,或则windows下载完上传到linux也行

三 访问并配置jenkins

3.1 浏览器输入http://localhost:8080出现如图所示

在这里插入图片描述

3.2 去服务器找密钥来解锁 Jenkins

cat 页面上的红色路径,密钥的位置可能和大家的不一样

# 查看密钥
cat /var/jenkins_home/secrets/initialAdminPassword

3.3 选择安装推荐的插件

在这里插入图片描述
在这里插入图片描述
等一会等安装完需要创建用户,也可以直接用admin

在这里插入图片描述
配置实例,默认的不用改,点击保存并完成

在这里插入图片描述
点击开始使用
在这里插入图片描述

然后就进入了jenkins页面

在这里插入图片描述

3.4 重启docker让配置生效

# 查看容器信息
docker ps -a
# 重启容器
# docker restart <容器 ID>
docker restart 5adc6d39e47a

在这里插入图片描述

四 安装插件

点击 系统管理–插件管理

在这里插入图片描述
4.1 安装gitee插件,拉取gitee上面的代码
在这里插入图片描述
在这里插入图片描述
4.2. 安装maven,打包jar包用
在这里插入图片描述

4.3. 安装ssh,将打好的jar包传输到测试、生产服务器
在这里插入图片描述
在这里插入图片描述
安装完成后选择重启,来刷新插件

4.4 jenkins页面配置环境变量

点击全局工具配置
在这里插入图片描述

3.1 配置maven
/usr/local/maven/conf/setting.xml

在这里插入图片描述

3.2 配置jdk

jenkins内部已经有jdk了,就不用单独在主机中安装并添加docker映射了

/usr/local/jdk

在这里插入图片描述

在这里插入图片描述

3.3 配置git

jenkins内部也有git,就按默认的来
yum install git
在这里插入图片描述

3.4 配置gitee凭证,拉取代码用

到这个地址上创建gitee令牌
https://gitee.com/profile/personal_access_tokens
在这里插入图片描述
输入描述,勾选projects、pull_requests点击提交
在这里插入图片描述
输入密码验证
在这里插入图片描述
将令牌保存下来
在这里插入图片描述

点击jenkins的系统配置
在这里插入图片描述
找到gitee,先添加令牌,选择Gitee API 令牌,粘贴上面的令牌,点击添加然后下拉框选择刚才创建的令牌
在这里插入图片描述
添加项目地址,和令牌(此文档的jenkins版本不允许直接写gitee的用户名和密码)

在这里插入图片描述

3.5 配置ssh凭证,把打好的包放到测试或生产服务器用
3.5.1 服务器用root用户创建一个子用户

Linux创建用户和组的基础教程https://www.runoob.com/linux/linux-user-manage.html

# 创建用户
useradd zhangsan

# 修改密码,需要输入两次,而且为了保密,是看不见的,不是键盘坏了
passwd zhangsan

# 查看用户关系,最后一行有刚才创建的zhangsan
cat /etc/passwd

默认/home/zhangsan目录可以使用,这里就不赋权限了,截图是我已经创建zhangsan了,就再创建一个lisi
在这里插入图片描述

3.5.2 我出现的问题说一下,使用阿里云服务器默认不允许使用账号密码远程连接服务器,我先打开运行这样做
# 编辑ssh配置
vim /etc/ssh/sshd_config

# 输入/Pass,点击n键查找,找到将PasswordAuthentication no改为yes,然保存

# 重启ssh
service sshd restart


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

3.5.3 jenkins页面找到ssh,应该是最下面,点击新增

在这里插入图片描述
输入基本信息,这里使用密码验证,建议使用令牌(后面再试验)
在这里插入图片描述
点击测试,出现success代表正确,然保存
在这里插入图片描述
我出现的问题说一下,使用阿里云服务器默认不允许使用账号密码远程连接服务器,我先打开运行这样做

# 编辑ssh配置
vim /etc/ssh/sshd_config

# 输入/Pass,点击n键查找,找到将PasswordAuthentication no改为yes,然保存

# 重启ssh
service sshd restart


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

八 构建任务

1 点击新建任务,输入任务名字,选择maven项目,点击确定

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

2 任务基础配置
2.1 源码管理–选git–写gitee项目地址–选令牌

令牌是前面配置好的
在这里插入图片描述

2.2 构建触发器
  • 选择gitee webhook选项(都是默认值)这句话后面有个地址,一会儿写到gitee上
  • 后面生成Gitee WebHook 密码用来给gitee配置
  • 最后勾选上时间戳
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
3 配置gitee,先做这一步,不然不能拉取代码
  1. 点击“管理”,点击“WebHooks”,点击“添加WebHook”
  2. 填写jenkins的URL和密钥,勾选push、激活,点击添加

在这里插入图片描述

在这里插入图片描述

2.3 配置Build

拉取代码

在这里插入图片描述

选择ssh将打包好的jar包发送到生产服务器
在这里插入图片描述

在这里插入图片描述

重新启动jar包脚本

#!/bin/bash


jarName=my-demo1-0.0.1-SNAPSHOT.jar
PID=$(ps -ef | grep  ${jarName} | grep -v grep | awk '{ print $2 }')
 
# -z 字符串 字符串的长度为零则为真
if [ -z "$PID" ]
then
    echo "程序未启动。"
else
    echo "程序在启动中,正在停止..."
    kill -9 $PID
fi
 
 
echo '开启启动程序 ...'

# 这里先刷新一下配置文件,
source /etc/profile

nohup java -jar /app/jar/${jarName} >/app/jar/my-demo1.log 2>&1 &
 
 
echo "starting service..."
sleep 20
 
#根据重启后是否有当前应用判断启动是否成功
endPID=$(ps -ef | grep  ${jarName} | grep -v grep | awk '{ print $2 }')
 
if [ -z "$endPID" ]
then
    echo "程序启动失败。"
else
    echo "程序重启成功...pid:"${endPID}
    
fi

然后启动,查看执行情况在这里插入图片描述
查看执行情况
在这里插入图片描述

如果启动的时候出现这个错误
nohup: failed to run command ‘java’: No such file or directory
就执行一下下面的软连接
ln -s /usr/local/jdk /bin/java

如果遇到这个错误
nohup: failed to run command ‘java’: No such file or directory
就在脚本里面java之前增加source /etc/profile
oracle jdk会有这种情况,而openjdk不会有这种情况。

在这里插入图片描述

去服务器看日志,已经启动成功了
在这里插入图片描述

以下不用看了


【不用看】 CentOS操作系统上安装docker

官网地址https://docs.docker.com/engine/install/centos/

官网推荐用存储库的方式安装,方便后续升级

1 如果之前安装过,先删除docker包
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
2 安装软件包(提供实用程序)
sudo yum install -y yum-utils

安装完成后有Complete!提示

3 设置存储库,这个命令就是换行的,不要设置成一行
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

在这里插入图片描述

4 安装分为直接安装最新版和自定义安装某个版本
  1. 1 安装最新版
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

此命令安装 Docker,但不启动 Docker。它还会创建一个组,但是,默认情况下不会向该组添加任何用户
安装完成后有Complete!提示

  1. 2 查找decker的版本
yum list docker-ce --showduplicates | sort -r

在这里插入图片描述
选择一个版本安装,中间那一列第一个冒号到第一个一个中划线就是版本号,将<VERSION_STRING>替换为版本号执行即可
此命令安装 Docker,但不启动 Docker。它还会创建一个组,但是,默认情况下不会向该组添加任何用户

sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-buildx-plugin docker-compose-plugin
# 替换好版本号的命令
sudo yum install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io docker-buildx-plugin docker-compose-plugin
5 启动docker
sudo systemctl start docker
6 通过运行映像来验证 Docker 引擎安装是否成功。hello-world
sudo docker run hello-world

此命令下载测试映像并在容器中运行它。当 容器运行,它会打印确认消息并退出。

[root@iZ8vb917sZ ~]# sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:4e83453afed1b4fa1a3500525091dbfca6ce1e66903fd4c01ff015dbcb1ba33e
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

【不用看】 用docker安装并启动jenkins

1 创建docker镜像
1.1 去跟目录,创建一个 mydocker文件夹,再创建一个Dockerfile文件
cd /
mkdir mydocker

vim Dockerfile

复制下面的内容到Dockerfile文件

FROM jenkins/jenkins:2.387.2
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
  https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
  https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"

先按esc键
再输入:wq保存文件

1.2 从这个Dockerfile创建一个新的docker镜像,并给这个镜像指定一个有意义的名字,例如: “myjenkins-blueocean: 2.387.2-1”:

注意这里是有个点的.点是在当前目录构建

docker build -t myjenkins-blueocean:2.387.2-1 .

这里大概执行了10分钟,也不知道是不是网络不好
解释:每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写

  • FROM 指定使用哪个镜像源
  • RUN 指令告诉docker 在镜像内执行命令,安装了什么
  • -t 指定要创建的目标镜像名
1.3 查看docker镜像docker images

可以看到刚才创建的hello-world和myjenkins-blueocean
有5个字段

  • REPOSITORY 仓库名字
  • TAG 标签、版本号
  • IMAGE ID 镜像id(同一主机唯一的)
  • CREATED 创建时间,多长时间前
  • SIZE 镜像大小

在这里插入图片描述
还可以通过镜像id更改镜像名字或者标签

docker tag feb5d9fea6a5 my-hello-world:dev

在这里插入图片描述

2 启动 docker容器
2.1 常用参数及解释
docker run \
  --name jenkins-docker \
  --rm \
  --detach \
  --privileged \
  --network jenkins \
  --network-alias docker \
  --env DOCKER_TLS_CERTDIR=/certs \
  --volume jenkins-docker-certs:/certs/client \
  --volume jenkins-data:/var/jenkins_home \
  --publish 2376:2376 \
  docker:dind \
  --storage-driver overlay2
  • name(可选)指定用于运行镜像的Docker容器名称。 默认情况下,Docker会为容器生成一个唯一的名称。
  • rm(可选)关闭Docker容器(Docker镜像的实例)时会自动移除。
  • detach (可选)在后台运行Docker容器。 以后可以通过命令docker stop jenkins-docker来停止这个实例。
  • privileged 在Docker中运行Docker目前需要特权访问才能正常工作。 对于较新的Linux内核版本,这一要求可能会放宽。
  • network 这与前面步骤中创建的网络相对应。
  • network-alias 使Docker容器中的Docker作为主机名在jenkins网络中可用。
  • env 启用在Docker服务器中使用TLS。 由于使用了特权容器,所以建议这样做,尽管它需要使用下面描述的共享卷。 该环境变量控制管理Docker TLS证书的根目录。
  • volume 将容器内的/certs/client目录映射到一个名为jenkins-docker-certs的Docker卷。
  • volume 将容器内的/var/jenkins_home目录映射到名为jenkins-data的Docker卷。 这将允许由该Docker容器的Docker守护进程控制的其他Docker容器从Jenkins挂载数据。
  • publish (可选)公开主机的Docker守护进程端口。 这对于在主机上执行docker命令来控制这个内部docker守护进程非常有用。
  • docker:dind映像本身。 该镜像可以在运行前下载,使用命令:docker image pull docker:dind。
  • Docker卷的存储驱动程序。 有关支持的选项,请参阅"Docker存储驱动程序"。
2.2 启动docker

使用Docker network Create命令在Docker中创建网桥网络:

docker network create jenkins

f645900daaf868f162bf60cc7855aacdc6c8c4b0313872dbc6820fbe0589a64b

docker run --name jenkins-blueocean --restart=on-failure --detach \
  --network jenkins --env DOCKER_HOST=tcp://docker:2376 \
  --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 \
  --publish 8080:8080 --publish 50000:50000 \
  --volume jenkins-data:/var/jenkins_home \
  --volume jenkins-docker-certs:/certs/client:ro \
  myjenkins-blueocean:2.387.2-1
2.2 docker查看密钥
# 进入docker内部 访问Jenkins主目录的内容
docker container exec -it jenkins-blueocean bash

将密钥复制到浏览器,点击下一步
在这里插入图片描述

docker exec :在运行的容器中执行命令
docker exec [OPTIONS] 容器名字 COMMAND [ARG…]

OPTIONS说明
-d :分离模式: 在后台运行

-i :即使没有附加也保持STDIN 打开

-t :分配一个伪终端

七 配置环境变量(和本地环境变量类似)

2 建立主机maven目录与jenkins的映射关系jenkins-blueocean是刚才启动jenkinsm名字
docker cp /usr/local/maven jenkins-blueocean:/opt/

在这里插入图片描述

  • 12
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值