.gitlab-ci 变量中的字符串操作

Edw*_*cer 10 gitlab-ci

我正在尝试使用一些变量设置我的 ci 文件。我能够像这样生成一个变量;

...
variables:
    TARGET_PROJECT_DIR: "${CI_PROJECT_NAME}.git"
Run Code Online (Sandbox Code Playgroud)

然而,我似乎无法做到这一点;

...
variables:
    PROJECT_PROTOCOL_RELATIVE_URL: "${CI_PROJECT_URL//https:\/\/}.git"
Run Code Online (Sandbox Code Playgroud)

如果我在 bash 中运行它,我会得到预期的输出,其中gitlab.com/my/repo/url.git删除了“https://”并附加了“.git”。

我的解决方法是将其导出到“脚本”部分,但将其添加到变量部分感觉更整洁,因为这是由实际作业继承的模板的一部分。是否可以?

Joh*_*ohn 8

在寻找类似的挑战后,我发现你的问题没有得到解答。以下是我的建议:

    stages:          
      - todo

    todo-job:
      stage: todo
    only:
      - master
    script:
      #your question / example
      - echo ${CI_PROJECT_URL}
      - echo ${CI_PROJECT_URL:8:100}.git

      #Because you have the word manipulation in the title, I have some more examples:

      #Return substring between the two '_' 
      - INPUT="someletters_12345_moreleters.ext"
      - SUBSTRING=`expr match "$INPUT" '.*_\([[:digit:]]*\)_.*' `  
      - echo $SUBSTRING
    
      #Store a substring in a new variable and create an output
      - b=${INPUT:12:5}
      - echo $b
    
      #Substring using grep with regex (more readable)
      - your_number=$(echo "someletters_12345_moreleters.ext" | grep -E -o '[0-9]{5}')
      - echo $your_number

      #Substring using variable and 'grep' with regex (more readable)
      - your_number=$(echo "$INPUT" | grep -E -o '[0-9]{5}')
      - echo $your_number

      #split a string and return a part using 'cut'
      - your_id=$(echo "Release V14_TEST-42" | cut -d "_" -f2 )
      - echo $your_id

      #split the string of a variable and return a part using 'cut'
      - VAR="Release V14_TEST-42"
      - your_number=$(echo "$VAR" | cut -d "_" -f2 )
      - echo $your_number
Run Code Online (Sandbox Code Playgroud)

Gitlab 输出如下所示:

    $ echo ${CI_PROJECT_URL}
    https://gitlab.com/XXXXXXXXXX/gitlab_related_projects/test
    $ echo ${CI_PROJECT_URL:8:100}.git
    gitlab.com/XXXXXXXXXX/gitlab_related_projects/test.git
    $ INPUT="someletters_12345_moreleters.ext"
    $ SUBSTRING=`expr match "$INPUT" '.*_\([[:digit:]]*\)_.*' `
    $ echo $SUBSTRING
    12345
    $ b=${INPUT:12:5}
    $ echo $b
    12345
    $ your_number=$(echo "someletters_12345_moreleters.ext" | grep -E -o '[0-9]{5}')
    $ echo $your_number
    12345
    $ your_number=$(echo "$INPUT" | grep -E -o '[0-9]{5}')
    $ echo $your_number
    12345
    $ your_number=$(echo "Release V14_TEST-42" | cut -d "_" -f2 )
    $ echo $your_number
    TEST-42
    $ VAR="Release V14_TEST-42"
    $ your_number=$(echo "$VAR" | cut -d "_" -f2 )
    $ echo $your_number
    TEST-42
    Cleaning up project directory and file based variables
    00:01
    Job succeeded
Run Code Online (Sandbox Code Playgroud)


Chr*_*oph 2

GitLab CI 环境中定义了几个更有用的变量。

CI_PROJECT_PATH为您提供<namespace>/<project name>(或者<project name>如果您没有额外的命名空间)字符串并 CI_SERVER_HOST为您提供服务器名称,因此您可以这样做

variables:
  PROJECT_PROTOCOL_RELATIVE_URL: ${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git
Run Code Online (Sandbox Code Playgroud)

我有类似的设置(也没有引号)。

我不确定这是否适合您,因为我的跑步者和服务器在我的控制之下,并且我不使用外部项目运行管道。但是您可以通过运行如下作业来获取作业日志中显示的所有可用变量:

stages:
  - env

show-env:
  stage: env
  script:
    - env
Run Code Online (Sandbox Code Playgroud)

https://docs.gitlab.com/ee/ci/variables/predefined_variables.html也总是有帮助的