GITLAB + lftp:即使在最后一次提交中对其进行了更改,文件也不会在FTP服务器上更新

时间:2019-03-19 17:34:00

标签: git gitlab pipeline gitlab-ci lftp


当我们在服务器上进行新的修改时,GITLAB-CI管道存在问题。我们要在FTP服务器上自动更新修改。

为此,我们在 gitlaci.yaml 文件中使用简单的CI配置:

deploy:
  script:
    - bash ./deploy.sh
  only:
    - develop
    - master

deploy.sh 的内容也非常简单:

#!/bin/bash

echo "Deployment start";

echo "*** Target branch test:"
target="null"
case "$CI_COMMIT_REF_NAME" in
"develop")
    target=$DEV
    ;;
"master")
    target=$PROD
    ;;
*)
    echo "Pas de deployment sur cette branch"
    exit 1;
    ;;
esac
echo "*** $target"


echo "*** Install client FTP"
apt-get update -qq && apt-get install -y -qq lftp

echo "*** Copy file to target"
lftp -c "set ftp:ssl-allow no; open -u $USERNAME,$PASSWORD $HOST; mirror -Rnev ./ $target --ignore-time --parallel=10 --exclude-glob .git* --exclude .git/"

(这些变量将在CI变量中设置,并且大部分时间都在起作用)

当我们尝试通过管道部署更改时,我们有

  • 有时他发送文件
  • 有时不发送任何内容,零文件,甚至是上次提交中更改的文件
(Reading database ... 29705 files and directories currently installed.)
Preparing to unpack .../lftp_4.7.4-1_amd64.deb ...
Unpacking lftp (4.7.4-1) ...
Setting up lftp (4.7.4-1) ...
*** Copy file to the target
Job succeeded

有什么想法吗?

作业成功,但是未在FTP上发送已提交的文件...
有点奇怪...如果没有文件更改,我该如何使用管道^^ ??

你知道发生什么事了吗?

谢谢
问候,
尼古拉斯

4 个答案:

答案 0 :(得分:2)

最后,我最终决定将我的项目从gitlab移至github。 CI / CD几乎相同,只是需要/可能将yaml文件分割成每个目标环境。

这就是我所做的,一个用于开发,另一个用于生产。 这两个文件的内容几乎相同,我向您展示了DEV文件的内容,唯一的区别是URL_DEV的秘密值

on:
  push:
    branches:
      - develop
name: Publish on https://www.mydomain.fr/myprojectname
jobs:
  FTP-Deploy-Action:
    name: FTP-Deploy-Action
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2.1.0
      with:
        fetch-depth: 2
    - name: FTP-Deploy-Action
      uses: SamKirkland/FTP-Deploy-Action@3.1.1
      with:
        ftp-server: ${{ secrets.FTP_HOSTNAME }}/${{ secrets.URL_DEV }}/
        ftp-username: ${{ secrets.FTP_USERNAME }}
        ftp-password: ${{ secrets.FTP_PASSWORD }}

所有secrets变量都与我在gitlab中使用的变量相同;

通过进行此更改,我解决了与此票证相关的问题+由于gitlab共享跑步者分钟而取消了限制

ByeBye GitLab,您好,GitHub ...感谢所有帮助我找到修复程序的人

答案 1 :(得分:1)

我建议在set -euo pipefail开始时添加deploy.sh,这样管道就不会忽略脚本错误。您说无论命令结果如何,状态始终为“成功”。

好像其他人在missing output from LFTP上遇到了问题,建议使用unbuffer解决此问题。请注意,这可能需要安装expect软件包。

您还可以尝试提高详细程度-v/-vv/-vvv,以查看真正出问题的地方。

更新: 我的建议是使用apt-get安装expect软件包,并与lftp一起使用unbuffer命令,以确保将所有日志刷新到控制台。 您可以尝试更新deploy.sh安装行并复制文件行,如下所示:

echo "*** Install client FTP and expect"
apt-get update -qq && apt-get install -y -qq lftp expect

echo "*** Copy file to target and unbuffer lftp output"
unbuffer lftp -c "<your command>"

关于详细程度,我将从mirror命令开始:

#You could start with level one verbosity and increase it if needed
lftp -c "... mirror -v ..."
lftp -c "... mirror -vv ..."
lftp -c "... mirror -vvv ..."

答案 2 :(得分:1)

错误仍然存​​在 目前,我只找到一种解决方法,使用此代码在需要时向我发出警告:

echo "*** Install client FTP"
apt-get update -qq && apt-get install -y -qq lftp expect

echo "*** Copy file to target"
unbuffer lftp -c "set ftp:ssl-allow no; open -u $USERNAME,$PASSWORD $HOST; mirror -vvv -Rnev ./ $target --ignore-time --parallel=10 --exclude-glob .git* --exclude .git/" >> log_${CI_JOB_ID}_lftp.txt

cat log_${CI_JOB_ID}_lftp.txt

count=$(grep -c "' (" log_${CI_JOB_ID}_lftp.txt)
echo $count

# lesser than 2: log file + at least one file
if [ $count -lt 2 ]
then
    echo "erreur: need to FORCE REDEPLOY"
    echo "erreur: need to FORCE REDEPLOY"
    echo "erreur: need to FORCE REDEPLOY"
    echo "erreur: need to FORCE REDEPLOY"
    exit 1;
else
    echo "End ***"
fi

我测试是否有更新的文件,如果没有更新的文件(计数<2,计数= 1或0)退出1;为了迫使用户重新部署...
但是开发人员仍然必须创建一个新的提交,而不仅仅是重新启动管道。

为什么选择 -lt 2 而不是 1 ?因为日志文件也将添加到服务器上。所以我需要检查至少有2个文件发送,而不仅仅是1。
(不用担心,先前的日志文件将被删除,因为镜像不会在源代码中看到它)

答案 3 :(得分:1)

如果这是一种低成本的ftp服务,我希望它是不稳定且不可靠的。为此,您可以尝试将文件传输减少到最小。

经过一番研究,我发现了git-ftp工具,它似乎最能满足您的目的-每次提交仅更改文件后,将其部署到ftp服务器。

可能值得一试。甚至预装了docker images

deploy_production:
  image: dotsunited/git-ftp
  stage: deploy
  only:
    - master
  script:
    - git ftp push -v --user $FTP_DEPLOY_USER --passwd $FTP_DEPLOY_PASSWORD $FTP_DEPLOY_HOST