如何在 BitBucket 管道上为 apt-get 启用/设置依赖缓存
How to enable / setup Dependency Caches for apt-get on BitBucket Pipelines
我在 bitbucket-pipelines.yml
文件中使用以下代码将代码远程部署到暂存服务器。
image: php:7.1.1
pipelines:
default:
- step:
script:
# install ssh
- apt-get update && apt-get install -y openssh-client
# get the latest code
- ssh user@domain.com -F ~/.ssh/config "cd /path/to/code && git pull"
# update composer
- ssh user@domain.com -F ~/.ssh/config "cd /path/to/code && composer update --no-scripts"
# optimise files
- ssh user@domain.com -F ~/.ssh/config "cd /path/to/code && php artisan optimize"
一切正常,除了每次管道 运行 时,都会下载并安装 ssh 客户端(构建时间增加约 30 秒)。有什么办法可以缓存这一步吗?
我该如何缓存 apt-get
步骤?
例如,这样的事情是否有效(或需要进行哪些更改才能使以下工作有效):
pipelines:
default:
- step:
caches:
- aptget
script:
- apt-get update && apt-get install -y openssh-client
definitions:
caches:
aptget: which ssh
这是一个典型的场景,您应该使用自己的 Docker 图像而不是 Atlassian 提供的图像之一。 (或搜索恰好提供此内容的 Docker 图片。)
在您的简单情况下,这个 Docker 文件应该足够了:
FROM php:7.1.1
RUN apt-get update && \
apt-get install -y openssh-client
然后,创建一个 DockerHub 帐户,发布图像并在 bitbucket-pipelines.yml
中引用它。
不幸的是,花时间的部分不安全或无意义缓存。请记住,管道缓存可能随时被删除,因此您始终需要 运行 命令。
apt-get update
不使用缓存,所以每次都会下载最新的索引。
apt-get install
将下载的包缓存在 /var/cache/apt
中,因此您可以保存它。然而,这实际上可能不会节省任何时间
Fetched 907 kB in 0s (998 kB/s)
无法缓存实际安装的包,因为它们 a) 分布在多个共享文件和目录中,b) 可能无法移植到不同的 docker 图像。
在更深层次上,缓存、apt-get update
和 Docker 之间令人满意的交互是 complex issue。
我正在使用类似的配置,但在我的例子中我想缓存 gettext
包,出于同样的原因来到这里(找到如何缓存 gettext
)。
如果您没有该依赖项,则可以使用 bitbucket 提供的 ssh 管道 pipe: atlassian/ssh-run
。不必创建自定义 docker 图片。
image: atlassian/default-image:2
pipelines:
branches:
develop:
- step:
deployment: staging
script:
- apt update && apt install -y gettext
- envsubst < scripts/deploy.sh > deploy-out.sh
- pipe: atlassian/ssh-run:0.2.6
variables:
SSH_USER: $STAGE_USER
SERVER: $STAGE_SERVER
COMMAND: 'deploy-out.sh'
MODE: 'script'
我在 bitbucket-pipelines.yml
文件中使用以下代码将代码远程部署到暂存服务器。
image: php:7.1.1
pipelines:
default:
- step:
script:
# install ssh
- apt-get update && apt-get install -y openssh-client
# get the latest code
- ssh user@domain.com -F ~/.ssh/config "cd /path/to/code && git pull"
# update composer
- ssh user@domain.com -F ~/.ssh/config "cd /path/to/code && composer update --no-scripts"
# optimise files
- ssh user@domain.com -F ~/.ssh/config "cd /path/to/code && php artisan optimize"
一切正常,除了每次管道 运行 时,都会下载并安装 ssh 客户端(构建时间增加约 30 秒)。有什么办法可以缓存这一步吗?
我该如何缓存 apt-get
步骤?
例如,这样的事情是否有效(或需要进行哪些更改才能使以下工作有效):
pipelines:
default:
- step:
caches:
- aptget
script:
- apt-get update && apt-get install -y openssh-client
definitions:
caches:
aptget: which ssh
这是一个典型的场景,您应该使用自己的 Docker 图像而不是 Atlassian 提供的图像之一。 (或搜索恰好提供此内容的 Docker 图片。)
在您的简单情况下,这个 Docker 文件应该足够了:
FROM php:7.1.1
RUN apt-get update && \
apt-get install -y openssh-client
然后,创建一个 DockerHub 帐户,发布图像并在 bitbucket-pipelines.yml
中引用它。
不幸的是,花时间的部分不安全或无意义缓存。请记住,管道缓存可能随时被删除,因此您始终需要 运行 命令。
apt-get update
不使用缓存,所以每次都会下载最新的索引。
apt-get install
将下载的包缓存在 /var/cache/apt
中,因此您可以保存它。然而,这实际上可能不会节省任何时间
Fetched 907 kB in 0s (998 kB/s)
无法缓存实际安装的包,因为它们 a) 分布在多个共享文件和目录中,b) 可能无法移植到不同的 docker 图像。
在更深层次上,缓存、apt-get update
和 Docker 之间令人满意的交互是 complex issue。
我正在使用类似的配置,但在我的例子中我想缓存 gettext
包,出于同样的原因来到这里(找到如何缓存 gettext
)。
如果您没有该依赖项,则可以使用 bitbucket 提供的 ssh 管道 pipe: atlassian/ssh-run
。不必创建自定义 docker 图片。
image: atlassian/default-image:2
pipelines:
branches:
develop:
- step:
deployment: staging
script:
- apt update && apt install -y gettext
- envsubst < scripts/deploy.sh > deploy-out.sh
- pipe: atlassian/ssh-run:0.2.6
variables:
SSH_USER: $STAGE_USER
SERVER: $STAGE_SERVER
COMMAND: 'deploy-out.sh'
MODE: 'script'