当我们在服务器上进行新的修改时,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上发送已提交的文件...
有点奇怪...如果没有文件更改,我该如何使用管道^^ ??
你知道发生什么事了吗?
谢谢
问候,
尼古拉斯
答案 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