gitlab ci不起作用:runner无法计算$expression



在下面的gitlab-ci.yml文件中,我使用项目的提交哈希作为其docker容器的标记。它应该做以下事情:

服务器上的
  1. ssh
  2. 将当前本地提交的哈希保存到名为current的文件中
  3. 将新哈希拉入并保存到名为new的文件中
  4. 从现有备份docker容器的标签中获取哈希,并将其保存到old
  5. 移除旧的docker容器
  6. 将最后一个当前重新标记为新的旧的
  7. 使用new中的最新哈希创建新容器
# Setup SSH deploy keys
before_script:
- apt-get update -qq
- apt-get install -qq git
- 'which ssh-agent || ( apt-get install -qq openssh-client )'
- eval $(ssh-agent -s)
- mkdir -p ~/.ssh
- echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null
- '[[ -f /.dockerenv ]] && echo -e "Host *ntStrictHostKeyChecking nonn" > ~/.ssh/config'
stages:
- update
- create
update_project:
stage: update
script:
- ssh $SSH_CONNECTION "cd /$PROJECT_NAME && git rev-parse --short HEAD > current && git checkout $BRANCH && git reset --hard && git pull origin $BRANCH && git rev-parse --short HEAD > new && exit"
create_docker_container:
stage: create
script:
- ssh $SSH_CONNECTION "cd /$PROJECT_NAME && docker images ${PROJECT_NAME}_old --format='{{ .Tag }}' > old && docker image rm ${PROJECT_NAME}_old:$(< old) && docker tag ${PROJECT_NAME}:$(< current) ${PROJECT_NAME}_old:$(< current) && docker image rm ${PROJECT_NAME}:$(< current) && docker build -t ${PROJECT_NAME}:$(< new) . && exit"

正如你所看到的,例如在${PROJECT_NAME}_old:$(< old)中,我使用$(< x)访问整个yml文件中的本地文件newcurrentold,这并没有按预期工作。我的gitlab ci失败了:

Running with gitlab-runner 12.9.0 (4c96e5ad)
on test abc123yz
Preparing the "docker" executor
Using Docker executor with image python:3.8.8-slim-buster ...
Pulling docker image python:3.8.8-slim-buster ...
Using docker image sha256:d97718c69437f6fcb5dd4588fc35ebfa2de7bfe536d0ce7d859d26f48e9ac840 for python:3.8.8-slim-buster ...
Preparing environment
Running on runner-yetZ9g1t-project-799-concurrent-0 via computer...
Getting source from Git repository
Fetching changes with git depth set to 50...
Reinitialized existing Git repository in /builds/user/myproject/.git/
Checking out 123abc45 as master...
Skipping Git submodules setup
Restoring cache
Downloading artifacts
Running before_script and script
...
$ ssh $SSH_CONNECTION "cd /$PROJECT_NAME && docker images ${PROJECT_NAME}_old --format='{{ .Tag }}' > old && docker image rm ${PROJECT_NAME}_old:$(< old) && docker tag ${PROJECT_NAME}:$(< current) ${PROJECT_NAME}_old:$(< current) && docker image rm ${PROJECT_NAME}:$(< current) && docker build -t ${PROJECT_NAME}:$(< new) . && exit"
/bin/bash: line 123: old: No such file or directory
/bin/bash: line 123: current: No such file or directory
/bin/bash: line 123: current: No such file or directory
/bin/bash: line 123: current: No such file or directory
/bin/bash: line 123: new: No such file or directory
Error response from daemon: invalid reference format
Running after_script
Uploading artifacts for failed job
ERROR: Job failed: exit code 1

我的gitlab运行程序似乎无法评估$(< x)。如果我一个接一个地手动尝试完全相同的步骤,一切都会很好。我做错什么了吗?我在这里还能用什么?

首先,如本线程所示,我将仔细检查ssh元素的权限:

  • chmod 700用于~/.ssh
  • chmod 600用于~/.ssh/id_rsa

如果也可以做一个简单的:

ssh $SSH_CONNECTION "hostname;pwd;id -a;ls"

只是为了检查SSH连接是否正常工作。

关于通过SSH执行的命令,我更喜欢在服务器上创建/复制的脚本(您正在向其传递参数(,而不是一个长而复杂的命令,正如您所看到的,它涉及到shell正确解释的问题。

相关内容

最新更新