开头

承接上一个文章阿里云Ubuntu20.04部署Docker环境若依框架(Vue前后端分离版),在利用Docker部署了前后端的项目后,我希望能更进一步,利用Jenkins配合Docker更进一步简化部署流程,于是整合成一篇文章,本文参考以下文章,部分脚本根据自己的项目有所调整:

阿里云Ubuntu20下安装Jenkins

springBoot集成Jenkins,实现自动化部署

[手把手系列之] Jenkins+Docker自动化部署vue项目

jenkins构建出现permission-denied

Ubuntu的Linux如何将用户加到sudoers中

一、安装Jenkins1、安装JDK
#安装JDK8,依次执行下面的命令
sudo apt update
sudo apt install openjdk-8-jdk
#安装完成后,输入
java -version
#出现如下图版本信息,说明已经安装

docker部署若依验证码无法显示_docker

2、下载Jenkins的deb文件

直接使用Jenkins官网提供的源安装命令,会比较慢,可以直接用wget命令下载deb文件

#命令类似于
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/debian-stable/jenkins_2.249.3_all.deb
3、安装Jenkins
#直接用以下命令安装,会报依赖错误,也可能会报找不到jdk的错误
dpkg -i jenkins_2.249.3_all.deb

docker部署若依验证码无法显示_Jenkins_02

可通过以下命令解决依赖问题,重新安装:

#解决依赖问题(据说下面这个命令得跟在上面install失败的命令后面执行,也就是先install报错了,再输入这个命令解决问题,大概是有关联关系吧)
sudo apt-get -f -y install
#解决JDK找不到的问题(刚开始用JDK11就出现JDK找不到的问题,建立软链接"ln -s <java文件安装路径> <Jenkins扫描java文件的路径>"),
ln -s /usr/local/lib/java/jdk-11.0.9/bin/java /usr/bin/java
#使用下面这个命令可以看到Java文件安装路径
type -p java
#重新安装
dpkg -i jenkins_2.249.3_all.deb

docker部署若依验证码无法显示_Jenkins_03

4、修改端口

我的配置文件路径是 /etc/default/jenkins,找到HTTP_PORT,修改端口

#Jenkins端口默认8080,这里改成8082不跟其他项目冲突
HTTP_PORT=8082
5、一些相关命令
#启动Jenkins
systemctl start jenkins
#关闭Jenkins
systemctl stop jenkins
#重启Jenkins
systemctl restart jenkins
#查看Jenkins状态
systemctl status jenkins
6、修改update源

(1)修改/var/lib/jenkins/hudson.model.UpdateCenter.xml文件

<url>http://mirror.xmission.com/jenkins/updates/update-center.json</url>

(2)修改/var/lib/jenkins/updates/default.json

把所有
https://updates.jenkins.io/download
替换成
https://mirrors.tuna.tsinghua.edu.cn/jenkins
记得改完后拿个链接在浏览器上试试能不能下载
二、安装maven
sudo apt update
sudo apt install maven #安装maven,默认安装路径为/usr/share/maven

添加maven环境配置,在/etc/profile.d文件夹下新建配置文件maven.sh

vim /etc/profile.d/maven.sh

maven.sh内容如下:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 
export M2_HOME=/usr/share/maven
export MAVEN_HOME=/usr/share/maven
export PATH=${M2_HOME}/bin:${PATH}
  1. 加载环境配置
source /etc/profile.d/maven.sh
  1. maven本地仓库初始化,在用户家目录下会生成一个.m2的文件夹
sudo mvn help:system
  1. 拷贝setting.xml到.m2文件夹下
cd ~/.m2
cp ${MAVEN_HOME}/conf/settings.xml .
  1. 修改settings.xml文件,配置阿里源
sudo vim settings.xml
<mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
</mirror>
  1. 测试
mvn -v

三、启动Jenkins

浏览器中输入ip+端口号就可以访问了会看到这样:

docker部署若依验证码无法显示_maven_04

按照步骤操作

docker部署若依验证码无法显示_docker部署若依验证码无法显示_05

失败不要紧,重试就好

docker部署若依验证码无法显示_maven_06

四、Jenkins部署前端项目

点击系统管理

docker部署若依验证码无法显示_Jenkins_07

docker部署若依验证码无法显示_Jenkins_08

docker部署若依验证码无法显示_docker_09

docker部署若依验证码无法显示_Jenkins_10

等待安装好

选择安装nodejs版本,我自己选的是12的最后一个版本,大家选自己喜欢的就好了,但是最好不要低于12

docker部署若依验证码无法显示_Jenkins_11

docker部署若依验证码无法显示_Jenkins_12

docker部署若依验证码无法显示_Jenkins_13

docker部署若依验证码无法显示_docker_14

准备一个vue项目,并上传至码云或GitHub

新建任务

docker部署若依验证码无法显示_maven_15

这里我取的名字是前端项目,和原文不太一样,和后面的脚本有关系

docker部署若依验证码无法显示_docker_16

docker部署若依验证码无法显示_Jenkins_17

docker部署若依验证码无法显示_maven_18

docker部署若依验证码无法显示_Jenkins_19

我自己的Shell脚本:

echo $PATH
node -v
npm -v
npm install
npm run build:prod
echo '打包成功'
rm -r /home/fronted/dist/
cp -r /var/lib/jenkins/workspace/前端项目/dist/. /home/fronted/dist
echo '配置Docker镜像'
docker stop fronted
docker rm fronted
docker rmi fronted
cd /home/fronted/
docker build -t fronted .
docker run -d -p 80:80 -v /home/ruoyi/uploadPath:/home/ruoyi/uploadPath --name fronted fronted
echo '部署镜像成功'

上面的脚本大致流程就是拉去后进行build操作,打包好后删除原有目录的文件,将打包好的复制过去,然后提供Dockerfile文件进行打包容器

Dockerfile:

FROM nginx
USER root
ADD default.conf /etc/nginx/conf.d
ADD dist /usr/share/nginx/html/
RUN chmod 775 -R /usr/share/nginx/html
expose 80

default.conf

server {
        listen       80;
        server_name  IP;	# 可以用服务器ip代替
        
        location / {
            root   /usr/share/nginx/html/;
            index  index.html index.htm index login;
        }
        location /prod-api/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://IP:PORT/;		# 可以用服务器ip代替
        }
        # 这个是我自己部署的图片静态资源,可以不加
        location /profile {
            alias   /home/ruoyi/uploadPath;
            autoindex on;
        }
     }

构建项目

点击立即构建

docker部署若依验证码无法显示_docker部署若依验证码无法显示_20

等待部署

点击这个小圆可以看控制台输出

docker部署若依验证码无法显示_Jenkins_21

docker部署若依验证码无法显示_maven_22

部署成功就可以访问了

五、Jenkins部署后端项目

进入Jenkins后,添加任务

docker部署若依验证码无法显示_maven_23

选取maven项目,如果没有maven项目的话,可以去插件管理中去下载,在集成这部分前,服务器上要安装好git,maven,git版本最好大于1.7,以及jdk,然后在Jenkins中的全局工具配置中配置jdk以及maven的路径,我的路径是在/usr/lib/jvm下,可以参考ubuntu下查找jdk安装位置这篇文章进行查找,如果你和我的系统JDK版本都一样就在差不多的位置了

docker部署若依验证码无法显示_docker_24

创建完任务后:进入任务配置

docker部署若依验证码无法显示_docker_25

docker部署若依验证码无法显示_maven_26

docker部署若依验证码无法显示_docker_27

docker部署若依验证码无法显示_Jenkins_28

Jenkins将代码从你配的分支上拉下来,然后copy到指定执行的文件夹内,然后执行启动,shell脚本,这里是我的Shell脚本,根据之前一篇文章构建的阿里云Ubuntu20.04部署Docker环境若依框架(Vue前后端分离版):

Shell

echo '打包成功,开始复制文件'
rm -r /home/ruoyi/ruoyi-admin.jar
cp -r /var/lib/jenkins/workspace/后端项目/ruoyi-admin/target/ruoyi-admin.jar /home/ruoyi
echo '构建镜像'
docker stop backend
docker rm backend
docker rmi backend
cd /home/ruoyi/
docker build -t backend .
docker run -d -p 8080:8080 -v /home/ruoyi/uploadPath:/home/ruoyi/uploadPath --name backend backend
echo '构建成功'

大致意思就是删除旧的构建,将Jenkins打包好的jar文件复制到指定的位置,这个后端项目是我的Jenkins的项目名称,每个人的都不一样,然后使用Dockerfile构建镜像并运行

最后保存这个配置

最后一步,点击立即构建即可

六、一些问题

遇到jenkins构建出现permission-denied

1.修改jenkins的用户与组

cd /var/lib
chown -R root:root jenkins
# 重启jenkins服务
service jenkins restart

2.将Jenkins加入sudoers中

查看用户组:cat /etc/group

查看用户:cat /etc/shadow

查看用户所属组:groups 用户名

将用户加到某一个组中:adduser 用户名 组名

创建用户:sudo adduser howe
安装提示输入密码即可;

删除用户:sudo userdel howe

使用visudo将用户加到sudoers中去
只有root用户才能使用visudo,因此先执行sudo su切换到root用户下;
sudo su
visudo
再root ALL=(ALL:ALL) ALL下一行加上对应用户
如howe ALL=(ALL:ALL) ALL
按照提示保存即可;保存的文件名就是/etc/sudoers.tmp

尽量不要去直接修改/etc/sudoers文件
因为/etc/sudoers是只读文件,更改权限(chmod)可能对系统造成影响;

删除某些文件夹下的文件会报权限不足:

切换至root用户,对这个文件夹chmod 777 文件夹就可以了