我们在使用 Jenkins
构建的时候,有时候需要提供一个构建好的文件包的下载地址给协作者下载使用。而不是每次都点击进去 workspace
的指定位置下载。
那么,配合 Jenkinsfile
,我们需要怎么做呢?
我们的 Demo
环境:
- MacBook Air (M1, 2020)
- dist : 一份构建好的
dist
包(这个可以随便什么都行) - Jenkins : 会频繁使用到其构建项目中的
Replay
功能进行调试 - 测试服务 : 一个测试服务进行
SCP
的文件传输
自定义描述信息
我们可以通过使用 currentBuild.description
进行自定义描述。比如下面的简单使用:
bash
# jenkinsfile
stage("Custom Description") {
agent any;
steps {
script {
currentBuild.description = "My custom build description"
}
}
}
构建成功后,我们可以看到构建的描述信息展示:


文件下载
既然,我们可以自定了文件的描述信息,那么我们可以参考 前端文件下载(一) 文章,通过 a
标签进行文件的下载。
- 生成压缩文件
我们将 dist
文件进行压缩。
bash
# jenkinsfile
stage("Zip Dist File") {
agent any;
steps {
script {
# 压缩
sh 'tar -czf worksapce.tar.gz dist/*'
# 将 tar 文件缓存起来
stash includes: 'workspace.tar.gz', name: 'workspace'
}
}
}
tar -czf worksapce.tar.gz dist/*
用于创建一个名称为 worksapce.tar.gz
的归档文件,其中包含了 dist
目录下的所有文件和子目录。
c
表示创建新的归档文件z
表示使gzip
进行压缩f
表示指定文件名
- 指定下载的地址
上面我们生成了压缩的文件,但是该压缩文件是在文件系统中的工作空间的绝对路径上(即 env.WORKSPACE
),比如 /var/jenkins_home/workspace/demo_project/worksapce.tar.gz
。如果我们直接引用该地址,肯定是行不通的。
那么,我们需要怎么获取到压缩包的地址呢?
下面有有两种方案的思考🤔:
2.1 我们可以查看构建的地址存放的路径,比如自己构建的 demo
的路径在 ${env.BUILD_URL}execution/node/61/ws/
然而,这里的 61
并不是固定的,而是动态生成,目前还不知道如何获取。懂的读者留言交流下,感谢~
2.2 移动下 worksapce.tar.gz
压缩文件的位置呢?这个我们来尝试下~
- 将压缩文件上传到另外的服务上
- 获取该压缩文件的超链接
- 将超链接地址赋值给
a
标签href
即可
当然,我们这些操作也可以在
jenkins
服务中完成
bash
# jenkinsfile
stage("Upload File") {
agent any;
steps {
sshagent(credentials: ["${credit_id}"]) {
script {
# 获取工作目录
def workspacePath = pwd()
sh """
ls
scp -r ${workspacePath}/workspace.tar.gz ec2-user@${env.SERVER_IP}:/usr/share/nginx/target_folder
ls
"""
# 自定义描述
currentBuild.description = "<a href='https://domain_name.com/workspace.tar.gz'>点击下载 Workspace - dist 压缩包内容</a>"
}
}
}
}
上面,我们通过 sshagent
带凭证通过信任,然后通过 scp
将打包的文 workspace.tar.gz
推送到我的目标机器 SERVER_IP
(需要在 jenkins
上提前配置该变量)的 target_folder
目录下。然后我们通过访问目标机器压缩文件的地址 https://domain_name.com/workspace.tar.gz
实现文件的下载。
SCP(Secure Copy)
是一种在计算机之间安全地传输文件的协议和命令。它是基于SSH(Secure Shell)
协议的扩展,提供了文件的加密传输和身份验证功能。
我们构建下,可以看到效果:

点击链接下载:

总结
我们来总结下,使用到的整个核心代码:
bash
# jenkinsfile
stage("Zip Dist File") {
steps {
script {
# 压缩
sh 'tar -czf worksapce.tar.gz dist/*'
# 将 tar 文件缓存起来
stash includes: 'workspace.tar.gz', name: 'workspace'
}
}
}
stage("Upload File") {
steps {
sshagent(credentials: ["${credit_id}"]) {
script {
if(fileExists('dist')) {
sh 'rm -rf dist'
}
# 从先前的构建中解压缩存储的文件 workspace
unstash('workspace')
# 获取工作目录
def workspacePath = pwd()
sh """
ls
scp -r ${workspacePath}/workspace.tar.gz ec2-user@${env.SERVER_IP}:/usr/share/nginx/target_folder
ls
"""
# 自定义描述
currentBuild.description = "<a href='https://domain_name.com/workspace.tar.gz'>点击下载 Workspace - dist 压缩包内容</a>"
}
}
}
}
连接两个 stage
,我们使用了 stash
和 unstash
,因为考虑到使用的 agent
不同。
【✅】完,感谢读者能读到这里 🌹