gitlab+jenkins 实现前端项目打包成 docker 镜像;gitlab部署就不赘述了;因部署的gitlab版本的webhooks有问题,无法进行配置,所以文章的构建是手动触发的。并且nodejs部署应该也能跟docker一样直接安装进jenkins的镜像(但是多版本可能就有其他问题)。

Jenkins 镜像准备

拉取 jenkins 镜像
docker pull jenkins/jenkins:2.414.3-jdk17
  • 在镜像里面安装 docker
    • 在空文件下新建一个 Dockerfile 文件

      FROM jenkins/jenkins:2.414.3-jdk17
      USER root
      # 安装 Docker CLI(注意不装 daemon)
      RUN apt-get update && apt-get install -y docker.io
      USER jenkins
      
    • 构建包含 docker 的镜像,并导出

      docker build -t jenkins-with-docker:2.414.3-jdk17 .
      docker save jenkins-with-docker:2.414.3-jdk17 | gzip > jenkins-with-docker.tar.gz
      

联网环境下先运行官方 jenkins 容器(下载插件和工具环境)

  • 启动容器

    docker run -d --name jenkins -p 8928:8080 jenkins/jenkins:2.414.3-jdk17
    
  • 密码获取

    docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
    
  • 安装插件
    选择常用的插件,Nodejs、Git、Docker、Docker Pipeline 等。按需安装。(本想使用pipeline脚本,结果没用上,直接使用shell了)

  • 安装 node(这里使用 jenkins 自动下载;也可以手动部署到 jenkins 容器里)

    • 在管理页面的 Tools 里,添加 nodejs
      image

    • 回到首页新建一个自由风格的项目

      • 环境选择新建的 node 版本
        image

      • 构建步骤添加一个 shell
        image

      • 立即构建,执行完出现 node 和 npm 版本就成功了

  • plugin 和 tools 打包
    进入容器将/var/jenkins_home 路径下的 plugins 和 tools 都打成 tar 包(软链接不会丢失)
    本人使用 windows 系统,故直接在 docker-desktop 进入容器后下载两个文件夹在打包(npm 软链接丢失了)

离线环境内部署 jenkins

使用前面二次打包的镜像

  • docker-compose.yml

    version: "3"
    services:
    jenkins:image: jenkins-with-docker:2.414.3-jdk17container_name: jenkinsrestart: unless-stoppeduser: "1000:994"ports:- "8928:8080"- "50000:50000"volumes:- /home/opt/jenkins_home:/var/jenkins_home- /var/run/docker.sock:/var/run/docker.sockenvironment:- JAVA_OPTS=-Xmx1024mdeploy:resources:limits:memory: 2Gsecurity_opt:- seccomp:unconfined
    

    /var/run/docker.sock:/var/run/docker.sock为可以在 jenkins 里执行 docker 语句的关键,它可以链接 jenkins 宿主机的 docker,构建时可以拉取宿主机存在的镜像,并且打包后的镜像也会存在宿主机

  • 离线环境里启动 jenkins

    docker-compose up -d
    
  • 初始化后设置密码,参照前面

  • 将 plugins、tools 释放到/home/opt/jenkins_home 下

    # 将在线环境的plugins拷贝进离线环境后,需执行授权
    docker exec -u root jenkins chown -R 1000:1000 /var/jenkins_home/plugins# 离线环境手动添加的nodejs,没有权限,先执行查看权限是否有x(-rw-r--r--),没有继续执行下面的内容
    ls -l /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/18.20.7/bin/node
    # 给node添加x权限
    chmod +x /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/18.20.7/bin/node# 将联网环境下载的nodejs,在tools文件夹下,直接拷贝npm、npx的软件链接会丢失要重新指定(打tar包好像可以保留软链接),下一句修复软链接
    ln -sf /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/18.20.7/lib/node_modules/npm/bin/npm-cli.js /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/18.20.7/bin/npm
    # 给npm添加x权限
    chmod +x /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/18.20.7/bin/npm
    
    • 配置nodejs版本,指定安装位置
      image
  • 准备完毕后,前端项目的 node_modules 也需要做缓存

    # 会在项目根路径生成.npm文件夹
    npm install --cache .npm# 将.npm打tar包
    tar -czvf .npm.tar.gz ./.npm
    

构建前端部署镜像

  • 在内网jenkins首页新建一个自由风格的项目

    • 配置gitlab
      image

    • 配置nodejs
      image

    • 构建步骤
      image

      cd /var/jenkins_home/workspace/test #进入Jenkins工作空间下test项目目录
      node -v #检测node版本(此条命令非必要)
      npm -v #检测npm版本(此条命令非必要)
      # 从.npm安装node_modules
      npm install --offline --cache .npm
      # vite命令需要权限
      chmod +x ./node_modules/.bin/*# 内存不足会打包失败
      NODE_OPTIONS="--max-old-space-size=4096" npm run build:prod
      #项目根目录有Dockerfile
      docker build -t frontend .
      
  • 构建
    在构建之前,需要将前面打包的.npm.tar.gz拷贝进/var/jenkins_home/workspace/test,test是jenkins项目名称,

# 解压
tar -xzvf .npm.tar.gz ./.npm

在项目页点击立即构建,等待结果即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84776.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84776.shtml
英文地址,请注明出处:http://en.pswp.cn/web/84776.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

案例:塔能科技×某市智能照明——从传统亮化到智慧光生态的跨越

在城市发展的滚滚浪潮中,市政照明不仅是驱散黑夜的光明使者,更是衡量城市智能化水平的关键标尺。贵州某市的城市照明系统正经历一场意义深远的革新,塔能科技以创新科技为核心驱动力,为这座城市的夜间照明生态注入全新活力。通过智…

LeapMotion-HandPoseRecorder 脚本详解

HandPoseRecorder 脚本详解 这个脚本是一个用于在 Unity 中录制和保存 Leap Motion 手部姿势的工具。下面我将详细解释脚本的各个部分: 核心功能 该脚本的主要作用是: 从 Leap Motion 设备捕获当前手部姿势数据 将姿势数据序列化为可重用的 ScriptableObject 在 Unity 项目…

【Guava】0.做自己的编程语言

【Guava】0.做自己的编程语言 0.前言1.明确你的目标1.2.设计1.3.写一个介绍 2.开始吧! 0.前言 DO WHAT THE F**K YOU WANT TO DO 我相信,网上有许多各式各样的做自己的编程语言教程,but 都是这样 收费 shit 本教程教你真正教你实现一个名叫G…

【软考高级系统架构论文】论无服务器架构及其应用

论文真题 近年来,随着信息技术的迅猛发展和 应用需求的快速更迭,传统的多层企业应用系统架构面临越来越多的挑战,已经难以适应这种变化。在这一背景下,无服务器架构(Serverless Architecture) 逐渐流行,它强调业务逻辑…

国产MCU A\B SWAP原理及实操

看到有读者留言说还是没理清A\B SWAP的原理。 今天就以某国产MCU为例,实际演示一番,看看大家在芯片设计时思路是什么。 我们首先回顾下SWAP的基本思想。 SWAP的基本思想是将PFLASH分成两组Bank,Bank A(假设是active)和Bank B(假设是inacti…

目标检测neck经典算法之FPN的源码实现

┌────────────────────────────────────────────────────┐│ 初始化构造 (__init__) │└─────────────────────────────────────────────…

extern关键字:C/C++跨文件编程利器

在 C 和 C 中,extern 是一个关键字,用于声明变量或函数是在其他文件中定义的。它主要用于实现多个源文件之间的符号共享。 目录 📌 一、C语言中的 extern 1. 基本作用 2. 示例说明 定义全局变量(只在一个 .c 文件中&#xff…

编程语言的演化与选择:技术浪潮中的理性决策

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:为什么“选对语言”比“掌握语言”更重要? 在软件开发的世界里,语言是一切的基础。…

【StarRocks系列】StarRocks vs Mysql

目录 StarRocks 简介 核心特性 典型应用场景 StarRocks vs MySQL:核心区别详解 关键差异总结 如何选择? StarRocks 简介 StarRocks 是一款高性能、全场景、分布式、实时分析型的数据库(MPP - 大规模并行处理)。它诞生于解决…

Axios 知识点全面总结

文章目录 Axios 知识点全面总结一、Axios 基础概念1. 什么是 Axios?2. 核心特性 二、安装与基本用法1. 安装2. 基本请求示例 三、请求方法与参数四、请求配置选项(config)五、拦截器(Interceptors)六、错误处理七、取消…

【软考高级系统架构论文】论 SOA 在企业集成架构设计中的应用

论文真题 企业应用集成(Enterprise Application Integration, EAI)是每个企业都必须要面对的实际问题。面向服务的企业应用集成是一种基于面向服务体系结构(Service - Oriented Architecture, SOA)的新型企业应用集成技术,强调将企业和组织内部的资源和业务功能暴露为服务,实…

springboot 提供的可扩展接口

一、spring 和 springboot Spring框架提供了全面的基础架构支持。包含依赖注入和开箱即用等模块,如:Spring JDBC 、Spring MVC 、Spring Security、 Spring AOP 、Spring ORM 、Spring Test Spring Boot 约定大于配置-----消除了设置Spring应用程序所需…

python学习打卡day55

DAY 55 序列预测任务介绍 知识点回顾 序列预测介绍 单步预测多步预测的2种方式 序列数据的处理:滑动窗口多输入多输出任务的思路经典机器学习在序列任务上的劣势;以随机森林为例 作业:手动构造类似的数据集(如cosx数据&#xff09…

Leetcode hot100 Java刷题

文章目录 快排146. LRU 缓存acm模式树的前中后序遍历acm模式链表的基本操作1. 两数之和49. 字母异位词分组128. 最长连续序列283. 移动零11. 盛最多水的容器15. 三数之和42. 接雨水53. 最大子数组和56. 合并区间73. 矩阵置零48. 旋转图像141. 环形链表142. 环形链表 II24. 两两…

Linux 命令详解 —— 进程管理

文章目录 精通Linux操作系统(以Centos7为例)进程管理ps常用组合进程状态 STAT 详解高级筛选与格式化输出按条件过滤进程自定义输出字段显示进程树关系排障场景定位高 CPU检查僵尸进程查看进程的线程查看进程打开的文件/网络连接常用组合速查top前5摘要区进程列表信息交互式命令…

【软考高级系统架构论文】论湖仓一体架构及其应用

论文真题: 随着5G、大数据、人工智能、物联网等技术的不断成熟,各行各业的业务场景日益复杂,企业数据呈现出大规模、多样性的特点,特别是非结构化数据呈现出爆发式增长趋势。在这一背景下,企业数据管理不再局限于传统…

Docker 高级管理笔记

前言:Docker 高级管理概述 随着 Docker 技术的广泛应用,容器化已成为现代软件开发与部署的核心方式。本笔记聚焦 Docker 高级管理中的两大关键技术 —— 容器通信与数据持久化,深入解析 Docker 网络模式、端口映射、容器互联机制及数据卷管理…

Spring Boot 项目初始化

一、什么是 CommandLineRunner CommandLineRunner 是 Spring Boot 提供的一个 函数式接口,声明如下: 该接口只有一个 run(String... args) 方法,会在 Spring Boot 容器启动完成后被自动调用。 你可以将它理解为一种“钩子函数”,…

C# winform教程(二)----ComboBox

一、作用 一个可以输入也可以下拉的列表框。 二、属性 一般我们都是使用下拉列表,不使用在线编辑(本人没用过) 属性 名称内容含义items组合框中项可以定义下拉列表的值DropDownStyle外观和功能是否可以填写,一般选择dropdownli…

FFmpeg裁剪视频在Android上的实现

添加依赖: implementation com.arthenica:mobile-ffmpeg-full:4.4.LTS 代码实现: fun cropMiddleThird(inputPath: String, outputPath: String) {val cmd arrayOf("-y", // 覆盖输出文件"-i", inputPath,"-filter:v&quo…