写在前面,遇到的很多错误
本来想用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: 8081servlet: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仓库
- 初始化git
git init
- 关联远程仓库
git remote add origin 你的用户名gitee项目地址
- 拉取远程仓库代码
git pull origin master
- 将spring boot项目添加git版本控制
git add .
- 提交到本地git仓库
git commit -m "初始化"
- 推送到远程仓库gitee
git 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.gztar -zxvf jdk-17_linux-x64_bin.tar.gzmv jdk-17.0.7/ /usr/local/jdkvim /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 gitgit --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 jenkinswget 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,先做这一步,不然不能拉取代码
- 点击“管理”,点击“WebHooks”,点击“添加WebHook”
- 填写jenkins的URL和密钥,勾选push、激活,点击添加
2.3 配置Build
拉取代码
选择ssh将打包好的jar包发送到生产服务器
重新启动jar包脚本
#!/bin/bashjarName=my-demo1-0.0.1-SNAPSHOT.jar
PID=$(ps -ef | grep ${jarName} | grep -v grep | awk '{ print $2 }')# -z 字符串 字符串的长度为零则为真
if [ -z "$PID" ]
thenecho "程序未启动。"
elseecho "程序在启动中,正在停止..."kill -9 $PID
fiecho '开启启动程序 ...'# 这里先刷新一下配置文件,
source /etc/profilenohup 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" ]
thenecho "程序启动失败。"
elseecho "程序重启成功...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 安装最新版
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
此命令安装 Docker,但不启动 Docker。它还会创建一个组,但是,默认情况下不会向该组添加任何用户
安装完成后有Complete!提示
- 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:latestHello 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 theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare 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 mydockervim 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/