跳至内容

使用 Pulp 开发人员环境运行 Galaxy NG

Pulp Installer 是基于 forklift 的 Vagrant 配置。

设置环境

要求

1. 安装 Vagrant 及其插件

在 Fedora 系统上

sudo dnf install ansible vagrant-libvirt vagrant-sshfs @virtualization

在 Debian 系统上

# virtualbox (requires sid in sources)
sudo apt install ansible vagrant vagrant-sshfs virtualbox/sid

# libvirt
sudo apt install ansible vagrant vagrant-sshfs vagrant-libvirt dnsmasq libvirt-clients libvirt-daemon libvirt-dbus qemu-system-x86 qemu-utils
sudo usermod -aG libvirt,libvirt-qemu,libvirtdbus $USER

在 Mac 上

brew install ansible
brew cask install virtualbox
brew cask install vagrant

在其他主机系统上

参考包管理器并搜索等效的包。例如,pacman -S vagrant

安装 Vagrant 插件

必需的 Vagrant 插件

vagrant plugin install vagrant-sshfs

可选 插件

vagrant plugin install vagrant-libvirt       # to connect to libvirt 
vagrant plugin install vagrant-hostmanager   # to manage local dns

2. 从源代码克隆存储库

提示

如果您计划使用自己的分支进行工作,请将 :pulp/:ansible/ 替换为您的 GitHub 用户名。

# required
git clone git@github.com:pulp/pulp_installer
git clone git@github.com:pulp/pulp_ansible.git
git clone git@github.com:pulp/pulp_container.git
git clone git@github.com:ansible/galaxy_ng.git
git clone git@github.com:pulp/pulpcore.git

# optional
git clone git@github.com:ansible/galaxy-importer.git
git clone git@github.com:ansible/ansible-hub-ui.git

确保存储库位于同一文件夹级别

$ tree -a -L 1
.
├── ansible-hub-ui/
├── galaxy-importer/
├── galaxy_ng/
├── pulp_ansible/
├── pulp_container/
├── pulpcore/
└── pulp_installer/

为了避免版本冲突,每个组件都必须使用与 galaxy_ng 兼容的插件版本签出。这些版本可以在 setup.py 中的 requirements 列表中找到。在 setup.py 中找到以下版本

  • pulpcore
  • pulp_ansible
  • pulp_container
cd pulpcore
git checkout <PULPCORE_VERSION>
cd ../pulp_ansible
git checkout <PULP_ANSIBLE_VERSION>
cd ../pulp_container
git checkout <PULP_CONTAINER_VERSION>
cd ..

3. 将工作目录设置为 pulp_installer 目录

cd pulp_installer

4. 确保您正在运行最新兼容版本的 pulp_installer。

git checkout <PULPCORE_VERSION>

5. 初始化子模块

git submodule update --init

6. 创建安装程序配置文件

pulp_installer 目录的根目录中,创建一个名为 local.dev-config.yml 的新文件,内容如下。

提示

如果您不想从源代码运行 pulpcore 或其中一个插件,您可以在 pulp_install_plugins 下注释掉 source_dir,并添加 version 或注释掉 pulp_source_dir 并添加 pulpcore_version

提示

此配置文件中变量的文档可以在 此处 找到。

---
# Pulp plugins and Python libs
pulp_install_plugins:
  pulp-ansible:
    source_dir: "/home/vagrant/devel/pulp_ansible"
    # version: "<PULP_ANSIBLE_VERSION>"
  pulp-container:
    source_dir: "/home/vagrant/devel/pulp_container"
    # version: "<PULP_CONTAINER_VERSION>"
  galaxy-ng:
    source_dir: "/home/vagrant/devel/galaxy_ng"
  # Uncomment this to run galaxy-importer from source. Other python libs can be installed like this
  # as well.
  # galaxy-importer:
  #   source_dir: "/home/vagrant/devel/galaxy-importer"

# Pulp configuration

pulp_source_dir: "/home/vagrant/devel/pulpcore"
pulp_pip_editable: true
# pulpcore_version: "<PULPCORE_VERSION>"
pulp_devel_supplement_bashrc: true
pulp_default_admin_password: password
pulp_webserver_disable_https: true
pulp_user: "vagrant"
developer_user: "vagrant"
developer_user_home: "/home/vagrant"
pulp_workers: 4
pulp_api_workers: 4
pulp_settings:
  secret_key: "unsafe_default"
  content_origin: "http://{{ ansible_fqdn }}"
  x_pulp_api_host: 127.0.0.1
  x_pulp_api_port: 24817
  x_pulp_api_user: "admin"
  x_pulp_api_password: "{{ pulp_default_admin_password }}"
  x_pulp_api_prefix: "pulp_ansible/galaxy/automation-hub/api"
  galaxy_require_content_approval: False
  pulp_token_auth_disabled: True
  galaxy_api_default_distribution_base_path: "published"
  allowed_export_paths: ["/tmp"]
  allowed_import_paths: ["/tmp"]
  ansible_api_hostname: "http://{{ ansible_fqdn }}"

# Galaxy Configuration
# Set this __galaxy variables according to your needs.
# __galaxy_profile: 'insights'or 'standalone'
__galaxy_profile: 'standalone'
# __galaxy_dev_source_path: `:` separated relative paths to the repos you cloned.
__galaxy_dev_source_path: 'pulpcore:pulp_ansible:pulp_container:galaxy_ng:galaxy-importer'
# __galaxy_lock_requirements: Set to 0 to avoid pinning of galaxy_ng/setup.py versions
__galaxy_lock_requirements: '1'

# options: precompiled, source, none
# __galaxy_ui_source: precompiled

警告

在配置 VM 时,您可能会看到 Version Conflict Error 等错误,这些错误都与在每个 repo 上设置正确的版本/分支/标签有关。

7. 启动 Vagrant VM

使用 可用盒子 或运行 vagrant status 查看可用盒子的列表。

示例

注意

以下命令必须在 pulp_installer 目录中运行。

vagrant up --provider=libvirt VAGRANT_BOX_NAME  # recommended
vagrant up --provider=libvirt pulp3-source-centos8   # if you need RHEL specific features

上面的命令将使用 --provider 来配置 VM,如果您使用 libvirtvirtualbox,请确保相应的服务正在运行且可访问。然后,它将使用 local.dev-config.yml 来配置 VM。

您可以使用 Virtualbox 应用程序或 virt-manager 检查 VM 的状态,或运行 vagrant status VAGRANT_BOX_NAME

注意

libvirt 插件并非在所有平台上都可用,如果出现问题,请跳过 --provider=libvirt

警告

此命令可能需要几分钟才能运行,它可能会询问您的 root 密码,如果出现 Version Conflict Error,请参考 https://github.com/ansible/galaxy_ng/wiki/Installing-from-source---development-environment/_edit#2-clone-the-repositories-from-source 步骤。

警告

Vagrant 在 up 之前会静默忽略 --provider=...。正确的语法是 vagrant up --provider=...,而不是 vagrant --provider=... up.

8. 访问 Galaxy NG 和 PULP

Pulp-Installer 将在 DNS <box-name>.localhost.example.com 上公开服务,例如,如果您在 Fedora 系统上安装了,它将是 http://VAGRANT_BOX_NAME.localhost.example.com/ui/

如果您安装了 vagrant-hostmanager,那么您可以运行 vagrant hostmanager 来更新您的 hosts 文件。

否则,您需要手动将其添加到 /etc/hosts 文件中。运行 vagrant ssh VAGRANT_BOX_NAME 连接到 VM,然后运行 ifconfig 查看其 IP 地址,然后。

# /etc/hosts
...
192.168.121.51 VAGRANT_BOX_NAME.localhost.example.com

要进入 SSH,只需运行 vagrant ssh VAGRANT_BOX_NAME

http 服务器将在 http://VAGRANT_BOX_NAME.localhost.example.com(端口 80)或 http://localhost:8080 上监听。

9. 可选 - 通过执行以下操作切换到 galaxy-importer 的源代码版本:

```
## SSH into the vagrant box: 
$ vagrant ssh VAGRANT_BOX_NAME

## Within the vagrant box, install the local copy of `galaxy-importer` and restart Pulp:
$ source /usr/local/lib/pulp/bin/activate
$ cd /home/vagrant/devel/galaxy-importer
$ pip install --upgrade -e .
$ prestart
```

10. 可选 - 在导入集合期间启用运行 ansible-test

```
# SSH into the vagrant guest:
$ vagrant ssh pulp-source-fedora32

# Install podman-docker
$ sudo yum install podman-docker

# Configure galaxy-importer
$ sudo mkdir /etc/galaxy-importer
```

Copy the following to `/etc/galaxy-importer/galaxy-importer.cfg`

```
[galaxy-importer]
LOG_LEVEL_MAIN = INFO
RUN_FLAKE8 = True
RUN_ANSIBLE_TEST = True
INFRA_LOCAL_IMAGE = True
INFRA_LOCAL_DOCKER = False
INFRA_OSD = False
```

11. SSH 到盒子

现在一切都在运行,您可以使用 vagrant ssh VAGRANT_BOX_NAME SSH 到盒子并开始开发工作。进入后,您可以运行

  • pjournal:显示服务器日志
  • prestart:重新启动 Pulp

请记住,每次对代码进行更改后,都必须重新启动服务器。

技巧和窍门

安装提供了一些有用的 开发别名,在 vagrant ssh 会话中,您可以

激活 Pulp 虚拟环境

workon pulp
  • phelp:列出所有可用的别名。
  • pstart:启动所有与 Pulp 相关的服务
  • pstop:停止所有与 Pulp 相关的服务
  • prestart:重新启动所有与 Pulp 相关的服务
  • pstatus:报告所有与 Pulp 相关的服务的状态
  • pdbreset:重置 Pulp 数据库 - 这将销毁您的 PULP 数据
  • pclean:将 Pulp 还原到干净的安装状态 - 这将销毁您的 PULP 数据
  • pjournal:与 Pulp 相关单元的日志交互
  • reset_pulp2:重置 Pulp 2 - 删除数据库,从文件系统中删除内容和发布内容,重新启动服务。
  • populate_pulp2_iso:同步 4 个 ISO 存储库。
  • populate_pulp2_rpm:同步 1 个 RPM 存储库。
  • populate_pulp2_docker:同步 1 个 Docker 存储库。
  • populate_pulp2:重置 Pulp 2 并同步 ISO、RPM、Docker 存储库。
  • pyclean:清理额外的 Python 文件
  • pfixtures:在前景中运行 Pulp-fixtures 容器
  • pbindings:创建并安装绑定。示例用法:pbindings pulpcore python
  • pminio:切换到 Minio 以进行 S3 测试。要停止它:pminio stop

运行测试

功能测试和单元测试可以在 Vagrant 中运行。集成测试只能在 Docker 环境 中运行。

集成测试

  1. SSH 到 Vagrant 盒子 vagrant ssh YOUR_BOX_NAME
  2. 激活 Python 虚拟环境 workon pulp
  3. cd 到要测试的插件 cd ~/devel/pulp_ansible/
  4. 安装测试要求 pip install -r functest_requirements.txt
  5. 构建 Pulp 绑定 pbindings pulp_ansible python
  6. 运行测试 pytest -v -r sx --color=yes --pyargs pulp_ansible.tests.functional

注意

每次 API 更改时,都需要使用 prestart 重新启动服务器,并使用 pbindings PLUGIN_NAME python 重新构建绑定

警告

一些 pulp_ansible 测试需要额外的设置,如果安装了 galaxy_ng,其他测试将始终失败。

提示

您可以通过向 pytest 命令传递 -k my_test_name 来运行单个测试。

单元测试

  1. SSH 到 Vagrant 盒子 vagrant ssh YOUR_BOX_NAME
  2. 激活 Python 虚拟环境 workon pulp
  3. cd 到要测试的插件 cd ~/devel/pulp_ansible/
  4. 安装测试要求 pip install -r unittest_requirements.txt
  5. 运行测试 pytest -v -r sx --color=yes --pyargs pulp_ansible.tests.unit

故障排除

Centos 8

使用 Centos 8 时,当前存在一个错误vagrant-sshfs 中,导致 fuse-sshfs 软件包未在访客中安装。在修复之前,最好使用 Fedora 31+ 来测试 Enterprise Linux 发行版。

要将 Centos 8 与 Virtualbox 一起使用(假设 vagrant-sshfs 问题已修复),请检查 vagrant/boxes.d/30-source.yaml 以查看所引用的盒子是否指向 URL。如果是,请查看 https://cloud.centos.org/centos/8-stream/x86_64/images/,并将 URL 更新为引用与 Virtualbox 兼容的镜像。提供的 URL 指向的是与 Libvirt 兼容的盒子。

Centos 7

如果使用 Centos 7 以及 ansible-hub-ui 项目的克隆,则 UI 在升级 Node 版本之前无法构建。这可以通过在 Vagrantfile 的配置部分添加内联脚本来实现。否则,构建可能会失败 :-(

Call to virConnectOpen failed: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory - 需要安装并运行 libvirtdlibvirt-daemon-system

Call to virConnectOpen failed: authentication unavailable: no polkit agent available to authenticate action 'org.libvirt.unix.manage' - 当前用户需要是 libvirt 系统组的成员

在 MacOS 上运行 vagrant

在某些情况下,默认的 pulp3-source-fedoraXX 盒子在 MacOS 上无法正常工作。还可以通过添加 pulp_installer/vagrant/boxes.d/99-local.yaml 文件来创建自定义 pulp 盒子。generic/fedoraXX 盒子似乎在 MacOS 上运行良好,可以像这样创建

# 99-local.yaml

mycustombox:
  box_name: 'generic/fedora34'
  image_name: !ruby/regexp '/Fedora 34.*/'
  pty: true
  ansible:
    variables:
      ansible_python_interpreter: /usr/bin/python3

hub:
  box: 'mycustombox'
  sshfs:
    host_path: '..'
    guest_path: '/home/vagrant/devel'
    reverse: False
  memory: 6144
  cpus: 4
  ansible:
    playbook: "vagrant/playbooks/source-install.yml"
    galaxy_role_file: "requirements.yml"

  # The default network configuration may not work for vagrant host manager. If that's the case, assigning an IP address
  # to the box may fix the issue.
  networks:
    - type: 'private_network'
      options:
        ip: 192.168.150.5

在 master 分支上工作

我需要在 pulp_ansible 或 pulp_container master 上工作,我该怎么做?

如果您需要在 pulp_ansible、pulpcore 或 pulp_container master 分支上工作,请执行以下操作

  1. 首先使用兼容的版本/标签/分支进行正常供应(如上所述)
  2. ssh 登录 VM vagrant ssh VAGRANT_BOX_NAME
  3. 停止 pulp 服务 pstop
  4. 转到存储库并检出到所需的 branches 或 tags,您可以在 VM 中的 /home/vagrant/devel 或您的本地主机目录中执行此操作,因为它们已在 VM 中挂载。
  5. 在 VM ssh 会话中运行 workon pulp,然后运行 django-admin migrate 并解决任何冲突
  6. 重新启动 pulp 服务 pstart

一些方便的 Bash 别名

如果您像我一样,不愿意记住启动和停止 vagrant 盒子的命令,这里有一些方便的别名,您可以将它们添加到您的 bash 配置文件中。

# Set the path to the directory that contains pulp_installer, galaxy_ng, pulpcore etc.
HUB_BASE_PATH="/path/to/your/pulp/source"

# Set the pulp box you wish to use
PULP_BOX="VAGRANT_BOX_NAME"

# Start the vagrant box if it is already provisioned
alias pulp_up="cd ${HUB_BASE_PATH}/pulp_installer && SSH_AUTH_SOCK= vagrant up ${PULP_BOX}"

# Re provision the vangant box
alias pulp_provision="cd ${HUB_BASE_PATH}/pulp_installer && SSH_AUTH_SOCK= vagrant up --provision ${PULP_BOX}"

# Destroy the current vagrant box
alias pulp_destroy="cd ${HUB_BASE_PATH}/pulp_installer && SSH_AUTH_SOCK= vagrant destroy -f ${PULP_BOX}"

# SSH into the vagrant box
alias pulp_ssh="cd ${HUB_BASE_PATH}/pulp_installer && SSH_AUTH_SOCK= vagrant ssh ${PULP_BOX}"

# Stop the vagrant box from running
alias pulp_stop="cd ${HUB_BASE_PATH}/pulp_installer && SSH_AUTH_SOCK= vagrant halt ${PULP_BOX}"