gitlab CI 中的 LFTP:文件不会在 FTP 服务器上更新,即使它们在上次提交中已更改
LFTP in gitlab CI: files are not updated on FTP server even if they are changed in the last commit
当我们在服务器上提交新修改时,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...
上发送
这有点奇怪...如果没有文件更改,我怎么会有管道^^ ??
你知道发生了什么事吗?
谢谢,
此致,
尼古拉斯
我上一期的附加日志。 gitLab中更新的相关文件是trombi/index.php,在日志中没有出现...而在服务器上,完全没有变化:
$ bash ./deploy.sh
*** Déploiement de xxx - start:
*** Target branche:
*** ./www/xxxDev
*** voir le resultat sur: xxx/Dev
*** Install client FTP
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package libtcl8.6:amd64.
(Reading database ... 23968 files and directories currently installed.)
Preparing to unpack .../libtcl8.6_8.6.9+dfsg-2_amd64.deb ...
Unpacking libtcl8.6:amd64 (8.6.9+dfsg-2) ...
Selecting previously unselected package tcl8.6.
Preparing to unpack .../tcl8.6_8.6.9+dfsg-2_amd64.deb ...
Unpacking tcl8.6 (8.6.9+dfsg-2) ...
Selecting previously unselected package tcl-expect:amd64.
Preparing to unpack .../tcl-expect_5.45.4-2_amd64.deb ...
Unpacking tcl-expect:amd64 (5.45.4-2) ...
Selecting previously unselected package expect.
Preparing to unpack .../expect_5.45.4-2_amd64.deb ...
Unpacking expect (5.45.4-2) ...
Selecting previously unselected package lftp.
Preparing to unpack .../lftp_4.8.4-2_amd64.deb ...
Unpacking lftp (4.8.4-2) ...
Setting up lftp (4.8.4-2) ...
Setting up libtcl8.6:amd64 (8.6.9+dfsg-2) ...
Setting up tcl8.6 (8.6.9+dfsg-2) ...
Setting up tcl-expect:amd64 (5.45.4-2) ...
Setting up expect (5.45.4-2) ...
Processing triggers for mime-support (3.62) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...
Processing triggers for libc-bin (2.28-10) ...
*** Copy file to target
Mirroring directory `.gitlab'
Mirroring directory `adm'
Mirroring directory `xxx'
Mirroring directory `communaute'
Mirroring directory `conso'
Mirroring directory `cron'
Mirroring directory `css'
Mirroring directory `doc'
Mirroring directory `eve'
Mirroring directory `img'
Finished mirror `img'
Mirroring directory `js'
Mirroring directory `ad/comi'
Mirroring directory `comm/img'
Finished mirror `conso'
Mirroring directory `materiel'
Finished mirror `js'
Mirroring directory `monCompte'
Mirroring directory `.gitlab/issue_templates'
Finished mirror `association'
Mirroring directory `money'
Finished mirror `css'
Mirroring directory `xxx'
Mirroring directory `documents/parsedown-contents'
Mirroring directory `events/championnats'
Finished mirror `cron'
Mirroring directory `proto'
Finished mirror `adm/comite'
Mirroring directory `adm/doc-legaux'
Finished mirror `communaute/img'
Mirroring directory `communaute/jou'
Finished mirror `materiel'
Mirroring directory `public'
Finished mirror `.gitlab/issue_templates'
Finished mirror `.gitlab'
Mirroring directory `te'
Finished mirror `monCompte'
Mirroring directory `webServices'
Finished mirror `xxx'
Mirroring directory `admin/emails'
Finished mirror `documents/parsedown-contents'
Mirroring directory `documents/parsedown-master'
Mirroring directory `money/cotisations'
Finished mirror `events/championnats'
Mirroring directory `events/festivals'
Mirroring directory `proto/auth'
Finished mirror `adm/do'
Mirroring directory `adn/jeux'
Finished mirror `communaute/jou'
Mirroring directory `communaute/mem'
Mirroring directory `public/noel'
Mirroring directory `te/con'
Finished mirror `adm/emails'
Mirroring directory `adm/ppp'
Finished mirror `events/fest'
Mirroring directory `events/tour'
Finished mirror `proto/auth'
Finished mirror `proto'
Mirroring directory `money/devis'
Mirroring directory `communaute/membres/Ajouter'
Finished mirror `te/cont'
Finished mirror `te'
Mirroring directory `communaute/membres/messageCollectif'
Finished mirror `adm/popp'
Mirroring directory `adm/reglement-interieur'
Finished mirror `events/tour'
Finished mirror `events'
Mirroring directory `communaute/membres/trombi'
Finished mirror `communaute/membres/Ajouter'
Mirroring directory `communaute/membres/urgence'
Finished mirror `communaute/membres/messageCollectif'
Mirroring directory `communaute/outils'
Finished mirror `adm/reglement-interieur'
Mirroring directory `admin/roles-engagements-avantages'
Finished mirror `communaute/membres/trombi'
Mirroring directory `communaute/partenaires'
Mirroring directory `public/noel/css'
Finished mirror `communaute/membres/urgence'
Finished mirror `communaute/membres'
Mirroring directory `communaute/sponsors'
Mirroring directory `communaute/outils/association'
Finished mirror `admin/roles-engagements-avantages'
Mirroring directory `admin/settings'
Finished mirror `communaute/partenaires'
Mirroring directory `communaute/outils/classements'
Finished mirror `public/noel/css'
Mirroring directory `public/noel/fonts'
Finished mirror `communaute/sponsors'
Mirroring directory `communaute/outils/smash-rules-sets'
Finished mirror `communaute/outils/association'
Mirroring directory `communaute/outils/teams'
Finished mirror `admin/settings'
Mirroring directory `public/noel/img'
Finished mirror `communaute/outils/classements'
Mirroring directory `public/noel/js'
Mirroring directory `wwws/compte'
Mirroring directory `money/cotisations/fiches'
Finished mirror `admin/jeux'
Finished mirror `documents/parsedown-master'
Finished mirror `admin'
Finished mirror `documents'
Mirroring directory `money/img'
Mirroring directory `money/note2Frais'
Finished mirror `public/noel/fonts'
Mirroring directory `money/tresorerie'
Finished mirror `communaute/outils/smash-rules-sets'
Mirroring directory `wwws/database'
Finished mirror `communaute/outils/teams'
Finished mirror `communaute/outils'
Finished mirror `communaute'
Mirroring directory `wwws/devis'
Finished mirror `public/noel/img'
Mirroring directory `wwws/discord'
Finished mirror `public/noel/js'
Finished mirror `public/noel'
Finished mirror `public'
Mirroring directory `wwws/email'
Finished mirror `money/cotisations/fiches'
Finished mirror `money/cotisations'
Mirroring directory `wwws/emoji'
Finished mirror `wwws/compte'
Mirroring directory `wwws/files'
Finished mirror `money/img'
Mirroring directory `wwws/googleMaps'
Mirroring directory `money/note2Frais/min'
Finished mirror `money/tresorerie'
Mirroring directory `money/note2Frais/dons'
Finished mirror `wwws/devis'
Mirroring directory `wwws/jou'
Finished mirror `wwws/discord'
Mirroring directory `wwws/membres'
Finished mirror `money/devis'
Mirroring directory `wwws/permissions'
Finished mirror `wwws/dda'
Mirroring directory `wwws/public'
Finished mirror `wwws/email'
Mirroring directory `wwws/resssppp'
Finished mirror `wwws/emoji'
Finished mirror `wwws/googleMaps'
Finished mirror `wwws/files'
Finished mirror `mon/note2Frais/aport'
Finished mirror `mon/note2Frais/dons'
Finished mirror `mon/note2Frais'
Finished mirror `mon'
Finished mirror `wwws/jou'
Finished mirror `wwws/membres'
Finished mirror `wwws/public'
Finished mirror `wwws/permissions'
Finished mirror `wwws/resetPasswords'
Finished mirror `wwws'
*** End
********* ATTENTION si pas de ligne entre 'End' et 'Copy file to target' alors il faut re lancer le déploiement
Running after script
00:02
Saving cache
00:02
Uploading artifacts for successful job
00:01
Job succeeded
我确认,对于已更新文件的提交,管道是 运行:
Running with gitlab-runner 12.9.0-rc1 (a350f628)
on docker-auto-scale ed2dce3a
Preparing the "docker+machine" executor
00:32
Using Docker executor with image ruby:2.5 ...
Pulling docker image ruby:2.5 ...
Using docker image sha256:5a76bd71024b1c46b1e8871b205d025b03abe85ea for ruby:2.5 ...
Preparing environment
00:05
Running on runner-ed2dce3a-project-10794060-concurrent-0 via runner-ed2dce3a-srm-1584724660-6891f84d...
Getting source from Git repository
00:03
$ eval "$CI_PRE_CLONE_SCRIPT"
Fetching changes...
Initialized empty Git repository in /builds/xxx/prod/.git/
Created fresh repository.
From https://gitlab.com/xxx/prod
* [new ref] refs/pipelines/128249282 -> refs/pipelines/128249282
* [new branch] develop -> origin/develop
* [new branch] master -> origin/master
Checking out 0f5997df as develop...
并且提交 0f5997df 包含:
Showing 1 changed file with 3 additions and 3 deletions
我建议在 deploy.sh
的开头添加 set -euo pipefail
这样管道就不会忽略脚本错误。你说无论命令结果如何,状态总是成功。
看起来其他人对 missing output from LFTP, there is a suggestion to use unbuffer to solve this problem. Note that this might require installation of expect 包有问题。
您也可以尝试提高详细级别 -v/-vv/-vvv
以查看真正出了什么问题。
更新:
我的建议是使用 apt-get 安装 expect
包,并使用 unbuffer
命令和 lftp 以确保所有日志都刷新到控制台。
您可以尝试更新 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 ..."
错误仍然存在
目前,我只找到一种解决方法,使用此代码在需要时警告我:
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
我测试是否有更新文件,如果没有更新文件(count < 2, count=1 or 0) exit 1;为了强制用户重新部署...
但是开发人员仍然必须创建一个新的提交,而不仅仅是重新启动管道。
为什么是 -lt 2 而不是 1?因为日志文件也会添加到服务器上。所以我需要检查至少发送了 2 个文件,而不仅仅是 1 个。
(不用担心,之前的日志文件会被移除,因为镜像在源代码中看不到)
如果这是 lower-cost 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
最后,我最终决定将我的项目从 gitlab 转移到 github。
CI/CD 几乎相同,除了 need/possibility 将 yaml 文件拆分到每个目标环境中。
这就是我所做的,一个文件用于开发,另一个用于生产。
两个文件的内容差不多,我给你看DEV文件的内容,唯一不同的是URL_DEV secret value
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 共享运行器分钟而导致的限制
再见 GitLab,你好 GitHub...感谢所有帮助我找到解决方案的人
当我们在服务器上提交新修改时,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...
上发送
这有点奇怪...如果没有文件更改,我怎么会有管道^^ ??
你知道发生了什么事吗?
谢谢,
此致,
尼古拉斯
我上一期的附加日志。 gitLab中更新的相关文件是trombi/index.php,在日志中没有出现...而在服务器上,完全没有变化:
$ bash ./deploy.sh
*** Déploiement de xxx - start:
*** Target branche:
*** ./www/xxxDev
*** voir le resultat sur: xxx/Dev
*** Install client FTP
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package libtcl8.6:amd64.
(Reading database ... 23968 files and directories currently installed.)
Preparing to unpack .../libtcl8.6_8.6.9+dfsg-2_amd64.deb ...
Unpacking libtcl8.6:amd64 (8.6.9+dfsg-2) ...
Selecting previously unselected package tcl8.6.
Preparing to unpack .../tcl8.6_8.6.9+dfsg-2_amd64.deb ...
Unpacking tcl8.6 (8.6.9+dfsg-2) ...
Selecting previously unselected package tcl-expect:amd64.
Preparing to unpack .../tcl-expect_5.45.4-2_amd64.deb ...
Unpacking tcl-expect:amd64 (5.45.4-2) ...
Selecting previously unselected package expect.
Preparing to unpack .../expect_5.45.4-2_amd64.deb ...
Unpacking expect (5.45.4-2) ...
Selecting previously unselected package lftp.
Preparing to unpack .../lftp_4.8.4-2_amd64.deb ...
Unpacking lftp (4.8.4-2) ...
Setting up lftp (4.8.4-2) ...
Setting up libtcl8.6:amd64 (8.6.9+dfsg-2) ...
Setting up tcl8.6 (8.6.9+dfsg-2) ...
Setting up tcl-expect:amd64 (5.45.4-2) ...
Setting up expect (5.45.4-2) ...
Processing triggers for mime-support (3.62) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...
Processing triggers for libc-bin (2.28-10) ...
*** Copy file to target
Mirroring directory `.gitlab'
Mirroring directory `adm'
Mirroring directory `xxx'
Mirroring directory `communaute'
Mirroring directory `conso'
Mirroring directory `cron'
Mirroring directory `css'
Mirroring directory `doc'
Mirroring directory `eve'
Mirroring directory `img'
Finished mirror `img'
Mirroring directory `js'
Mirroring directory `ad/comi'
Mirroring directory `comm/img'
Finished mirror `conso'
Mirroring directory `materiel'
Finished mirror `js'
Mirroring directory `monCompte'
Mirroring directory `.gitlab/issue_templates'
Finished mirror `association'
Mirroring directory `money'
Finished mirror `css'
Mirroring directory `xxx'
Mirroring directory `documents/parsedown-contents'
Mirroring directory `events/championnats'
Finished mirror `cron'
Mirroring directory `proto'
Finished mirror `adm/comite'
Mirroring directory `adm/doc-legaux'
Finished mirror `communaute/img'
Mirroring directory `communaute/jou'
Finished mirror `materiel'
Mirroring directory `public'
Finished mirror `.gitlab/issue_templates'
Finished mirror `.gitlab'
Mirroring directory `te'
Finished mirror `monCompte'
Mirroring directory `webServices'
Finished mirror `xxx'
Mirroring directory `admin/emails'
Finished mirror `documents/parsedown-contents'
Mirroring directory `documents/parsedown-master'
Mirroring directory `money/cotisations'
Finished mirror `events/championnats'
Mirroring directory `events/festivals'
Mirroring directory `proto/auth'
Finished mirror `adm/do'
Mirroring directory `adn/jeux'
Finished mirror `communaute/jou'
Mirroring directory `communaute/mem'
Mirroring directory `public/noel'
Mirroring directory `te/con'
Finished mirror `adm/emails'
Mirroring directory `adm/ppp'
Finished mirror `events/fest'
Mirroring directory `events/tour'
Finished mirror `proto/auth'
Finished mirror `proto'
Mirroring directory `money/devis'
Mirroring directory `communaute/membres/Ajouter'
Finished mirror `te/cont'
Finished mirror `te'
Mirroring directory `communaute/membres/messageCollectif'
Finished mirror `adm/popp'
Mirroring directory `adm/reglement-interieur'
Finished mirror `events/tour'
Finished mirror `events'
Mirroring directory `communaute/membres/trombi'
Finished mirror `communaute/membres/Ajouter'
Mirroring directory `communaute/membres/urgence'
Finished mirror `communaute/membres/messageCollectif'
Mirroring directory `communaute/outils'
Finished mirror `adm/reglement-interieur'
Mirroring directory `admin/roles-engagements-avantages'
Finished mirror `communaute/membres/trombi'
Mirroring directory `communaute/partenaires'
Mirroring directory `public/noel/css'
Finished mirror `communaute/membres/urgence'
Finished mirror `communaute/membres'
Mirroring directory `communaute/sponsors'
Mirroring directory `communaute/outils/association'
Finished mirror `admin/roles-engagements-avantages'
Mirroring directory `admin/settings'
Finished mirror `communaute/partenaires'
Mirroring directory `communaute/outils/classements'
Finished mirror `public/noel/css'
Mirroring directory `public/noel/fonts'
Finished mirror `communaute/sponsors'
Mirroring directory `communaute/outils/smash-rules-sets'
Finished mirror `communaute/outils/association'
Mirroring directory `communaute/outils/teams'
Finished mirror `admin/settings'
Mirroring directory `public/noel/img'
Finished mirror `communaute/outils/classements'
Mirroring directory `public/noel/js'
Mirroring directory `wwws/compte'
Mirroring directory `money/cotisations/fiches'
Finished mirror `admin/jeux'
Finished mirror `documents/parsedown-master'
Finished mirror `admin'
Finished mirror `documents'
Mirroring directory `money/img'
Mirroring directory `money/note2Frais'
Finished mirror `public/noel/fonts'
Mirroring directory `money/tresorerie'
Finished mirror `communaute/outils/smash-rules-sets'
Mirroring directory `wwws/database'
Finished mirror `communaute/outils/teams'
Finished mirror `communaute/outils'
Finished mirror `communaute'
Mirroring directory `wwws/devis'
Finished mirror `public/noel/img'
Mirroring directory `wwws/discord'
Finished mirror `public/noel/js'
Finished mirror `public/noel'
Finished mirror `public'
Mirroring directory `wwws/email'
Finished mirror `money/cotisations/fiches'
Finished mirror `money/cotisations'
Mirroring directory `wwws/emoji'
Finished mirror `wwws/compte'
Mirroring directory `wwws/files'
Finished mirror `money/img'
Mirroring directory `wwws/googleMaps'
Mirroring directory `money/note2Frais/min'
Finished mirror `money/tresorerie'
Mirroring directory `money/note2Frais/dons'
Finished mirror `wwws/devis'
Mirroring directory `wwws/jou'
Finished mirror `wwws/discord'
Mirroring directory `wwws/membres'
Finished mirror `money/devis'
Mirroring directory `wwws/permissions'
Finished mirror `wwws/dda'
Mirroring directory `wwws/public'
Finished mirror `wwws/email'
Mirroring directory `wwws/resssppp'
Finished mirror `wwws/emoji'
Finished mirror `wwws/googleMaps'
Finished mirror `wwws/files'
Finished mirror `mon/note2Frais/aport'
Finished mirror `mon/note2Frais/dons'
Finished mirror `mon/note2Frais'
Finished mirror `mon'
Finished mirror `wwws/jou'
Finished mirror `wwws/membres'
Finished mirror `wwws/public'
Finished mirror `wwws/permissions'
Finished mirror `wwws/resetPasswords'
Finished mirror `wwws'
*** End
********* ATTENTION si pas de ligne entre 'End' et 'Copy file to target' alors il faut re lancer le déploiement
Running after script
00:02
Saving cache
00:02
Uploading artifacts for successful job
00:01
Job succeeded
我确认,对于已更新文件的提交,管道是 运行:
Running with gitlab-runner 12.9.0-rc1 (a350f628)
on docker-auto-scale ed2dce3a
Preparing the "docker+machine" executor
00:32
Using Docker executor with image ruby:2.5 ...
Pulling docker image ruby:2.5 ...
Using docker image sha256:5a76bd71024b1c46b1e8871b205d025b03abe85ea for ruby:2.5 ...
Preparing environment
00:05
Running on runner-ed2dce3a-project-10794060-concurrent-0 via runner-ed2dce3a-srm-1584724660-6891f84d...
Getting source from Git repository
00:03
$ eval "$CI_PRE_CLONE_SCRIPT"
Fetching changes...
Initialized empty Git repository in /builds/xxx/prod/.git/
Created fresh repository.
From https://gitlab.com/xxx/prod
* [new ref] refs/pipelines/128249282 -> refs/pipelines/128249282
* [new branch] develop -> origin/develop
* [new branch] master -> origin/master
Checking out 0f5997df as develop...
并且提交 0f5997df 包含:
Showing 1 changed file with 3 additions and 3 deletions
我建议在 deploy.sh
的开头添加 set -euo pipefail
这样管道就不会忽略脚本错误。你说无论命令结果如何,状态总是成功。
看起来其他人对 missing output from LFTP, there is a suggestion to use unbuffer to solve this problem. Note that this might require installation of expect 包有问题。
您也可以尝试提高详细级别 -v/-vv/-vvv
以查看真正出了什么问题。
更新:
我的建议是使用 apt-get 安装 expect
包,并使用 unbuffer
命令和 lftp 以确保所有日志都刷新到控制台。
您可以尝试更新 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 ..."
错误仍然存在 目前,我只找到一种解决方法,使用此代码在需要时警告我:
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
我测试是否有更新文件,如果没有更新文件(count < 2, count=1 or 0) exit 1;为了强制用户重新部署...
但是开发人员仍然必须创建一个新的提交,而不仅仅是重新启动管道。
为什么是 -lt 2 而不是 1?因为日志文件也会添加到服务器上。所以我需要检查至少发送了 2 个文件,而不仅仅是 1 个。
(不用担心,之前的日志文件会被移除,因为镜像在源代码中看不到)
如果这是 lower-cost 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
最后,我最终决定将我的项目从 gitlab 转移到 github。 CI/CD 几乎相同,除了 need/possibility 将 yaml 文件拆分到每个目标环境中。
这就是我所做的,一个文件用于开发,另一个用于生产。 两个文件的内容差不多,我给你看DEV文件的内容,唯一不同的是URL_DEV secret value
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 共享运行器分钟而导致的限制
再见 GitLab,你好 GitHub...感谢所有帮助我找到解决方案的人