GitLab CI/CD pytests

GitLab CI/CD pytests

我试图了解 CI/CD 管道中的一项特定工作,它具有以下逻辑:

  test:
    stage: test
    image: python:3.8
    rules:
      - if: $CI_COMMIT_TAG
        when: never
      - when: always
    before_script:
      - mkdir -p ~/.ssh && chmod 700 ~/.ssh
      - ssh-keyscan -H gitlab.com >> ~/.ssh/known_hosts
      - eval $(ssh-agent -s)
      - echo "$DEPLOY_KEY" | ssh-add -
      - pip3 install poetry==$POETRY_VERSION
      - poetry install
      - source $(poetry env info --path)/bin/activate
    script:
      - pytest tests

目前看来我们要 运行 在 GitLab 项目根目录下的测试文件夹下使用 python 图像进行多个单元测试,实际上 运行 python 代码,这或多或少是显而易见的。要实际 运行 测试,我们需要一些在 poetry.lock 文件中列出的依赖项,因此我们安装诗歌包管理器和所有需要的库。我的理解到此结束。我对 before_script 标签下的前 4 个命令和最后一个命令(激活虚拟环境之类的东西?)特别感兴趣。为什么我们需要它们,它们有什么作用?规则标签也是如此。为什么我们要检查这个 $CI_COMMIT_TAG 变量?任何帮助将不胜感激,谢谢!

CI_COMMIT_TAG 是 GitLab CI/CD variables 之一,由 gitlab 本身在每个 CI/CD 作业

上填充
    rules:
      - if: $CI_COMMIT_TAG
        when: never
      - when: always

基本上说 'skip this job if commit has an attached tag, run otherwise'。所以你的测试应该 运行 在任何未标记的提交上。

在容器中配置SSH代理需要前4条命令,我们来分解一下:

mkdir -p ~/.ssh && chmod 700 ~/.ssh

创建 .ssh 目录并限制对其的访问。这是必要的,因为默认情况下没有 .ssh 文件夹,而 ~/.ssh/known_hosts 是 ssh 用来验证远程服务器密钥的文件

ssh-keyscan -H gitlab.com >> ~/.ssh/known_hosts

此命令获取 gitlab.com public 密钥的指纹并将其放入 ~/.ssh/known_hosts。在不填写已知主机的情况下,任何针对 gitlab.com 的 ssh 命令都会要求您确认您是否信任该服务器。从安全角度来看,这个确切的命令有点毫无意义,因为它只是盲目地信任存在的任何服务器主机密钥,并且不能防止 MitM 攻击。正确的做法应该是手动将此密钥添加到您的管道中,即将其存储在某个变量中并回显到 ~/.ssh/known_hosts 中。请参阅 https://docs.gitlab.com/ee/user/gitlab_com/#ssh-host-keys-fingerprints 以获得正确的 known_hosts 个条目

eval $(ssh-agent -s)

此命令启动 ssh-agent - 因此每个后续的 SSH 命令都不会提示您输入密码。

echo "$DEPLOY_KEY" | ssh-add -

向 ssh-agent 添加一个部署密钥,因此任何后续的 SSH 命令都会自动使用它。

就个人而言,根据您的风险模型,我会跳过所有“ssh-agent”内容,只是将您的部署回显到 ~/.ssh/id_rsa。使用代理的原因可能是永远不要将部署密钥存储在任何文件系统上,因为变量存储在内存中,并且 ssh-agents 也可以在内存中工作。

最后,source $(poetry env info --path)/bin/activate就进入了这个项目的一个virtualenv。 Poetry 是一个简洁的打包和依赖管理工具,当你 运行 一个 poetry install 命令时,它会自动为你生成一个 venv。 poetry env info --path 打印 venv 根目录的路径,source 命令在 venv 中执行 bin/activate 中的指令。

这也似乎是不必要的,因为你可以 运行

poetry run pytest tests

script: 部分,它会在 poetry env 中执行 pytest。