gitlab-ci.yml 可以将其变量共享给 ssh 吗?

can gitlab-ci.yml share its variables to ssh?

我正在尝试通过 GitLab CI 将我的 Docker 图像部署到服务器。我在 yml 文件中设置了变量,并通过 SSH 连接到我的服务器。是否可以在 yml 文件中自动使用变量,还是必须将它们一一传递给 SSH?

另外,我想知道是否有比我的方式更好的部署方式。

deploy:
  image: alpine
  variables:
    #this may be overridden by parent pipeline, or it will be latest
    my_nginx: registry.gitlab.com/myprofile/nginx:latest 
  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:
    - scp -o StrictHostKeyChecking=no docker-compose.yml $HOST:~
    - >
      ssh -o StrictHostKeyChecking=no $HOST "
      echo "$CI_JOB_TOKEN"  | docker login -u "$CI_REGISTRY_USER" $CI_REGISTRY --password-stdin;
      cd ~; 
      my_nginx=$my_nginx 
      docker-compose pull; 
      docker-compose up -d --remove-orphans; 
      docker image prune;"

services:
  nginx:
    container_name: my-nginx
    image: $my_nginx
    restart: unless-stopped
    ports:
      - 80:80

Docker 开箱即用可以使用 SSH 连接到远程 Docker 守护进程。因此无需复制 docker-compose.yaml 或转发环境变量。

您只需将 DOCKER_HOST 变量设置为指向远程 docker 守护程序的 SSH uri。

deploy:
  image: alpine
  variables:
    #this may be overridden by parent pipeline, or it will be latest
    my_nginx: registry.gitlab.com/myprofile/nginx:latest 
    DOCKER_HOST: ssh://$HOST # format is ssh://user@host
  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_JOB_TOKEN"  | docker login -u "$CI_REGISTRY_USER" $CI_REGISTRY --password-stdin;
      docker-compose pull; 
      docker-compose up -d --remove-orphans; 
      docker image prune;"