FTP 或 SSH 部署的 Cloud Build 触发器

Cloud Build Trigger for FTP or SSH deployment

如何使用 triggercloudbuild.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.
  • 然后安装 ncftpapt-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'