1

I am defining a variable JWT, I will store in it a token which I will use later inside the code. I'm going to obtain it at the before_script step through a curl call.

The problem is that when I try to run the pipeline, it fails with the error:

Found errors in your .gitlab-ci.yml: Included file .gitlab-ci.yml does not have valid YAML syntax!

I have already read this Stack Overflow answer in order to properly interpolate USER and PASS environment variables.

This is my .gitlab-ci.yml file:


build-dist:
  environment:
    name: develop
  variables:
    JWT: ""
  stage: build
  image: node:16-alpine
  cache:
    key:
      files:
        - yarn.lock
    paths:
      - node_modules
      - .yarn
  before_script:
    - if [ -z "$USER" ] || [ -z "$PASS" ]; then exit 1; fi
    - apk add curl 
    - JWT=$(curl -s -X POST -H "Content-Type: application/json" -d '{"username": "'"$USER"'","password": "'"$PASS"'"}' "https://example.com/token")

  script: 
    - yarn install --pure-lockfile --cache-folder .yarn
    - yarn build

How should I correct the follow line inside my .gitlab-ci.yml in order to make it work?

- JWT=$(curl -s -X POST -H "Content-Type: application/json" -d '{"username": "'"$USER"'","password": "'"$PASS"'"}' "https://example.com/token")

1 Answer 1

2

First, a handy tip for such GitLab CI issues:

  • assuming your have a GitLab repo on https://gitlab.com/user/project,
  • you can browse the page https://gitlab.com/user/project/-/ci/lint
  • then paste the contents of the offending .gitlab-ci.yml file, and click on "Validate" to get more feedback (typically, the error line number, etc.)

Regarding the YAML snippet at stake, the crux of the issue is the - JWT=$(…) line as you mentioned in the question, more precisely:

  • from a YAML point of view, the string JWT=… is not explicitly quoted,
  • and as this text contains a :,
  • the YAML parser then sees it as a map, i.e., as if you had written:
    - username: "NAME"
      other_key: "val"
    

To solve this, it appears you'd just need to "quote" this sequence item with ' or " and thus write a line of the form - "JWT=…", then escape the quotes accordingly inside… but I'd rather suggest (to avoid ugly escapes!) to rely on the so-called block style of YAML → this leads to:

- |
  JWT=$(curl -s -X POST -H "Content-Type: application/json" -d '{"username": "'"$USER"'","password": "'"$PASS"'"}' "https://example.com/token")
Sign up to request clarification or add additional context in comments.

1 Comment

This is exactly the problem I was facing, actually I ended up with the same solution reading the at the gitlab documentation at the section split-long-commands but this will be useful for someones

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.