gpt4 book ai didi

bash - Gitlab CI在拉取源之前检查目录是否存在

转载 作者:行者123 更新时间:2023-12-05 00:56:04 26 4
gpt4 key购买 nike

我正在尝试使用 gitlab ci runner 将我的 flask 应用程序部署到 AWS EC2 实例。

.gitlab.ci.yml

stages:
- test
- deploy

test_app:
image: python:latest
stage: test
before_script:
- python -V
- pip install virtualenv
- virtualenv env
- source env/bin/activate
- pip install flask
script:
- cd flask-ci-cd
- python test.py

prod-deploy:
stage: deploy
only:
- master # Run this job only on changes for stage branch

before_script:
- mkdir -p ~/.ssh
- echo -e "$RSA_KEY" > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'

script:
- bash .gitlab-deploy-prod.sh

environment:
name: deploy

.gitlab-deploy-prod.sh

#!/bin/bash

# Get servers list
set -f

# access server terminal
shell="ssh -o StrictHostKeyChecking=no ${SERVER_URL}"
git_token=$DEPLOY_TOKEN

echo "Deploy project on server ${SERVER_URL}"
if [ ${shell} -d "/flask-ci-cd" ] # check if directory exists
then
eval "${shell} cd flask-ci-cd && git clone https://sbhusal123:${git_token}@gitlab.com/sbhusal123/flask-ci-cd.git master && cd flask-ci-cd"
else
eval "${shell} git pull https://sbhusal123:${git_token}@gitlab.com/sbhusal123/flask-ci-cd.git master && cd flask-ci-cd && cd flask-ci-cd"
fi

Error: .gitlab-deploy-prod.sh: line 7: -o: command not found

如何检查目录是否存在?

What i've tried.

#!/bin/bash

# Get servers list
set -f

# access server terminal
shell="ssh -o StrictHostKeyChecking=no ${SERVER_URL}"
git_token=$DEPLOY_TOKEN

eval "${shell}" # i thought gitlab would provide me with shell access
echo "Deploy project on server ${SERVER_URL}"

if [-d "/flask-ci-cd" ] # check if directory exists
then
eval "cd flask-ci-cd && git clone https://sbhusal123:${git_token}@gitlab.com/sbhusal123/flask-ci-cd.git master && cd flask-ci-cd"
else
eval "git pull https://sbhusal123:${git_token}@gitlab.com/sbhusal123/flask-ci-cd.git master && cd flask-ci-cd && cd flask-ci-cd"
fi

我已经尝试登录 ssh shell,然后再执行 if else 中的脚本。但它并没有按预期的方式工作。

最佳答案

  1. 您的脚本有一些错误。
  2. 不要使用 eval。不, eval 不是那样工作的。 eval is evil
  3. 将命令存储到变量时,不要使用普通变量。改用 bash 数组来保留“单词”。
  4. 通过 ssh 传递的命令是双重转义的。我建议更喜欢使用 here documents ,它们更容易获得正确的引用。请注意此处文档分隔符是否被引用时的扩展差异。
  5. 我认为 gitlab 会为我提供 shell 访问权限 不,如果没有开放的标准输入,远程 shell 将终止,因为它会从输入中读取 EOF。不,这样不行。
  6. 无需进行许多远程连接,只需将执行转移到远程端一次并在那里完成所有工作。
  7. 花点时间研究一下 quotingword splitting在 shell 中工作。
  8. git_token=$DEPLOY_TOKEN 不,设置变量不会导出到远程 shell。在调用远程端之前手动传递它们或扩展它们。 (或者您也可以使用 ssh -o SendEnv=git_token 并使用 AcceptEnv=git_token 配置远程 ssh,我认为,从未尝试过。
  9. 阅读您使用的实用程序的文档。
  10. 没有,git clone在 url 之后不采用分支名称。您可以使用 --branch-b 选项指定分支。在 url 之后,它需要目录名称。请参阅 git clone --helpgit pull 相同.

How can i check if directory existing??

使用 bash 数组来存储命令。直接在远端执行test命令检查目录是否存在。

shell=(ssh -o StrictHostKeyChecking=no "${SERVER_URL}")
if "${shell[@]}" [ -d "/flask-ci-cd" ]; then
...

如果目录名称带有空格,我会选择:

if "${shell[@]}" sh <<'EOF'
[ -d "/directory with spaces" ]
EOF
then

set -x 传递给 sh 以查看远程端发生了什么。

对于您的脚本,请尝试将执行移至远程端 - 建立 3 个单独的连接几乎没有逻辑。我说只是

echo "Deploy project on server ${SERVER_URL}"
ssh -o StrictHostKeyChecking=no "${SERVER_URL}" bash <<EOF
if [ ! -d /flask-ci-cd ]; then
# Note: git_token is expanded on host side
git clone https://sbhusal123:${git_token}@gitlab.com/sbhusal123/flask-ci-cd.git /flask-ci-cd
fi
cd /flask-ci-cd
git pull
EOF

但不是在某些情况下正确引用,而是使用 declare -pdeclare -f 将正确引用的内容传输到远程端。这样您就不需要正确引用的案例 - 它会自然而然地工作:

echo "Deploy project on server ${SERVER_URL}"
work() {
if [ ! -d /flask-ci-cd ]; then
# Note: git_token is expanded on host side
git clone https://sbhusal123:"${git_token}"@gitlab.com/sbhusal123/flask-ci-cd.git /flask-ci-cd
fi
cd /flask-ci-cd
git pull
{
ssh -o StrictHostKeyChecking=no "${SERVER_URL}" bash <<EOF
$(declare -p git_token) # transfer variables you need
$(declare -f work) # transfer function you need
work # call the function.
EOF

关于bash - Gitlab CI在拉取源之前检查目录是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62999534/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com