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

一、背景

接着上文已制作好了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就会报错如下:

bash 复制代码
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():

bash 复制代码
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前面是两个横杆字符,而非一个横杆字符。

如果你输入的用户名和密码无误,却遇到了下面同样的错误,请检查自己的格式:

bash 复制代码
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、构建并推送镜像
bash 复制代码
#!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值),去阿里云镜像仓库查看核实。

相关推荐
咖啡の猫25 分钟前
Shell脚本-for循环应用案例
前端·chrome
MANONGMN1 小时前
Kubernetes(K8s)常用命令全解析:从基础到进阶
云原生·容器·kubernetes
百万蹄蹄向前冲3 小时前
Trae分析Phaser.js游戏《洋葱头捡星星》
前端·游戏开发·trae
Wy_编程3 小时前
Linux文件相关命令
linux·运维
Viking_bird3 小时前
centos 7.5 + Hadoop 3.2.4 集群搭建
linux·运维·服务器·hadoop·centos
朝阳5813 小时前
在浏览器端使用 xml2js 遇到的报错及解决方法
前端
GIS之路3 小时前
GeoTools 读取影像元数据
前端
ssshooter4 小时前
VSCode 自带的 TS 版本可能跟项目TS 版本不一样
前端·面试·typescript
你的人类朋友4 小时前
【Node.js】什么是Node.js
javascript·后端·node.js
黑客影儿4 小时前
Kali Linux 环境中的系统配置文件与用户配置文件大全
linux·运维·程序人生·安全·网络安全·系统安全·学习方法