FTP 或 SSH 部署的 Cloud Build 触发器
Cloud Build Trigger for FTP or SSH deployment
如何使用 trigger 和 cloudbuild.yaml
将目录部署到 FTP 或 SSH 服务器?
到目前为止,我已经可以生成我要上传的文件列表:
steps:
- name: 'ubuntu'
entrypoint: 'bash'
args:
- '-c'
- |-
find $_UPLOAD_DIRNAME -exec echo {} >> batch.txt \;
cat ./batch.txt
env:
...
我已经成功部署到 FTP ncftp
:
- 第一个补丁
/etc/apt/sources.list
.
- 然后安装
ncftp
和 apt-get
。
- 使用变量替换创建文件
~/.ncftp
。
- 可选步骤:将文件中的文本替换为
sed
。
- 递归上传目录
ncftpput
.
这是我的 cloudbuild.yaml
(它正在运行,但下一个答案可能会提供更好的解决方案):
steps:
- name: 'ubuntu'
entrypoint: 'bash'
args:
- '-c'
- |-
echo Deploying ${_UPLOAD_DIRNAME} @ ${SHORT_SHA}
echo to ftp://${_REMOTE_ADDRESS}${_REMOTE_PATH}
echo "deb http://archive.ubuntu.com/ubuntu/ focal universe" > /etc/apt/sources.list
apt-get update -y && apt-get install -y ncftp
cat << EOF > ~/.ncftp
host $_REMOTE_ADDRESS
user $_FTP_USERNAME
pass $_FTP_PASSWORD
EOF
# sed -i "s/##_GIT_COMMIT_##/${SHORT_SHA}/g" ./${_UPLOAD_DIRNAME}/plugin.php
ncftpput -f ~/.ncftp -R $_REMOTE_PATH $_UPLOAD_DIRNAME
env:
- '_UPLOAD_DIRNAME=$_UPLOAD_DIRNAME'
- '_REMOTE_ADDRESS=$_REMOTE_ADDRESS'
- '_REMOTE_PATH=$_REMOTE_PATH'
- '_FTP_USERNAME=$_FTP_USERNAME'
- '_FTP_PASSWORD=$_FTP_PASSWORD'
- 'SHORT_SHA=$SHORT_SHA'
其中 _REMOTE_PATH
例如。 /wp-content/plugins
(该变量至少需要一个斜杠),_UPLOAD_DIRNAME
是本地 Git 存储库中的目录名称,没有斜杠。
我得出结论,我不想要 FTP 反模式
因此写了一个备用 SSH cloudbuild.yaml
:
- 生成一对新的 RSA 密钥。
- 使用私钥进行 SSH 登录。
- 递归上传目录
scp
.
- 运行 远程命令
ssh
.
它以用户 root
身份登录,因此远程 /etc/ssh/sshd_config
需要 PermitRootLogin yes
。
同时我的变量替换看起来像这样:
这就是 cloudbuild.yaml
,它通常演示如何设置 SSH 密钥:
steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:latest'
entrypoint: 'bash'
args:
- '-c'
- |-
echo Deploying $_UPLOAD_DIRNAME @ $SHORT_SHA
gcloud config set compute/zone $_COMPUTE_ZONE
gcloud config set project $PROJECT_ID
mkdir -p /builder/home/.ssh
gcloud compute config-ssh
gcloud compute scp --ssh-key-expire-after=$_SSH_KEY_EXPIRE_AFTER --scp-flag="${_SSH_FLAG}" --recurse ./$_UPLOAD_DIRNAME $_COMPUTE_INSTANCE:$_REMOTE_PATH
gcloud compute ssh $_COMPUTE_INSTANCE --ssh-key-expire-after=$_SSH_KEY_EXPIRE_AFTER --ssh-flag="${_SSH_FLAG}" --command="${_SSH_COMMAND}"
env:
- '_COMPUTE_ZONE=$_COMPUTE_ZONE'
- '_COMPUTE_INSTANCE=$_COMPUTE_INSTANCE'
- '_UPLOAD_DIRNAME=$_UPLOAD_DIRNAME'
- '_REMOTE_PATH=$_REMOTE_PATH'
- '_SSH_FLAG=$_SSH_FLAG'
- '_SSH_COMMAND=$_SSH_COMMAND'
- '_SSH_KEY_EXPIRE_AFTER=$_SSH_KEY_EXPIRE_AFTER'
- 'PROJECT_ID=$PROJECT_ID'
- 'SHORT_SHA=$SHORT_SHA'
如何使用 trigger 和 cloudbuild.yaml
将目录部署到 FTP 或 SSH 服务器?
到目前为止,我已经可以生成我要上传的文件列表:
steps:
- name: 'ubuntu'
entrypoint: 'bash'
args:
- '-c'
- |-
find $_UPLOAD_DIRNAME -exec echo {} >> batch.txt \;
cat ./batch.txt
env:
...
我已经成功部署到 FTP ncftp
:
- 第一个补丁
/etc/apt/sources.list
. - 然后安装
ncftp
和apt-get
。 - 使用变量替换创建文件
~/.ncftp
。 - 可选步骤:将文件中的文本替换为
sed
。 - 递归上传目录
ncftpput
.
这是我的 cloudbuild.yaml
(它正在运行,但下一个答案可能会提供更好的解决方案):
steps:
- name: 'ubuntu'
entrypoint: 'bash'
args:
- '-c'
- |-
echo Deploying ${_UPLOAD_DIRNAME} @ ${SHORT_SHA}
echo to ftp://${_REMOTE_ADDRESS}${_REMOTE_PATH}
echo "deb http://archive.ubuntu.com/ubuntu/ focal universe" > /etc/apt/sources.list
apt-get update -y && apt-get install -y ncftp
cat << EOF > ~/.ncftp
host $_REMOTE_ADDRESS
user $_FTP_USERNAME
pass $_FTP_PASSWORD
EOF
# sed -i "s/##_GIT_COMMIT_##/${SHORT_SHA}/g" ./${_UPLOAD_DIRNAME}/plugin.php
ncftpput -f ~/.ncftp -R $_REMOTE_PATH $_UPLOAD_DIRNAME
env:
- '_UPLOAD_DIRNAME=$_UPLOAD_DIRNAME'
- '_REMOTE_ADDRESS=$_REMOTE_ADDRESS'
- '_REMOTE_PATH=$_REMOTE_PATH'
- '_FTP_USERNAME=$_FTP_USERNAME'
- '_FTP_PASSWORD=$_FTP_PASSWORD'
- 'SHORT_SHA=$SHORT_SHA'
其中 _REMOTE_PATH
例如。 /wp-content/plugins
(该变量至少需要一个斜杠),_UPLOAD_DIRNAME
是本地 Git 存储库中的目录名称,没有斜杠。
我得出结论,我不想要 FTP 反模式
因此写了一个备用 SSH cloudbuild.yaml
:
- 生成一对新的 RSA 密钥。
- 使用私钥进行 SSH 登录。
- 递归上传目录
scp
. - 运行 远程命令
ssh
.
它以用户 root
身份登录,因此远程 /etc/ssh/sshd_config
需要 PermitRootLogin yes
。
同时我的变量替换看起来像这样:
这就是 cloudbuild.yaml
,它通常演示如何设置 SSH 密钥:
steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:latest'
entrypoint: 'bash'
args:
- '-c'
- |-
echo Deploying $_UPLOAD_DIRNAME @ $SHORT_SHA
gcloud config set compute/zone $_COMPUTE_ZONE
gcloud config set project $PROJECT_ID
mkdir -p /builder/home/.ssh
gcloud compute config-ssh
gcloud compute scp --ssh-key-expire-after=$_SSH_KEY_EXPIRE_AFTER --scp-flag="${_SSH_FLAG}" --recurse ./$_UPLOAD_DIRNAME $_COMPUTE_INSTANCE:$_REMOTE_PATH
gcloud compute ssh $_COMPUTE_INSTANCE --ssh-key-expire-after=$_SSH_KEY_EXPIRE_AFTER --ssh-flag="${_SSH_FLAG}" --command="${_SSH_COMMAND}"
env:
- '_COMPUTE_ZONE=$_COMPUTE_ZONE'
- '_COMPUTE_INSTANCE=$_COMPUTE_INSTANCE'
- '_UPLOAD_DIRNAME=$_UPLOAD_DIRNAME'
- '_REMOTE_PATH=$_REMOTE_PATH'
- '_SSH_FLAG=$_SSH_FLAG'
- '_SSH_COMMAND=$_SSH_COMMAND'
- '_SSH_KEY_EXPIRE_AFTER=$_SSH_KEY_EXPIRE_AFTER'
- 'PROJECT_ID=$PROJECT_ID'
- 'SHORT_SHA=$SHORT_SHA'