Как использовать while l oop в разделе скрипта gitlab-ci - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь перебрать записи URL в файле и использовать каждый файл в качестве входных данных для инструмента сканирования. Его результат должен быть записан в файл.

вот файл gitlab-ci.yml:

stages:
  - test
test:
  stage: test

  tags:
    - shell-docker
  script:
    - wget https://github.com/FaKeller/sireg/releases/download/v0.3.1/sireg-linux
    - chmod 775 sireg-linux
    - mkdir output
    - ls -alF
    - while read line; do
         echo $line;
         ./sireg-linux exec --loader-sitemap-sitemap \"$line\" >> ./output/${line##*/}_out.txt;
      done < sitemap-index
    - ls -alF output
  artifacts:
    paths:
      - output/*
    expire_in: 1 hrs

и вот файл индекса карты сайта (только одна запись):

http://example.com/sitemap.xml

оба файла находятся в одном каталоге. Я ожидаю, что файл sitemap.xml_out.txt будет записан в выходную папку (также в том же каталоге). Я почти уверен, что сценарий ./sireg-linux не выполняется, потому что для его завершения обычно требуется несколько минут (проверено локально).

вывод этапа выглядит следующим образом:

2020-04-02 18:22:21 (4,26 MB/s) - »sireg-linux« saved [62566347/62566347]

$ chmod 775 sireg-linux
$ mkdir output
$ ls -alF
total 61128
drwxrwxr-x  4 gitlab-runner gitlab-runner     4096 Apr  2 18:22 ./
drwxrwxr-x 10 gitlab-runner gitlab-runner     4096 Apr  2 15:46 ../
drwxrwxr-x  5 gitlab-runner gitlab-runner     4096 Apr  2 18:22 .git/
-rw-rw-r--  1 gitlab-runner gitlab-runner      512 Apr  2 18:22 .gitlab-ci.yml
drwxrwxr-x  2 gitlab-runner gitlab-runner     4096 Apr  2 18:22 output/
-rw-rw-r--  1 gitlab-runner gitlab-runner       30 Apr  2 15:46 README.md
-rwxrwxr-x  1 gitlab-runner gitlab-runner 62566347 Nov 11  2017 sireg-linux*
-rw-rw-r--  1 gitlab-runner gitlab-runner       55 Apr  2 18:08 sitemap-index
$ while read line; do echo $line; ./sireg-linux **exec** --loader-sitemap-sitemap \"$line\" >> 
./output/${line##*/}_out.txt; done < sitemap-index
$ ls -alF output
total 8
drwxrwxr-x 2 gitlab-runner gitlab-runner 4096 Apr  2 18:22 ./
drwxrwxr-x 4 gitlab-runner gitlab-runner 4096 Apr  2 18:22 ../
Uploading artifacts...
Runtime platform                                    arch=amd64 os=linux pid=23813 revision=1f513601 version=11.10.1
WARNING: output/*: no matching files               
ERROR: No files to upload                          
Job succeeded

update

попытался переместить все шаги в отдельный скрипт, но это тоже не сработало.

update 2

забыл добавить exe c в команду:

./sireg-linux exec --loader-sitemap-sitemap \"$line\" >> 
./output/${line##*/}_out.txt;

к сожалению, это не помогло.

что я могу сделать, чтобы оно работало?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Попробуйте изменить ./sireg-linux --loader-sitemap-sitemap \"$line\" на ./sireg-linux exec --loader-sitemap-sitemap "$line". Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Кроме того, похоже, что сценарий не вводит, пока l oop вообще. Может быть, файл sitemap-index пуст или он имеет только одну строку без новой строки в конце?

РЕДАКТИРОВАТЬ 2: Обратные косые черты в командной строке неверны. исправил мой ответ

2 голосов
/ 02 апреля 2020

Конечно, вы можете мучительно отлаживать многострочные команды в YAML.

Вы даже можете использовать многострочные строки YAML:

Но я бы просто обернул код в сценарий оболочки, сохранил его в том же репозитории GitLab и просто вызвал его в .gitlab-ci.yml.
Таким образом, вы можете запускать этот сценарий одинаково как локально, так и в CI, что является наилучшей практикой при непрерывной доставке.

    - ./script.sh
...