在 Gitlab CI 的阶段之间共享文件

问题描述 投票:0回答:1

你好,我有一个管道。

我的代码中还有2个脚本deploy_terraform.sh和deploy_ansible.sh。

现在我希望它只做两件事:

stage deploy-dev-terraform
stage deploy-dev-ansible

在第一阶段,它在运行器上创建 ssh 密钥,并启动一个脚本,在 GCP 中为我的应用程序、多个虚拟机、网络等创建基础设施……

在每个虚拟机中,它都会复制在运行器上创建的 ssh 密钥,以便它们拥有元数据,这样我就可以稍后与 ansible 创建连接。

在第二阶段,我想创建文件 inventory.ini 并使用 ansible 连接到我的虚拟机,以便我可以配置服务器。

我的问题是:当我为这两个脚本执行两个阶段时,问题是运行程序中的阶段不是持久的,因此当我想与 ansible 连接时,第二阶段中的元素不再存在,因此第二阶段继续出错。

但是当我把所有这些都放在一个阶段时,我就没有问题了。

如何在两个阶段之间保持坚持?

default:
  tags:
    - default_gitlab_runnerrunner_test

stages: 
  - deploy-dev-terraform
  - deploy-dev-ansible
#_________ ETAPE 1 - Déploiement des VM sur GCP via terraform pour l'environement de dév __________#
deploy_dev_terraform:
  stage: deploy-dev-terraform
  image : ubuntu-personalise
  before_script:
    - ssh-keygen -t rsa -b 2048 -f "$HOME/.ssh/id_rsa" -N ""
    - curl --silent "https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer" | bash
    - gcloud auth activate-service-account --key-file=.secure_files/credentials1.json
  script:
    - mkdir ./environment-dev/private  
    - cp .secure_files/credentials1.json ./environment-dev/private/credentials1.json
    - export GOOGLE_APPLICATION_CREDENTIALS=/builds/$GITLAB_USER_LOGIN/projet_app_devops/environment-dev/private/credentials1.json
    - cd ./environment-dev/scripts
    - echo "Déploiement sur l'environnement de développement"
    - chmod +x deploy_terraform.sh
    - ./deploy_terraformdeploy_terraform.sh
    # - chmod +x deploy_ansible.sh
    # - ./deploy_ansible.sh

#_________ ETAPE 2 - Configuration des serveurs VM via ansible __________#
deploy_dev_ansible:
  stage: deploy-dev-ansible
  image : ubuntu-personalise
  dependencies:
    - deploy_dev_terraform
  script:
    - cd ./environment-dev/scripts
    - echo "Configuration des serveurs VM via ansible"
    - chmod +x deploy_ansible.sh
    - ./deploy_ansible.sh

我不知道该怎么解决这个问题,使用一步解决这个问题,但这不是好方法。

非常感谢您的帮助。

google-cloud-platform terraform gitlab devops gitlab-ci-runner
1个回答
0
投票

我不知道该怎么解决这个问题,使用一步解决这个问题,但这不是好方法。

您混淆了“阶段”和“工作”。当它确实对你有用时,并不是因为你摆脱了第二个阶段,而是因为你在一个工作中完成了这两个阶段。

您在同一作业中运行的脚本共享单个工作区。第一个脚本生成的所有文件对第二个脚本仍然可见。

默认情况下,在不同作业中运行的脚本均以空白、独立的工作区开始。

工作区之间共享文件的机制是工件。第一个作业需要声明哪些文件应导出为工件,第二个作业需要声明它需要第一个作业的工件。

当然,这需要知道哪些文件用于在脚本之间进行通信。您不想捕获整个工作区,因为您会因意外捕获包括临时文件在内的整个构建文件夹而承担很多费用。

© www.soinside.com 2019 - 2024. All rights reserved.