前端发布接入jenkins

最原始的前端发布,会经过本地打包、压个 zip 包、通过工具手动上传、找到 leader 帮忙解压到对应的服务器上、同步文件服务器等等的步骤。每一个环节都是人工操作,发个版非常的繁琐。接入jenkins有助于我们简化CI/CD流程,实现前端发布自动化。

1. jenkins 安装部署(docker)

1-1 前置条件

安装 gitdocker、配置 ssh

  1. git 安装
    # enter 到底
    yum install -y git
    # 查看git版本号 验证git安装成功
    # git version 1.8.3.1
    git --version
  2. docker 安装
    # docker-ce                             Docker社区版
    # docker-ce-cli                     Docker命令行界面(CLI)
    # containerd.io                     Docker插件,直接调用 Docker Compose
    # docker-compose-plugin     Docker插件,直接调用 Docker Compose
    yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  3. 配置 ssh
    # Enter到底,最终会生成以下文件
    # /root/.ssh/authorized_keys 允许无密码登录的公钥列表
    # /root/.ssh/id_rsa 私钥文件
    # /root/.ssh/id_rsa.pub 公钥文件  注意该文件里的内容是接下来要用的
    ssh-keygen -t rsa -C "root"
    # 复制公钥文件的内容,添加到GitHub 的 SSH keys 或 任意其他远程仓库
    vim /root/.ssh/id_rsa.pub

1-2 jenkins 安装

docker 拉取镜像

# 拉取nginx
docker pull nginx
# 拉取jenkins
docker pull jenkins/jenkins:lts
# 查看镜像是否安装成功
docker images
# REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
# jenkins/jenkins   lts       6a44d1dd2d60   3 weeks ago   468MB
# nginx             latest    53a18edff809   7 weeks ago   192MB

创建 docker 相关目录

# 创建docker的相关目录
mkdir -p ./docker/{compose,jenkins_home,nginx/conf,html/origin/{master,dev}}

# 创建docker-compose.yml配置文件
cd ./docker/compose
# 具体配置内容见下面
touch docker-compose.yml

# 创建nginx.conf配置文件
cd ./docker/nginx/conf
# 具体配置内容见下面
touch nginx.conf

最终目录结构如下

./docker/
├── compose/
│   └── docker-compose.yml  # 空的 docker-compose 配置文件
└── html/
       └── origin/
              ├── master/         # 预留的 master 版本 HTML 目录(为空)
             └── dev/            # 预留的 dev 版本 HTML 目录(为空)
├── jenkins_home/           # Jenkins 数据存储目录(为空)
├── nginx/
│   └── conf/
│          └── nginx.conf      # 空的 Nginx 配置文件

nginx 配置,其中 pamirs 代理的后端地址根据实际情况修改

# nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;

    #这里两个环境使用一个nginx.conf文件,也可以单独分开来
    #master环境
    server {
        #监听的端口
        listen  8001;
        server_name  localhost;
        #设置日志
        #access_log  logs/dev.access.log  main;

        #定位到index.html
           location / {
                #linux下HTML文件夹,就是你的前端项目文件夹
                root  /usr/share/nginx/html/origin/master/dist;
                #root  /home/html/dev/dist;
                #输入网址(server_name:port)后,默认的访问页面
                index  index.html;
                try_files $uri $uri/ /index.html;
           }

            location /pamirs {
                # 根据实际详情修改(后端接口地址)
                proxy_pass http://xxx.xxx.xxx;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    }

    #dev环境
    server {
        #监听的端口
        listen  8002;
        server_name  localhost;
        #设置日志
        #access_log  logs/sit.access.log  main;

        #定位到index.html
           location / {
                #linux下HTML文件夹,就是你的前端项目文件夹
                root  /usr/share/nginx/html/origin/dev/dist;
                #root  /home/html/dev/dist;
                #输入网址(server_name:port)后,默认的访问页面
                index  index.html;
                try_files $uri $uri/ /index.html;
           }

            location /pamirs {
                # 根据实际详情修改(后端接口地址)
                proxy_pass http://xxx.xxx.xxx;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    }

#    include /etc/nginx/conf.d/*.conf;
}

docker-compose 配置

# 新版docker-compose不用写自动引用最新版本
# version: '3'

networks:
  frontend:
    external: true

services:                                      # 容器

  docker_jenkins:
    user: root                                 # root权限
    restart: always                            # 重启方式
    image: jenkins/jenkins:lts                 # 使用的镜像
    container_name: jenkins                    # 容器名称
    environment:
      - TZ=Asia/Shanghai
      - "JENKINS_OPTS=--prefix=/jenkins_home" ## 自定义 jenkins 访问前缀(上下文context)
    ports:                                     # 对外暴露的端口定义
      - 8080:8080
      - 50000:50000
    volumes:                                   # 卷挂载路径
      - ../jenkins_home/:/var/jenkins_home     # 挂载到容器内的jenkins_home目录
      - /usr/local/bin/docker-compose:/usr/local/bin/docker-compose

  docker_nginx_pro:                            # nginx-pro环境
    restart: always
    image: nginx
    container_name: nginx_pro
    ports:
      - 8001:8001
    volumes:
      - ../nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - ../html:/usr/share/nginx/html    # 宿主机./docker/html 映射docker容器内的/usr/share/nginx/html
      - ../nginx/logs:/var/log/nginx

  docker_nginx_dev:                            # nginx-dev环境
    restart: always
    image: nginx
    container_name: nginx_dev
    ports:
      - 8002:8002
    volumes:
      - ../nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - ../html:/usr/share/nginx/html        # 宿主机./docker/html 映射docker容器内的/usr/share/nginx/html
      - ../nginx/logs:/var/log/nginx

1-3 启动 docker

# 启动docker
systemctl start docker
# 启动docker-compose
# 这里我们使用docker-compose.yml配置文件启动,所以不需要另外手动创建容器里,这也是为什么使用docker-compose.yml配置文件的原因
cd /docker/compose/
docker-compose up -d

# 输出以下内容
[+] Building 0.0s (0/0)                       docker:desktop-linux
[+] Running 3/3
Container nginx_pro  Started                               0.1s
Container jenkins    Started                                 0.1s
Container nginx_dev  Started                               0.1s

1-4 检查 nginx 配置

测试 nginx 配置是否正确

# 目录下创建index.html文件
cd ./docker/html/origin/dev/dist
# 黏贴下面的html内容
vim index.html
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <h1>welcome to Nginx</h1>
  </body>
</html>

浏览器打开 localhost:8002 可以看到 welcome to Nginx 页面,证明 nginx 配置正确。

1-5 登录 jenkins web 端

  1. 登录 服务器地址 localhost:8080/jenkins_home 进入jenkins 的web端
  2. 去服务器上 vim ./docker/jenkins_home/secrets/initialAdminPassword 复制初始密码
  3. 回到 jenkins 的 web 端,输入初始密码。
  4. 登录后,安装推荐的插件(不要选择自定义插件)。
  5. 注册管理员账号完成登录

2. jenkins 配置

2-1 安装必要插件

这一步如果插件有报错的话可以尝试重启下容器
dashbord => Manage Jenkins(系统管理) => plugin(插件) => Available plugins

  • Publish Over SSH 配置远程服务器
  • NodeJS 服务端打包
  • Git Parameter 参数化构建

2-2 Publish Over SSH 配置远程服务器

dashbord => Manage Jenkins(系统管理) => 系统配置 => ctrl f Publish over SSH

  1. 找到 SSH Servers 并新增
  2. 填写 name 自定义填写名称(示例:jenkins_node)
  3. 填写 Hostname 服务器ip地址
  4. 填写 Username 服务器登录名称
  5. 填写 Remote Directory 登录后访问的地址
  6. 点击 高级 弹出额外配置
  7. 勾选 Use password authentication, or use a different key。
  8. 出现 Passphrase / Password,输入服务器登录密码
  9. 检查默认 port 是否为22 。一般不用修改
  10. 点击 Test Configuration,显示 success 则 jenkins 配置 SSH 远程服务器成功
  11. 点击 应用按钮 点击 保存按钮

2-3 NodeJs 配置

dashbord => Manage Jenkins(系统管理) => 全局工具配置 => ctrl F NodeJS 安装

  1. 新增 NodeJS
  2. 填写 别名 自定义填写名称,可以照抄下面的版本号
  3. 选择 NodeJS版本,之前已经下载好插件,这里应该自动跳出来的
  4. 点击 应用按钮 点击 保存按钮

前端发布接入jenkins

2-4 凭据配置

dashbord => Manage Jenkins(系统管理) => 凭据管理 => 全局 按钮下拉选择 添加凭据
此处添加 github 仓库和 npm 令牌

  1. 添加 github 仓库

    • 填写 用户名 github用户名
    • 填写 密码 github密码
    • 填写 描述 github 登录凭证
    • 点击 创建 按钮
  2. 添加 npm 令牌

    • 类型选择「Secret text」
    • Secret 字段填入你用于 Nexus 仓库的认证 authToken
    • ID 填写一个易于识别的值,比如:KUNLUN_NPM_TOKEN
    • 点击 创建 按钮
    • tips
      # 登录数式 npm 仓库
      npm login --registry=http://nexus.shushi.pro/repository/kunlun/
      # 查看登录令牌
      cat ~/.npmrc

2-5 创建任务

dashbord => 点击屏幕中间 create a job

  1. 名称填写 你的项目名字(示例:React_PC)
  2. 点击 构建一个自由风格的软件项目
  3. 点击 确定按钮
  4. 点击 github项目 填写项目URL
  5. 源码管理 勾选git
  6. 填写 Repository URL 这里用github仓库的http地址
  7. Credentials 选择之前配置的凭证
  8. 指定分支暂时填写 */dev
  9. 点击 应用按钮 点击 保存按钮
  10. 点击立即构建按钮,观察是否通过

2-6 Github webHooks 配置

github代码仓库 => Settings => Webhooks

填写 Payload URL http://ip:8080/jenkins_home/github-webhook/
选择 Content type application/json
点击 add webbhook 按钮
jenkins => dashbord => 点击之前创建的项目 => 配置

点击 构建触发器
勾选 GitHub hook trigger for GITScm polling

2-7 构建环境

`ctrl f` 构建环境

  1. 点击 构建环境
  2. 勾选「Use secret text(s) or file(s)」→「Add」→ 把 npm 令牌添加成环境变量
  3. 变量填 KUNLUN_NPM_TOKEN,凭据选我们添加的 npm 令牌(ID 是 KUNLUN_NPM_TOKEN)
  4. 勾选 Provide Node & npm bin/ folder to PATH
  5. 选择 我们刚刚配置过的nodejs版本
  6. 点击 应用按钮

2-8 Build Steps

`ctrl f` Build Steps

  1. 增加构建步骤
  2. 选择 Execute NodeJS script
  3. 选择 我们刚刚配置过的nodejs版本
  4. 点击 应用、保存按钮
  5. 构建项目测试目前为止步骤是否正确,并学会手动构建流程

2-9 执行 shell

dashbord => 点击之前创建的项目 => 配置 => ctrl F Build Steps

  1. 增加构建步骤
  2. 选择 执行 shell
  3. 填写下面 bash 指令
  4. 点击 应用、保存按钮
  5. 构建项目测试,控制台输出应该能看到安装成功和构建成功
#!/bin/bash
node -v
npm -v

npm install -g pnpm || { echo "pnpm 安装失败"; exit 1; }
echo "pnpm 安装成功"

echo "" >> .npmrc
echo "//nexus.shushi.pro/repository/kunlun/:_authToken=${KUNLUN_NPM_TOKEN}" >> .npmrc

pnpm install || { echo "依赖安装失败"; exit 1; }
echo "依赖安装成功"

pnpm --filter ss-boot build || { echo "构建失败"; exit 1; }
echo "构建成功"

2-10 自动部署到对应环境

  1. 修改下 bash 指令,打包出 ./dist 后,将 ./dist 压缩
    dashbord => 点击之前创建的项目 => 配置 => ctrl F 执行shell
#!/bin/bash

# 查看信息
echo "当前打包项目 Github 仓库分支:"
echo "GIT_BRANCH" $GIT_BRANCH

node -v
npm -v

npm install -g pnpm || { echo "pnpm 安装失败"; exit 1; }
echo "pnpm 安装成功"

echo "" >> .npmrc
echo "//nexus.shushi.pro/repository/kunlun/:_authToken=${KUNLUN_NPM_TOKEN}" >> .npmrc

pnpm install || { echo "依赖安装失败"; exit 1; }
echo "依赖安装成功"

pnpm --filter ss-boot build || { echo "构建失败"; exit 1; }
echo "构建成功"

cd ./packages/ss-boot
if [ ! -d "./dist" ]; then
    echo "构建未生成 dist 目录"
    exit 1
fi

echo "开始打包..."

rm -rf dist.tar     # 每次构建删除已存在的dist压缩包
tar -zcvf dist.tar ./dist  # 将dist文件压缩成dist.tar
if [ $? -eq 0 ]; then
    echo "打包成功"
else
    echo "打包失败"
    exit 1
fi

echo "构建和打包完成"
echo $PATH

点击应用

  1. 增加构建步骤,将 dist 压缩包通过 ssh 传到服务器上,用 nginx 代理

    • 选择 Send files or execute commands over SSH
    • 填写 服务名称 Name 为 jenkins_node
    • 填写 源文件Source 为 dist.tar
    • 填写 目标路径Remote directory 为 /Users/ember/docker/html/origin/dev (根据实际nginx代理的目录修改)
    • 填写 执行脚本Exec command 如下
      ```shell
      cd /Users/ember/docker/html/origin/dev
      rm -rf dist/
      tar zxvf dist.tar
      rm dist.tar

Oinone社区 作者:银时原创文章,如若转载,请注明出处:https://doc.oinone.top/other/20839.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

(0)
银时的头像银时数式员工
上一篇 2025年5月8日 pm2:03
下一篇 2025年5月15日 am10:40

相关推荐

  • 流程和任务状态说明文档

    一、工作流实例状态说明 INIT:新的流程创建时,执行工作流实例前的状态。 PROCESSING:发起的新的流程之后,结束之前的状态。 FINISHED:整个流程结束后的状态。 ERROR:流程异常时的状态。 RECALL: 撤销流程实例时的状态 CLOSE:关闭流程实例时(流程撤销)的状态。 一、工作流实例通过状态说明 FILLED:流程走到填写节点,填写人填写过后的状态。 PASS:审批同意操作后的状态。 REJECT:审批结果被拒绝(审批节点结束后)的状态。 ING:新的流程创建时,执行工作流实例前的状态。 ERROR:流程异常时的状态。 RECALL:撤销流程实例时的状态。 RECALL_PASS:无 RECALL_REJECT:无 RECALL_FILLED:无 FALLBACK:已退回时标识抄送/工作流实例为已退回时的状态。 FALLBACK_PASS:无 FALLBACK_REJECT:无 FALLBACK_FILLED:无 TRANSFER:无 CLOSE:关闭流程实例时((流程撤销))的状态。

    2025年6月24日
    27700
  • 后端脚手架生成工程

    后端脚手架生成工程 1、使用如下命令来利用项目脚手架生成工程:新建archetype-project-generate.sh 脚本,或者直接下载链接链接:Linux/Unix/Mac下: archetype-project-generate.shWindows: archetype-project-generate.bat archetype-project-generate.sh #!/bin/bash # 项目生成脚手架 # 用于新项目的构建 # 脚手架使用目录 # 本地 local # 本地脚手架信息存储路径 ~/.m2/repository/archetype-catalog.xml archetypeCatalog=local # 以下参数以pamirs-demo为例 # 新项目的groupId groupId=pro.shushi.pamirs.demo # 新项目的artifactId artifactId=pamirs-demo # 新项目的version version=1.0.0-SNAPSHOT # Java包名前缀 packagePrefix=pro.shushi # Java包名后缀 packageSuffix=pamirs.demo # 新项目的pamirs platform version pamirsVersion=6.2.8 # Java类名称前缀 javaClassNamePrefix=Demo # 项目名称 module.displayName projectName=OinoneDemo # 模块 MODULE_MODULE 常量 moduleModule=demo_core # 模块 MODULE_NAME 常量 moduleName=DemoCore # spring.application.name applicationName=pamirs-demo # tomcat server address serverAddress=0.0.0.0 # tomcat server port serverPort=8090 # redis host redisHost=127.0.0.1 # redis port redisPort=6379 # 数据库名 db=demo # zookeeper connect string zkConnectString=127.0.0.1:2181 # zookeeper rootPath zkRootPath=/demo mvn archetype:generate \ -DinteractiveMode=false \ -DarchetypeCatalog=${archetypeCatalog} \ -DarchetypeGroupId=pro.shushi.pamirs.archetype \ -DarchetypeArtifactId=pamirs-project-archetype \ -DarchetypeVersion=6.2.8 \ -DgroupId=${groupId} \ -DartifactId=${artifactId} \ -Dversion=${version} \ -DpamirsVersion=${pamirsVersion} \ -Dpackage=${packagePrefix}.${packageSuffix} \ -DpackagePrefix=${packagePrefix} \ -DpackageSuffix=${packageSuffix} \ -DjavaClassNamePrefix=${javaClassNamePrefix} \ -DprojectName="${projectName}" \ -DmoduleModule=${moduleModule} \ -DmoduleName=${moduleName} \ -DapplicationName=${applicationName} \ -DserverAddress=${serverAddress} \ -DserverPort=${serverPort} \ -DredisHost=${redisHost} \ -DredisPort=${redisPort} \ -Ddb=${db} \ -DzkConnectString=${zkConnectString} \ -DzkRootPath=${zkRootPath} archetype-project-generate.bat @echo off :: 项目生成脚手架 set archetypeCatalog=local set groupId=pro.shushi.pamirs.demo set artifactId=pamirs-demo set version=1.0.0-SNAPSHOT set packagePrefix=pro.shushi set packageSuffix=pamirs.demo set pamirsVersion=6.2.8 set javaClassNamePrefix=Demo set projectName=OinoneDemo set moduleModule=demo_core set moduleName=DemoCore set applicationName=pamirs-demo set serverAddress=0.0.0.0 set serverPort=8090 set redisHost=127.0.0.1 set redisPort=6379 set…

    2025年8月22日
    39300
  • 新人引导文档

    类型 文档链接 入门参考必看 7天入门到精通 Oinone 初级学习路径 Oinone 初级学习路径 平台部署启动 无代码docker启动说明 低代码启动说明 前端环境和启动前端工程 无代码设计器启动方式 后端无代码设计器Jar包启动方法 平台部署及依赖说明 Oinone平台部署及依赖说明(v5.0) 问题排查方法 问题排查工具使用手册 前后端研发帮助文档 前端文档 后端文档 项目开发实践要点 【前端】项目开发前端知识要点地图 【后端】项目开发后端知识要点地图 版本升级说明 版本更新日志 工具包 【附件一】下载说明 许可证使用说明 pamirs-license 许可证使用常见问题 更多文档新人引导建议,可以下方评论

    2024年7月15日
    1.3K00
  • 数式Oinone培训前注意事项

    一、快速上手 (建议至少预习 6 小时) 在正式培训之前,建议需要完成以下任务,以便对培训内容有基本了解: 点击阅读:快速启动入门 该文档为学员提供了从入门到实现 demo 的全过程说明,涵盖了开发工具、框架搭建、常见问题解答等内容 开始培训前,请参与人员确保完成以下任务 阅读并理解文档中的每个步骤。 配置好前后端开发环境。 完成 demo 的基础框架搭建,验证是否能够成功运行。 二、预期成果 通过上述预习,大家完成以下事项:• 成功搭建本地开发环境,并能运行前后端的基本 demo。• 对前后端技术栈有初步了解,为正式培训中的深度学习打下基础,并且提出对应的疑问点 三、其他准备工作 1.技术工具检查:请确在本地已安装并配置好必要的开发工具和环境(如 IDE、Node.js、数据库等);2.参与者反馈:在预习过程中,学员如遇到困难或无法解决的问题(前后端疑问),请提前记录并提交,以便培训期间重点解答;3.版本是否是最新的版本,且建议研发人员版本一致,且类型是 mini; ps:部署包相关信息,联系数式相关人员获取

    未分类 2024年8月2日
    2.3K00
  • 自定义流程设计器审批人公司列表

    打开弹窗时会默认选中返回的第一个公司。 依赖: <dependency> <groupId>pro.shushi.pamirs.workflow</groupId> <artifactId>pamirs-workflow-api</artifactId> </dependency> 只显示所有公司 ALL_COMPANY 表示所有公司。 @Order(10) @Component @SPI.Service public class CustomWorkflowCompanyQueryApi implements WorkflowCompanyQueryApi { @Override public Pagination<PamirsCompany> queryPage(Pagination<PamirsCompany> page, IWrapper<PamirsCompany> queryWrapper) { Pagination<PamirsCompany> pageResult = new Pagination<>(); pageResult.setContent(Lists.newArrayList(ALL_COMPANY)); pageResult.setTotalPages(1); return pageResult; } } 不显示所有公司 @Order(10) @Component @SPI.Service public class CustomWorkflowCompanyQueryApi implements WorkflowCompanyQueryApi { @Override public Pagination<PamirsCompany> queryPage(Pagination<PamirsCompany> page, IWrapper<PamirsCompany> queryWrapper) { return new PamirsCompany().queryPage(page, queryWrapper); } } 仅显示特定公司 @Order(10) @Component @SPI.Service public class CustomWorkflowCompanyQueryApi implements WorkflowCompanyQueryApi { private static final Set<String> COMPANY_CODES = Sets.newHashSet("CH0001", "CH0002"); @Override public Pagination<PamirsCompany> queryPage(Pagination<PamirsCompany> page, IWrapper<PamirsCompany> queryWrapper) { Set<String> companyCodes = Sets.newHashSet("CH0001", "CH0002"); LambdaQueryWrapper<PamirsCompany> query = ((QueryWrapper<PamirsCompany>) queryWrapper).lambda(); query.in(PamirsCompany::getCode, COMPANY_CODES); return new PamirsCompany().queryPage(page, queryWrapper); } }

    2025年9月4日
    59400

Leave a Reply

登录后才能评论