GitLab CI YAML报错:不允许映射值,静态站FTP部署求助
解决GitLab CI YAML "Mapping values are not allowed in this context" 错误
嘿,我帮你排查下这个问题!你遇到的错误是因为.gitlab-ci.yml的YAML语法出了问题,具体来说是重复键和缩进结构错误导致的。
错误原因分析
你的配置里犯了两个核心语法错误:
- 重复的键名:你先把整个job命名为
deploy:,然后在job内部又写了一行deploy:,YAML不允许同一个层级出现重复的键,这直接触发了"Mapping values are not allowed in this context"错误。 - 缩进不规范:YAML对缩进要求严格,需要保证每个层级的缩进一致(通常用2个空格),你的配置里也存在缩进混乱的问题。
修正后的完整配置
下面是调整后的正确配置,我还优化了安全性(避免明文密码):
deploy: stage: deploy only: - master script: - apt-get update -qq && apt-get install -y -qq lftp - lftp -u $FTP_LOGIN,$FTP_PASS ftp.server -e "mirror -e -R -x .git -x excl.txt -x exclude-1 -x exclude-2 -x README.md -p ./ mysite/www/ ; quit"
配置细节说明
- 顶层
deploy::这是唯一的job名称,不会和内部字段重复。 stage: deploy:指定这个job属于流水线的deploy阶段(GitLab CI默认支持这个阶段,无需额外配置)。only: - master:确保只有向master分支提交代码时,才会触发这个部署job。script命令块:- 第一行更新apt源并安装lftp工具,
-qq参数用来减少冗余输出,避免日志混乱。 - 第二行的lftp命令里,我把你原来的明文账号密码换成了GitLab环境变量
$FTP_LOGIN和$FTP_PASS——绝对不要在配置文件里写明文密码,你可以在GitLab项目的「Settings → CI/CD → Variables」中添加这两个变量,GitLab会自动安全地注入它们。 - 你原来的
mirror命令参数是正确的:-e会删除FTP上本地已不存在的文件,-R表示反向镜像(本地→远程),-x用来排除指定文件/目录,-p保留文件权限,最后指定本地目录./和远程目录mysite/www/,执行完成后退出lftp。
- 第一行更新apt源并安装lftp工具,
额外注意事项
- 如果你用的是GitLab共享Runner,默认支持apt安装工具,无需额外权限。
- 可以先在本地手动运行
lftp命令,确认能正常连接FTP服务器并同步文件,避免因为FTP权限、路径错误导致后续问题。
内容的提问来源于stack exchange,提问作者sw0rl0k
相关产品推荐
相关产品推荐

