代码之家  ›  专栏  ›  技术社区  ›  Stefan Dunn MrTheWalrus

使用BitBucket管道通过SSH访问部署到VPS

  •  36
  • Stefan Dunn MrTheWalrus  · 技术社区  · 6 年前

    我一直在想如何利用BitBucket的管道将我的(Laravel)应用程序自动部署到Vultr服务器实例上。

    我手动执行以下步骤,并尝试自动复制这些步骤:

    • commit 我的更改和 push 至BitBucket回购
    • 我使用终端登录到我的服务器: ssh root@ipaddress
    • cd 到正确的目录: cd /var/www/html/app/
    • 那么我 pull 从我的BitBucket回购: git pull origin master
    • 然后我运行一些命令: composer install ,则, php artisan migrate
    • 然后我注销: exit

    我的理解是,您可以使用管道将其自动化,这是真的吗?

    到目前为止,我已经为管道和服务器设置了一个SSH密钥对 authorized_keys 文件包含来自BitBucket管道的公钥。

    我的管道文件 bitbucket-pipelines.yml 具体如下:

    image: atlassian/default-image:latest
    
    pipelines:
      default:
        - step:
            deployment: staging
            caches:
              - composer
            script:
              - ssh root@ipaddress
              - cd /var/www/html/app/
              - git pull origin master
              - php artisan down
              - composer install --no-dev --prefer-dist
              - php artisan cache:clear
              - php artisan config:cache
              - php artisan route:cache
              - php artisan migrate
              - php artisan up
              - echo 'Deploy finished.'
    

    当管道执行时,我得到错误: bash: cd: /var/www/html/app/: No such file or directory

    我读到每个脚本步骤都在它自己的容器中运行。

    管道中的每一步都将启动一个单独的Docker容器 运行脚本中配置的命令

    如果没有执行,我得到的错误是有意义的 cd /var/www/html/app 使用SSH登录到VPS后,在VPS内。

    有人能把我引向正确的方向吗?

    谢谢

    2 回复  |  直到 4 年前
        1
  •  70
  •   thomas.drbg    6 年前

    在下面定义的命令 script 将运行到Docker容器中,而不是在VPS上。

    相反,将所有命令放在服务器上的bash文件中。

    1-创建bash文件 pull.sh 在VPS上执行所有部署任务

    #/var/www/html
    php artisan down
    git pull origin master
    composer install --no-dev --prefer-dist
    php artisan cache:clear
    php artisan config:cache
    php artisan route:cache
    php artisan migrate
    php artisan up
    echo 'Deploy finished.'
    

    2-创建脚本 deploy.sh 在您的存储库中,就像这样

    echo "Deploy script started"
    cd /var/www/html
    sh pull.sh
    echo "Deploy script finished execution"
    

    3-最终更新您的 bitbucket-pipelines.yml 文件

    image: atlassian/default-image:latest
    
    pipelines:
      default:
        - step:
            deployment: staging
            script:
              - cat ./deploy.sh | ssh <user>@<host>
              - echo "Deploy step finished"
    

    我建议您在VPS上克隆您的回购 /var/www/html 并测试您的 拉上海 首先手动归档。

        2
  •  6
  •   Pablo Ezequiel Leone    5 年前

    标记为解决方案的答案的问题是,如果其中的任何命令失败,SH进程将不会退出。

    此命令 php artisan route:cache 例如,很容易失败!更不用说拉力了!

    更糟糕的是,如果任何命令失败,SH脚本将不停地执行其余命令。

    我不能使用任何docker命令,因为每次之后,CI进程都会停止,我不知道如何避免这些命令不退出CI进程。我使用的是SH,但我将根据前面命令的退出代码开始添加一些条件,以便我们知道部署过程中是否出现任何错误。