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。
我试图了解 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。