Home > Software engineering >  gitlab-ci predefined is defined in script step of deploy stage but undefined inside bash script run
gitlab-ci predefined is defined in script step of deploy stage but undefined inside bash script run

Time:05-30

I am trying to deploy a branch other than the default (master) branch. For some reason the predefined variables are not visible inside the roll-out.sh script. But the echo statements before calling the script do print the variables correctly.

I have another script that rolls out the master branch. In this script it is able to run docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY with no problems.

I have tried with the branch both protected and not protected. The variables are still undefined for some reason. What I am doing wrong here?

build:
  stage: build
  image: docker:20.10.12
  services:
    - docker:20.10-dind
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH # not master branch
      allow_failure: true
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
    - docker pull $CI_REGISTRY_IMAGE/client/base:latest || true
    - docker build --cache-from $CI_REGISTRY_IMAGE/client/base:latest --cache-from $CI_REGISTRY_IMAGE/client:latest -t $CI_REGISTRY_IMAGE/client:$CI_COMMIT_BRANCH .
    - docker push $CI_REGISTRY_IMAGE/client:$CI_COMMIT_BRANCH

deploy:
  variables:
    branch: $CI_COMMIT_BRANCH
  stage: deploy
  image: alpine

  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH # not master branch

  before_script:
    - apk add openssh-client
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh

  script:
    - echo $CI_COMMIT_REF_NAME
    - echo $CI_COMMIT_BRANCH
    - echo $branch
    - ssh -o StrictHostKeyChecking=no $SERVER_USER@$DOMAIN 'bash -s' < ./script/roll_out.sh

CodePudding user response:

If you are sshing to another machine within your ci script I don’t think it would have accsess to the variables you are echoing out in the lines before because it’s a new session on a different machine.

You could try a few different things though to achieve what you want;

  1. Try to send the variables as arguments (not great sending information to a machine through ssh).

  2. Install a gitlab runner on the host you are trying to ssh to, tag this runner so it only runs the specific deployment job and then you’ll have the variables available on the host.

CodePudding user response:

The problem was solved by explicitly passing the environment variables to the script

- ssh -o StrictHostKeyChecking=no $SERVER_USER@$DOMAIN "CI_REGISTRY_IMAGE=$CI_REGISTRY_IMAGE CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH bash -s" < ./script/roll_out_tagged.sh

I had another developer with lots of experience take a look at it. He had no idea why docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY worked. That is what lead me to believe that all of the environment variables would be available on the remote. But seems like those three variables are some sort of exception.

  • Related