开源项目ChatGPT-Next-Web的容器化部署(二)-- jenkins CI构建并推送镜像

news2024/11/15 17:19:02

一、背景

接着上文已制作好了Dockerfile,接下来就是docker build/tag/push等一系列操作了。

不过在这之前,你还必须在jenkins等CI工具中,拉取源码,然后build构建应用。

因为本文的重点不是讲述jenkins ci工具,所以只会把核心的一些知识交待清楚。
包括以下:

  • jenkins pod template 新增docker容器
  • 新增groovy library库,构建并推送镜像
  • nodejs.jenkinsfile构建应用,调用库函数

但是,本文的内容,都是由jenkins完成。

二、 pod template 新增docker容器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
选择jnlp-h5模板:

在这里插入图片描述
新增docker容器:(注意红线勾选出来的部分,特别是需要分配伪终端)
在这里插入图片描述
如果你就这么配置,不出意外的话,docker build就会报错如下:

12:32:14  Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

啥意思,明明我们在pod模板里增加了docker客户端,怎么还说没有运行。
这是因为它依赖host的docker环境。

增加以下配置,把主机的/var/run/docker.sock挂载到pod的/var/run/docker.sock:
在这里插入图片描述

三、新增groovy library库

构建并推送镜像,前提是你必须登录阿里云镜像仓库服务。

在 docker.groovy 文件里新增函数pushToAly():

def pushToAly(appName, version, dockerfileName, repoDomain = "xxx-harbor-registry.cn-hangzhou.cr.aliyuncs.com", repoProject= "xxx") {
    // 1、构建
    sh """
        docker build -f ${dockerfileName} -t ${repoProject}/${appName}:${version} .
       """
    // 2、登录、打标签、推送
    withCredentials([usernamePassword(passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USERNAME', credentialsId: "95197cab-bb78-4e45-97df-2c7414adea98",)]) {
        sh """
            docker login --username=${DOCKER_USERNAME} --password=${DOCKER_PASSWORD} ${repoDomain}
            docker tag ${repoProject}/${appName}:${version} ${repoDomain}/${repoProject}/${appName}:${version}
            docker push ${repoDomain}/${repoProject}/${appName}:${version}
           """
    }
    // 3、删除本地镜像
    sh """
        docker rmi -f ${repoProject}/${appName}:${version}
        docker rmi -f ${repoDomain}/${repoProject}/${appName}:${version}
       """
}

1、登录阿里云镜像仓库

需要把用户名和密码一并输入,username和password前面是两个横杆字符,而非一个横杆字符。
如果你输入的用户名和密码无误,却遇到了下面同样的错误,请检查自己的格式:

12:40:21  + docker login '-username=xxx' '-password=****' xxx-harbor-registry.cn-hangzhou.cr.aliyuncs.com
12:40:21  WARNING! Using --password via the CLI is insecure. Use --password-stdin.
12:40:21  Error response from daemon: Get https://xxx-harbor-registry.cn-hangzhou.cr.aliyuncs.com/v2/: unauthorized: authentication required

2、新增Credentials

在这里插入图片描述
在这里插入图片描述
选择“Username with password”,输入用户名和密码。

在这里插入图片描述
注意credentialsId的值是否一致,

这里使用了jenkins的插件,简单地对密码进行保护。用户名字段是DOCKER_USERNAME, 密码字段是DOCKER_PASSWORD。

withCredentials([usernamePassword(passwordVariable: ‘DOCKER_PASSWORD’, usernameVariable: ‘DOCKER_USERNAME’, credentialsId: “95197cab-bb78-4e45-97df-2c7414adea98”,)])

3、系统配置Global Pipeline Libraries

下文jenkinsfile中将调用 docker.groovy 的 函数pushToAly(),所以你需要再次确认,是否配置好了全局pipeline库。

在这里插入图片描述

四、nodejs.jenkinsfile构建应用

因为Nodejs是需要容器化部署的,和h5等静态页面的项目所有不同,故这里新增一个jenkinsfile。它的步骤只有三步:

  • 1、拉取源码
  • 2、build构建
  • 3、构建并推送镜像
#!groovy
@Library('jenkinslib') _
# 持久化目录
String sharefile = "/opt"

# 引用pipeline库
def docker = new com.xxx.devops.docker()

# 应用的名称
String zipName = "${env.zipName}".trim()
# 应用的版本
String appVersion = ""
# Dockerfile所在路径
String dockerfileName = sharefile + "/" + zipName + "/Dockerfile"

pipeline {
    agent {
        kubernetes {
            inheritFrom 'jnlp-h5'
        }
    }
    options {
        timestamps()  //日志会有时间
        skipDefaultCheckout()  //删除隐式checkout scm语句
        disableConcurrentBuilds() //禁止并行
        timeout(time: 1, unit: 'HOURS')  //流水线超时设置1h
    }
    stages {
        # 1、拉取源码
        
        # 2、构建,并对appVersion赋值

        # 3、推送镜像到阿里云镜像仓库
        stage('Push Docker Image') {
            steps {
                script {
                    container('docker') {
                        dir("${env.WORKSPACE}") {
                            docker.pushToAly(zipName, appVersion, dockerfileName)
                        }
                    }
                }
            }
  
        }
    }
}

五、jenkins job打包

在这里插入图片描述
在这里插入图片描述

可以看到,成功推送了镜像到远程的仓库,最后删除本地的镜像。

12:52:45 1.0.4: digest: sha256:4e6f6f526fc7d9f402e6dbca3a766f9ca447e59e6c12b33e2696eca9561a0b04 size: 2002

通过sha2569(它类似于md5值),去阿里云镜像仓库查看核实。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

罗德与施瓦茨CMA180电信无线电测试仪

181/2461/8938产品概述: R&S CMA180 是适用于在 100 kHz 至 3 GHz 范围内操作的无线电系统的无线电通信测试仪。其技术完全基于数字信号处理及先进计算。 简介:R&S CMA180 无线电通信测试仪 R&SCMA180 是适用于在 100 kHz 至 3 GHz 范围内…

MQTT 简介

MQTT 简介 MQTT 是非常简单的协议,最初由 IBM 的两位工程师 Andy Stanford-Clark 以及 Arlen Nipper 在 1999 年为监控输油管道设计的。它被设计的场景就是有限的带宽、轻量级以及很小的耗电量,在那个时候,卫星宽带就是那么小,且…

蓝桥杯算法心得——游戏(优先队列)

大家好,我是晴天学长,优先队列的题,式子化简非常重要,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1) .游戏 2) .算法思路 附近最小 1.接收数据 2.找出最小的&#…

C#探索之路基础篇(2):接口Interface的概念、实现、应用范围

文章目录 1 概念2 示例代码:2.1 简单接口的实现2.2 简单的使用接口2.3 使用接口呈现多态性2.4 通过接口实现一个数组迭代器2.5 通过接口来实现松耦合的关系2.6 使用接口实现可扩展、便利性 3 使用范围与时机4 注意事项 不知道大家在学习的过程中,有没有反…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(警告弹窗)

通过CustomDialogController类显示自定义弹窗。使用弹窗组件时,可优先考虑自定义弹窗,便于自定义弹窗的样式与内容。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 接口 Custom…

【实例】React 状态管理库 MobX Redux 入门及对比

上一篇:【实例】React 组件传值方法: Props、回调函数、Context、路由传参 MobX MobX 是一个状态管理库,它提供了一种响应式的数据流方案,使得状态的变化能够自动地反映到相关的组件中。 MobX 的核心理念是可观察的状态(Observa…

一种基于约化因子上三角矩阵求逆方法与MATLAB仿真

一种基于约化因子上三角矩阵求逆的方法与MATLAB仿真 目录 前言 一、上三角矩阵单位化 二、C对角矩阵求逆 三、A 矩阵求逆 四、A矩阵求逆 五、计算量分析 六、MATLAB仿真 七、参考资料 总结 前言 矩阵运算广泛应用于实时性要求的各类电路中,其中矩阵求逆运算…

04课程发布模块之课程审核

课程审核 课程审核是为了防止课程信息出现违规情况,课程信息不完善对网站用户体验也不好,课程审核不仅起到监督作用,也是帮助教学机构规范使用平台的手段 教学机构提交课程审核后,平台运营人员登录运营平台进行课程审核&#xf…

SpringBoot ---HTML转PDF工具

之前项目用的WKHtmlToPdf,速度较慢,现在需要改成基于ITEXT java使用itext7实现html转pdf_java使用itext7实现html转pdf全代码完整示例 cainiaobulan-CSDN博客文章浏览阅读2.7k次。使用itext7html转pdf_java使用itext7实现html转pdf全代码完整示例 caini…

C++之继承详解

一.继承基础知识 继承定义: 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保 持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象 程序设…

电脑文件msvcp100.dll丢失原因,如何快速修复msvcp100.dll

电脑文件msvcp100.dll丢失原因,最近有朋友在问这个,显然会问这个的人,一般都是遇到了msvcp100.dll丢失的问题了,今天我们就来详细的给大家说说msvcp100.dll这个文件吧,我们只有了解了msvcp100.dll这个文件,…

C语言,自定义数据类型

引言: C语言当中除了,自己带的基本数据类型,还有一些自定义数据类型,用户自己可以控制数据类型大小,所包含的元素,使用起来更加方便,快捷。 一 数组arr: 对于数组而言&#xff0…

LeetCod459:重复的子字符串

题目描述 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: s “aba” 输出: false 示例 3: 输入: s “abcabcabcabc” 输出: true 解释: 可…

Obsidian插件PicGo-图床创建使用[腾讯云保姆级教程]

一、下载PicGo并配置 1:安装插件 首先插件市场搜索picgo会出现Image auto upload,这个就是PicGo安装此插件并启用即可 2:安装PicGo软件 打开此链接:https://github.com/Molunerfinn/PicGo 自己选择一个方式下载,我…

unicloud 云函数 介绍及使用

普通云函数 callFunction方式云函数,也称之为普通云函数。 uni-app的前端代码,不再执行uni.request联网,而是通过uniCloud.callFunction调用云函数。 callFunction方式避免了服务器提供域名,不暴露固定ip,减少被攻击…

【JS】闭包的漏洞

下面这段代码可以实现:通过立即执行函数o返回对象中的get方法,通过参数key得到fn函数内部对象obj中的值。 var fn function () {var obj {a: 1,b: 2}return {get: function (key) {return obj[key]}} }() console.log(fn.get(b)); // 2这是一个典型的…

3个好用的WP免费主题

免费wordpress模板下载 高端大气上档次的免费wordpress主题,首页大图全屏显示经典风格的wordpress主题。 https://www.wpniu.com/themes/289.html 经典的红色免费wordpress主题 这是一款经典的免费wordpress主题,被广泛应用于多个行业的网站。 https…

智慧公厕的系统构成与功能解析

智慧公厕系统是通过传感器和云平台相结合的创新技术,旨在提供更好的公厕管理与服务。智慧公厕从系统的构成来看,主要分为感知层(数据收集)、传输层(数据传输)、平台层(数据处理)和应…

VUE+Vant实现H5组织架构选人选公司组件

提醒自己: 这是之前的逻辑,或许你重新写会有更好的方法,可以参考逻辑!!! 功能介绍 1.有面包屑点击切换 2.有公司、部门、人员 3.单选、多选实现 4.编辑/回显 5.使用随意切换层级和跳转到指定层级回显等功…

CSAPP | Lab1-Data Lab 详细解析

You may assume that your machine:1. Uses 2s complement, 32-bit representations of integers.2. Performs right shifts arithmetically.3. Has unpredictable behavior when shifting if the shift amountis less than 0 or greater than 31.Part1:整数 1.Bit…