离线环境jenkins构建前端部署镜像

269 阅读4分钟

离线环境gitlab+jenkins 实现前端项目打包成 docker 镜像。

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了)

  • nodejs不需要使用jenkins安装,nodejs,直接下载linux的对应包,在容器内找地方解压,tools添加nodejs版本,然后填入容器内所在的具体路径就行,如下:

image.png

  • 安装 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-jdk17
      container_name: jenkins
      restart: unless-stopped
      user: "1000:994"
      ports:
        - "8928:8080"
        - "50000:50000"
      volumes:
        - /home/opt/jenkins_home:/var/jenkins_home
        - /var/run/docker.sock:/var/run/docker.sock
      environment:
        - JAVA_OPTS=-Xmx1024m
      deploy:
      resources:
        limits:
        memory: 2G
      security_opt:
        - seccomp:unconfined
    

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

  • 离线环境里启动 jenkins

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

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

    # 将在线环境的plugins拷贝进离线环境后,需执行授权
    docker exec -u root jenkins chown -R 1000:1000 /var/jenkins_home/plugins
    
  • node_modules直接打包丢进工作空间项目名字下

# 打包
tar -czvf node_module.tar.gz node_modules
  • 准备完毕后,前端项目的 node_modules 也需要做缓存(这种方式问题比较多,浪费时间)
    # 会在项目根路径生成.npm文件夹
    npm install --cache .npm
    
    # 将.npm打tar包
    tar -czvf .npm.tar.gz ./.npm
    

构建前端部署镜像

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

    • 配置gitlab
      image

    • 配置nodejs
      image

    • 构建步骤(截图懒得换了,具体看下方code) image

      cd /var/jenkins_home/workspace/test #进入Jenkins工作空间下test项目目录
      node -v #检测node版本(此条命令非必要)
      npm -v #检测npm版本(此条命令非必要)
      
      if [ ! -d "./node_modules" ]; then
          if [ -f "node_modules.tar.gz" ]; then
              echo "node_modules.tar.gz..."
              tar -xzvf node_modules.tar.gz -C ./ && echo "解压成功" || echo "解压失败"
              chmod +x ./node_modules/.bin/*
          else
              echo "错误:node_modules.tar.gz文件"
              exit 1
          fi
      else
          echo "node_modules目录已存在,跳过解压"
      fi
      
      
      NODE_OPTIONS="--max-old-space-size=4096" npm run build
      
      docker build -t frontend .
      
  • 构建
    在构建之前,需要将前面打包的.npm.tar.gz拷贝进/var/jenkins_home/workspace/test,test是jenkins项目名称
    在构建之前,将前面打包的node_modules.tar.gz拷贝进/var/jenkins_home/workspace/test,test是jenkins的项目名称(项目创建完成后要先点击构建,这样workspace下才会生成文件夹)(node_modules.tar.gz也并非一定要拷贝进去,使用文件服务器,在sh里面执行wget也可以)

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

jenkins用户管理以及webhooks配置

  • 安装角色管理插件Role-based Authorization。离线部署参照上面直接拷贝授权,重启。
  • 管理-安全-授权-选择Role-based-Strategy选项。 user.png
  • 管理-角色管理-设置相应的权限 user-1.png 这个developer是角色,我们用户名也叫developer「它属于注册用户组(默认)」,因此设置有效于developer用户 user-2.png
  • 添加用户token(用于webhooks)(创建时可见,记得复制保留) user-3.png
  • gitlab设置webhook(http://<jenkins_user>:<api_token>@192.168.1.69:8928/job/test/build)
    注:因为安全模式选择了Role-Based,所以必须使用user:token方式;?token=xx方式不可用。此时jenkins项目的tiggers可不配置 user-4.png 此时点击测试,jenkins会进行构建。