赞
踩
写在前面,遇到的很多错误
本来想用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
硬件最低要求:
小型团队的推荐硬件配置:
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.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.1 在gitee上注册账号,新建仓库
2.2 初始化redme文件
2.3 复制项目地址
拉取gitee项目需要用户名(就是个人主页的红框的名字,没有@符号)密码(就是登录gitee的密码)【这里尽量不要克隆,直接把本地项目推送到gitee就行。克隆下来在把项目复制进去再提交也行】
2.4 在本地电脑上打开git bash here窗口,将项目推送到gitee仓库
git init
git remote add origin 你的用户名gitee项目地址
git pull origin master
git add .
git commit -m "初始化"
git push origin master
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
# 建立仓库位置的文件夹,-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
进入编辑状态,复制粘贴下面的两段配置: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>
如图所示
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
所有版本页面
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也行
cat 页面上的红色路径,密钥的位置可能和大家的不一样
# 查看密钥
cat /var/jenkins_home/secrets/initialAdminPassword
等一会等安装完需要创建用户,也可以直接用admin
配置实例,默认的不用改,点击保存并完成
点击开始使用
然后就进入了jenkins页面
# 查看容器信息
docker ps -a
# 重启容器
# docker restart <容器 ID>
docker restart 5adc6d39e47a
点击 系统管理–插件管理
4.1 安装gitee插件,拉取gitee上面的代码
4.2. 安装maven,打包jar包用
4.3. 安装ssh,将打好的jar包传输到测试、生产服务器
安装完成后选择重启,来刷新插件
点击全局工具配置
/usr/local/maven/conf/setting.xml
jenkins内部已经有jdk了,就不用单独在主机中安装并添加docker映射了
/usr/local/jdk
jenkins内部也有git,就按默认的来
yum install git
到这个地址上创建gitee令牌
https://gitee.com/profile/personal_access_tokens
输入描述,勾选projects、pull_requests点击提交
输入密码验证
将令牌保存下来
点击jenkins的系统配置
找到gitee,先添加令牌,选择Gitee API 令牌,粘贴上面的令牌,点击添加然后下拉框选择刚才创建的令牌
添加项目地址,和令牌(此文档的jenkins版本不允许直接写gitee的用户名和密码)
Linux创建用户和组的基础教程https://www.runoob.com/linux/linux-user-manage.html
# 创建用户
useradd zhangsan
# 修改密码,需要输入两次,而且为了保密,是看不见的,不是键盘坏了
passwd zhangsan
# 查看用户关系,最后一行有刚才创建的zhangsan
cat /etc/passwd
默认/home/zhangsan目录可以使用,这里就不赋权限了,截图是我已经创建zhangsan了,就再创建一个lisi
# 编辑ssh配置
vim /etc/ssh/sshd_config
# 输入/Pass,点击n键查找,找到将PasswordAuthentication no改为yes,然保存
# 重启ssh
service sshd restart
输入基本信息,这里使用密码验证,建议使用令牌(后面再试验)
点击测试,出现success代表正确,然保存
我出现的问题说一下,使用阿里云服务器默认不允许使用账号密码远程连接服务器,我先打开运行这样做
# 编辑ssh配置
vim /etc/ssh/sshd_config
# 输入/Pass,点击n键查找,找到将PasswordAuthentication no改为yes,然保存
# 重启ssh
service sshd restart
令牌是前面配置好的
这句话后面有个地址,一会儿写到gitee上
拉取代码
选择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不会有这种情况。
去服务器看日志,已经启动成功了
以下不用看了
官网地址https://docs.docker.com/engine/install/centos/
官网推荐用存储库的方式安装,方便后续升级
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
sudo yum install -y yum-utils
安装完成后有Complete!提示
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
此命令安装 Docker,但不启动 Docker。它还会创建一个组,但是,默认情况下不会向该组添加任何用户
安装完成后有Complete!提示
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
sudo systemctl start docker
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/
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
保存文件
注意这里是有个点的.
点是在当前目录构建
docker build -t myjenkins-blueocean:2.387.2-1 .
这里大概执行了10分钟,也不知道是不是网络不好
解释:每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写
docker images
可以看到刚才创建的hello-world和myjenkins-blueocean
有5个字段
还可以通过镜像id更改镜像名字或者标签
docker tag feb5d9fea6a5 my-hello-world:dev
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
使用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
# 进入docker内部 访问Jenkins主目录的内容
docker container exec -it jenkins-blueocean bash
将密钥复制到浏览器,点击下一步
docker exec :在运行的容器中执行命令
docker exec [OPTIONS] 容器名字 COMMAND [ARG…]
OPTIONS说明
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
jenkins-blueocean
是刚才启动jenkinsm名字docker cp /usr/local/maven jenkins-blueocean:/opt/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。