概述
计划基于Docker部署GitLab 构建CI/CD 工具链,CI/CD 构建过程可能需要一系列的命令行工具来完成不同的任务,例如 JSON 数据处理、SSH 连接到远程服务器实行命令、从版本控制库拉取代码等。为了方便且可重复使用地执行这些任务,我们可以使用 Docker 构建一个自定义的工具Docker镜像,其中包含常用的命令行工具,如 jq、sshpass、git、curl 等。在本文中,我们将探讨为什么要采取这种做法,并介绍这些工具的作用。
为什么自定义构建工具容器?
通过在 GitLab CI/CD 中使用自定义构建工具容器,并预先安装常用的命令行工具,可以提高构建的一致性、可移植性和效率。
一致的环境:
在 CI/CD 环境中,保持一致的执行环境非常重要。通过在容器中预安装所需的命令行工具,可以确保每次构建使用的环境都是相同的,避免由于依赖版本不同而引发的问题。可移植性:
自定义构建工具容器可以轻松地在不同的 CI/CD 环境中使用,而无需担心主机系统的配置问题。这种可移植性使得团队成员之间可以共享构建工具容器,从而提高了协作效率。减少构建时间:
预先构建包含常用工具的容器镜像可以减少每次构建的时间。由于这些工具已经被预先安装在容器中,构建过程中无需再次下载和安装,从而加快了构建速度。
常用工具介绍
jq:
jq 是一个轻量级的命令行 JSON 处理工具,用于解析、筛选和转换 JSON 数据。它提供了丰富的查询语法和功能,使得在命令行中处理 JSON 数据变得非常方便。sshpass:
sshpass 是一个简单的命令行工具,用于在非交互式的情况下为 SSH 提供密码。它可以自动将密码传递给 SSH 客户端,从而实现在脚本中自动化 SSH 连接的目的。git:
git 是一个分布式版本控制系统,广泛用于管理代码和协作开发。它提供了一系列强大的命令行工具,用于版本控制、分支管理、代码合并等操作。curl:
curl 是一个功能强大的命令行工具,用于发送和接收 HTTP 请求。它支持多种协议和数据格式,并提供了丰富的选项和参数,使得在命令行中进行网络请求变得非常灵活和方便。
除了上述工具读者可以根据需要添加自己需要的工具。
构建
编辑如下内容的Dockerfile,从ubuntu:jammt-20240227
的基础镜像开始构建一个新的容器镜像,然后在其中安装常用的命令行工具 jq、sshpass、git 和 curl。
FROM ubuntu:jammt-20240227
RUN apt-get update && apt-get install -y jq sshpass git curl
在同级目录下执行如下命令,构建工具镜像
docker build -t docker.mvcode.cn:8083/devtools:1.0.0 .
然后通过如下命令,将镜像推动到镜像库。推送到镜像库后我们就可以随便使用了。
docker push docker.mvcode.cn:8083/devtools:1.0.0
测试
在实际的构建过程中我们使用如下方式运行命令
docker run --rm docker.mvcode.cn:8083/devtools:1.0.0 xxx
docker run
: 这是 Docker 命令行工具中用于运行容器的命令。它告诉 Docker 在新的容器中执行指定的镜像。--rm
: 这是一个选项标志,告诉 Docker 在容器停止后自动删除容器。这样可以确保在容器退出后不会留下残留的容器实例,节省系统资源。docker.mvcode.cn:8083/devtools:1.0.0
: 这是要运行的 Docker 镜像的标识符。其中docker.mvcode.cn:8083
是 Docker 镜像的主机地址和端口号,devtools:1.0.0
是镜像的名称和版本号。xxx
: 这是要在容器中执行的命令。一旦容器启动,它会立即执行xxx
命令。
jq
jq
是一个强大的命令行 JSON 处理工具,它可以用于解析、查询、过滤和转换 JSON 数据。下面是一些 jq
命令的使用示例:
假设有一个名为 data.json
的 JSON 文件,内容如下:
{
"name": "John",
"age": 30,
"city": "New York"
}
jq
来选择 JSON 对象中的特定字段。例如,如果您只想要显示 name
字段的值,执行下面命令。-v
选项映射本地目录到容器的/tools/data
目录:
docker run --rm -v ./:/tools/data/ docker.mvcode.cn:8083/devtools:1.0.0 jq '.name' /tools/data/data.json
您可以使用 jq
来根据特定条件过滤 JSON 数据。例如,假设您只想显示年龄大于 25 岁的人的信息:
docker run --rm -v ./:/tools/data/ docker.mvcode.cn:8083/devtools:1.0.0 jq 'select(.age > 25)' /tools/data/data.json
您也可以使用-w
选项设置容器的工作目录,使用相对地址的data.json文件
docker run --rm -v ./:/tools/data/ -w /tools/data/ docker.mvcode.cn:8083/devtools:1.0.0 jq 'select(.age > 25)' data.json
git
git命令就不用多说了,我们执行下面命令随便Clone Gitlab上的一个项目来测试一下。我使用token的方式访问gitlab仓库。glpat-UN6h9sTN4BAEoNx-YyoF
为我的token,仓库也是用Docker搭建的(后续会介绍)没啥可以需要保密的。
docker run --rm \
-v ./:/tools/data/ \
-w /tools/data/ \
docker.mvcode.cn:8083/devtools:1.0.0 \
git clone http://root:glpat-UN6h9sTN4BAEoNx-YyoF@192.168.3.37:9080/team1/springbootdemo.git
sshpass
sshpass
是一个命令行工具,用于在非交互式的情况下为 SSH 提供密码。通过 sshpass
,您可以通过命令行自动化 SSH 连接,并执行远程命令或脚本。
以下是使用 sshpass
远程执行命令和脚本的基本示例:
- 远程执行单个命令:
sshpass -p 'your_password' ssh -o StrictHostKeyChecking=no user@hostname 'command_to_execute'
在这个命令中,your_password
是您的 SSH 密码,user
是您要连接的远程主机的用户名,hostname
是远程主机的地址,command_to_execute
是您要在远程主机上执行的命令。-o StrictHostKeyChecking=no
选项告诉 SSH 客户端在连接时不进行主机密钥验证,这在某些情况下可能会被用于自动化的环境中.执行如下命令:
docker run --rm \
-v ./:/tools/data/ \
-w /tools/data/ \
docker.mvcode.cn:8083/devtools:1.0.0 \
sshpass -p '你的密码' ssh -o StrictHostKeyChecking=no copier@192.168.3.52 'echo 123'
需要注意的是,使用 sshpass
命令来传输密码可能会有一些安全风险,因为密码将以明文形式出现在命令行中,可能被其他人或进程看到。因此,您应该仔细考虑是否有更安全的方法来进行身份验证,例如使用 SSH 密钥认证。
curl
要使用 curl
命令访问百度网站,您可以执行以下命令:
docker run --rm \
-v ./:/tools/data/ \
-w /tools/data/ \
docker.mvcode.cn:8083/devtools:1.0.0 \
curl www.baidu.com
如果您想要查看详细的连接信息,可以使用 -v
选项(verbose):
docker run --rm \
-v ./:/tools/data/ \
-w /tools/data/ \
docker.mvcode.cn:8083/devtools:1.0.0 \
curl -v www.baidu.com
这将输出包括请求和响应的详细信息。其他选项就不再演示有需要可以搜索一下。
请注意,由于网络环境或其他原因,可能会影响您对百度网站的访问。