Docker安装jenkins并实现自动化部署

1.安装Jenkins

  1. 拉取docker镜像
docker pull jenkins/jenkins:2.441
  1. 启动jenkins容器

    1. 创建jenkins挂载目录

      mkdir -p /var/jenkins_home
    2. 修改挂载目录权限

      chmod 777 /var/jenkins_home
docker run -d --restart=always -p 18080:8080 -p 18081:50000 \
-v /var/jenkins_home:/var/jenkins_home \
-v /etc/localtime:/etc/localtime \
--user=root \
--name jenkins \
jenkins/jenkins:2.441
  1. 访问主机IP+18080端口,根据提示获得管理员登录密码

image-20240121203810077

  1. 在宿主机的挂载目录中查看密码
cat /var/jenkins_home/secrets/initialAdminPassword

image-20240121203828695

  1. 安装插件

image-20240123010106294

  1. 添加管理员信息

image-20240123010657908

  1. 安装后重启使汉化插件生效

2.公钥私钥配置

2.1公钥配置

这一步的目的是为了实现Jenkins容器和github实现SSH免密连接,为后续的itemgit源码管理做准备。

需要注意的是,jenkins容器内部默认已经存在Git环境:

image-20240123114500934

  1. 在jenkins容器内部使docker用以下命令在/root/.ssh目录下生成公钥和私钥文件:
ssh-keygen -t rsa

image-20240123114808179

  1. 复制公钥文件内容
cat /root/.ssh/id_rsa.pub

在github中点击setting,添加SSH Key

image-20221028231950098

image-20221028232154790

SSH添加成功:

image-20221028232139791

  1. 测试ssh连接:
ssh -T git@github.com
  1. 如果此时报错,报错为ssh连接超时(22端口),,那可以使用443端口:

image-20240123012250509

  1. 使用以下命令在容器内部安装vim命令:
apt-get update
apt-get -y install vim
  1. 在/root/.ssh目录下创建一个config文件
vim config
  1. 写入以下内容:
Host github.com
Hostname ssh.github.com
Port 443

image-20240123014754409

  1. 再次测试ssh免密连接:
ssh -T git@github.com

​ 显示成功验证:

image-20240123014944581

  1. 尝试使用ssh免密连接的方式克隆项目:

image-20240123015136274

2.2私钥配置

私钥的作用是作为jenkins拉取远程仓库的凭证

  1. 进入到jenkins点击凭据管理:

image-20240123115446078

  1. 添加新的全局凭据

    将Jenkins容器中/root/.ssh目录下的私钥文件id_rsa内部复制下来,填入到下属私钥的位置:

    cat /root/.ssh/id_rsa

    image-20240123115901494

image-20240123115946303

3.Jenkins配置

3.1配置Publish over SSH

Publish over SSH插件的作用是将Jenkins打包好的文件发送大宿主机的指定目录下

  1. 创建项目目录
mkdir -p /data/music-community-web
  1. 安装Publish over SSH插件

image-20240124002345586

  1. 配置Publish over SSH插件

进入到系统配置

image-20240124002917407

​ 找到Publish over SSH下的SSH Server点击新增,并填写如下配置信息:

image-20240125235241873

  1. 点击下方的测试按钮进行测试,出现Success表示成功连接到服务器

image-20240125212221411

3.2配置Node.js

  1. 安装node.js插件

image-20240125214433576

  1. 在全局工具配置中找到NodeJS安装并配置自动安装

image-20240125214725945

  1. 重启jenkins容器
docker restart 容器ID
  1. 先创建一个测试项目(目的是为了安装上node.js插件)

image-20240125221145865

  1. 配置源码管理

image-20240125221449145

  1. 配置构建环境

image-20240125221700897

  1. Build Steps选择执行shell,查看node版本

image-20240125225112022

  1. 点击保存,并点击立即构建

image-20240125221522571

  1. 查看控制台信息,显示安装成功

image-20240125225251929

  1. 进入到容器内部,打开环境配置文件
docker exec -it 容器ID bash
vim /etc/profile    
  1. 在profile文件中添加以下内容
export PATH=$PATH:/var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/nodejs/bin

image-20240123132240135

  1. 刷新profile文件,并测试
source /etc/profile
node -v 

image-20240125230124928

3.3配置Maven

  1. 安装Maven插件

image-20240125211907359

  1. 选择全局工具配置

image-20240125212518847

  1. 选择版本自动安装

image-20240125212551859

3.4配置GitHub服务器

这一步的目的是为了连接github,并配置webhook-token

  1. 在自己的github账户中找到 Settings -> Developer Settings -> Token(classic)

image-20240125213219088

  1. 生成webhook-token

image-20240125213418014

  1. 将token复制下来

image-20240125213505693

  1. 在jenkins中点击凭据管理,添加全局凭据

image-20240125213647171

  1. 在系统配置里找到Github服务器

image-20240125214000098

4.自动化部署Vue项目

  1. 在本机准备好nginx镜像
docker pull nginx:1.18.0

image-20240125233216014

  1. 在Vue项目的根目录下创建Dockerfile文件和nginx的配置文件default.conf,文件内容如下

Dockerfile:

# 依赖的基础镜像
FROM nginx:1.18.0
# 定义作者
MAINTAINER  xuhuaiang
# 删除容器中默认的Nginx配置文件
RUN rm /etc/nginx/conf.d/default.conf
# 将宿主机的Nginx配置文件复制到容器中
ADD default.conf /etc/nginx/conf.d
# 将宿主机的打包好的前端文件复制到容器中
COPY dist /usr/share/nginx/html/

default.conf

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

image-20240125233517960

  1. 创建一个自由风格的项目

image-20240125232652550

  1. 配置源码管理

image-20240125221449145

  1. 构建触发器

    选择Github的hook(就是刚刚配置的webhook)

image-20240125233846709

  1. 构建环境

image-20240125221700897

  1. Build Steps选择执行shell

第一种情况将文件(文件夹)发送到和jenkins容器在同一台的服务器

npm cache clean -f #清除npm的缓存
cd /var/jenkins_home/workspace/music-community-web #切换到项目目录
npm config set registry https://registry.npmmirror.com
npm config get registry
npm update #更新项目的依赖项到最新版本
npm install #安装项目的依赖项 
export NODE_OPTIONS=--openssl-legacy-provider #设置环境变量,使用openssl的legacy提供程序,适用于高版本的nodejs
npm run build #打包
echo "打包完成"
cd dist 
rm -rf dist.tar.gz #移除上次打的压缩包
tar -czvf dist.tar.gz *  #把dist目录下的文件全部打成压缩包

第二种情况将文件(文件夹)发送到和jenkins容器在不同一台的服务器

经过实现,创建多个Transet会出现SSH连接错误。

最终的解决方案是在dist打包之前,将Dockerfiledefault.conf也打包进去,然后在构建后操作中再移动出来。

image-20240127163645368

npm cache clean -f #清除npm的缓存
cd /var/jenkins_home/workspace/music-community-web #切换到项目目录
npm config set registry https://registry.npmmirror.com
npm config get registry
npm update #更新项目的依赖项到最新版本
npm install #安装项目的依赖项 
export NODE_OPTIONS=--openssl-legacy-provider #设置环境变量,使用openssl的legacy提供程序,适用于高版本的nodejs
npm run build #打包
echo "打包完成"
cp Dockerfile dist #将Dockerfile文件移动到dist目录下
cp default.conf dist #将default.conf文件移动到dist目录下
cd dist 
rm -rf dist.tar.gz #移除上次打的压缩包
tar -czvf dist.tar.gz *  #把dist目录下的文件全部打成压缩包
  1. 构建后操作

第一种情况将文件(文件夹)发送到和jenkins容器在同一台的服务器

image-20240126234551112

cd /data/music-community-web
rm -rf Dockerfile #删除先前的Dockerfile文件
rm -rf dist  #删除先前的dist文件
rm -rf default.conf #删除先前的default.conf文件
docker rm -f music-community-web # 删除宿主机的music-community-web容器
docker rmi -f music-community-web:1.0 # 删除宿主机的music-community-web:1.0镜像
cp /var/jenkins_home/workspace/music-community-web/Dockerfile /data/music-community-web #将Dockerfile文件移动到项目目录下
cp /var/jenkins_home/workspace/music-community-web/default.conf /data/music-community-web #将default.conf文件移动到项目目录下
mkdir dist #创建存放前端文件的目录
tar -zxvf dist.tar.gz -C dist 
rm -rf dist.tar.gz
docker build -t music-community-web:1.0 .  #构建镜像
docker run -d -p 20001:80 --restart=always  --name music-community-web music-community-web:1.0 #根据镜像创建容器

第二种情况将文件(文件夹)发送到和jenkins容器在不同一台的服务器

经过实现,创建多个Transet会出现SSH连接错误。

最终的解决方案是在dist打包之前,将Dockerfiledefault.conf也打包进去,然后在构建后操作中再移动出来。

image-20240127163744500

cd /data/music-community-web
rm -rf Dockerfile #删除先前的Dockerfile文件
rm -rf dist  #删除先前的dist文件
rm -rf default.conf #删除先前的default.conf文件
docker rm -f music-community-web # 删除宿主机的music-community-web容器
docker rmi -f music-community-web:1.0 # 删除宿主机的music-community-web:1.0镜像
mkdir dist #创建存放前端文件的目录
tar -zxvf dist.tar.gz -C dist 
rm -rf dist.tar.gz
mv ./dist/Dockerfile ./ #将Dockerfile文件移动到项目目录下
cp ./dist/default.conf ./ #将default.conf文件移动到项目目录下
docker build -t music-community-web:1.0 .  #构建镜像
docker run -d -p 20001:80 --restart=always  --name music-community-web music-community-web:1.0 #根据镜像创建容器
  1. 配置完成后点击保存
  2. 在项目中push代码到远程仓库,webhook会监听推送事件,Jenkins从github中拉取代码

image-20240126130855901

  1. 查看控制台信息,构建成功

image-20240125235518197

  1. 访问项目地址

image-20240126133800285


Docker安装jenkins并实现自动化部署
https://xhablog.online/2024/01/26/Docker安装Jenkins并实现自动化部署/
作者
Xu huaiang
发布于
2024年1月26日
许可协议