如何在GitlabCI中将长命令拆分为多行

95次阅读
没有评论

问题描述

在使用GitlabCI时,遇到了一个问题。他在.gitlab-ci.yml文件中有一个非常长的命令,需要通过SSH连接到跳板主机,然后使用rsync将文件从他的仓库同步到目标主机(目标主机没有公共IP,所以需要通过跳板主机访问)。他想知道是否有办法将这个长命令拆分成多行命令。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

由于.gitlab-ci.yml是一个Yaml文件,可以使用Yaml的语法来拆分多行命令。例如,可以使用>符号来实现多行命令。以下是一个示例:

image: ubuntu
before_script:
  - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client rsync git -y )'
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - echo -e "$PRIVATE_KEY" > ~/.ssh/id_rsa
  - chmod 600 ~/.ssh/id_rsa
  - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
SSH:
  tags:
    - mytag
  script: >
    - ssh ubuntu@host "which ssh-agent || 
      ( apt-get update -y && apt-get install openssh-client rsync git -y ) && 
      ssh ubuntu@192.168.1.2 "mkdir -p /home/ubuntu/test" && 
      rsync /home/ubuntu/test/.gitlab-ci.yml ubuntu@192.168.1.2:/home/ubuntu/test/.gitlab-ci.yml"

在上面的示例中,我们使用>符号将script字段中的长命令拆分成多行。这样可以提高可读性,并且更容易编辑和维护。

方案2

另一种方法是使用bash脚本来控制命令的运行顺序。你可以在.gitlab-ci.yml文件中调用一个bash脚本,然后在脚本中编写多行命令。以下是一个示例:

image: ubuntu
before_script:
  - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client rsync git -y )'
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - echo -e "$PRIVATE_KEY" > ~/.ssh/id_rsa
  - chmod 600 ~/.ssh/id_rsa
  - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
SSH:
  tags:
    - mytag
  script:
    - bash ./script.sh

在上面的示例中,我们将多行命令放在一个名为script.sh的bash脚本中。然后,在.gitlab-ci.yml文件中调用这个脚本来执行命令。

请注意,这只是一种示例,你可以根据自己的需求编写自己的bash脚本。

方案3

如果你不想使用多行命令,也可以使用GitLab CI的before_script字段来执行一系列命令。以下是一个示例:

image: ubuntu
before_script:
  - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client rsync git -y )'
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - echo -e "$PRIVATE_KEY" > ~/.ssh/id_rsa
  - chmod 600 ~/.ssh/id_rsa
  - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
SSH:
  tags:
    - mytag
  script:
    - ssh ubuntu@host "which ssh-agent || 
      ( apt-get update -y && apt-get install openssh-client rsync git -y ) && 
      ssh ubuntu@192.168.1.2 "mkdir -p /home/ubuntu/test" && 
      rsync /home/ubuntu/test/.gitlab-ci.yml ubuntu@192.168.1.2:/home/ubuntu/test/.gitlab-ci.yml"

在上面的示例中,我们将多行命令放在before_script字段中。这样可以确保在执行script字段中的命令之前,先执行before_script中的命令。

请注意,这种方法可能会导致代码重复,因为before_script中的命令在每个job中都会执行。如果你只想在特定的job中执行这些命令,可以将它们放在该job的script字段中。

总结

以上是将长命令拆分为多行的几种方法。你可以根据自己的需求选择适合你的方法。无论你选择哪种方法,都要确保代码的可读性和可维护性。另外,建议使用GitLab的UI工具来验证.gitlab-ci.yml文件的正确性。

希望以上解决方案对你有帮助!如果你有任何问题,请随时提问。

正文完