Package: eulerpublisher
EulerPublishereulerpublisher是Infra SIG提供的”一键式“自动构建和发布openEuler镜像的工具，主要覆盖以下场景：container images构建、发布cloud images构建、发布WSL images构建、发布eulerpublisher仍处于开发过程中，目前已向PyPI上传软件包，请使用以下两种方式之一进行安装下载源码到本地，执行python setup.py install使用pip安装，执行pip install eulerpublisher环境依赖1.eulerpublisher实现多平台容器镜像构建功能依赖于docker和qemu，安装方式如下：yum install qemu-img
yum install docker多平台镜像构建使用docker buildx，安装的docker版本需满足>= 19.03或单独安装buildx插件，单独安装docker buildx方法如下：1). 从Docker buildx项目的release页面找到适合自己平台的二进制文件。2). 下载二进制文件到本地并重命名为docker-buildx，移动到docker的插件目录~/.docker/cli-plugins。3). 向二进制文件授予可执行权限chmod +x ~/.docker/cli-plugins/docker-buildx。2.eulerpublisher使用python实现，依赖见requirement.txt，安装如下：pip install -r ./requirement.txt使用说明1. 发布容器镜像基础容器镜像本部分介绍如何使用eulerpublisher发布多平台（支持amd64和arm64）openeuler基础容器镜像(区分于应用镜像，如AI容器镜像)。该功能可用于eulerpublisher从openeuler官方获取容器镜像，进行二次定制后发布至第三方仓库，镜像产品的tag严格遵守oEEP-0005的规范。步骤1、获取构建基础镜像的必要文件eulerpublisher container base prepare --version {VERSION} --index {INDEX}这个命令中--version必须显式指定，用于获取对应版本的构建所需文件。--index指定官方镜像的路径，可选docker_img或docker_img/update/Y-M-D, 选择docker_img表明获取openeuler的release版本、选择docker_img/update/Y-M-D表明获取update版本，不显式指定时默认获取release版本进行二次定制。步骤2、构建并push镜像到目标仓库执行本步之前，需要先配置push的目标仓库username和password的环境变量用以登陆，确保push可以成功，执行export LOGIN_USERNAME="username"
export LOGIN_PASSWORD="password"完成上述步骤1并配置LOGIN_USERNAME、LOGIN_PASSWORD之后，可执行如下命令进行build和pusheulerpublisher container base push --repo {REPO} --version {VERSION} --registry {REGISTRY} --dockerfile {DOCKERFILE}此命令中，--repo和--version必须显式指定，--registry不显式指定时默认指向dockerhub (https://hub.docker.com)，--dockerfile指定自定义dockerfile的路径，不显式指定时使用默认Dockerfile。由于docker buildx build构建的多平台image无法在本地缓存，build的时候必须同步push到对应repo（可以是私有的）。因此，有测试需求的情况下，尽量先将构建的container image push到私有仓库验证完成后再publish到最终目标仓库。步骤3、测试基础容器镜像eulerpublisher container base check --repo {REPO} --version {VERSION} --registry {REGISTRY}此命令中，所有参数必须和上述步骤2的参数一致，目前仅适用于测试使用默认Dockerfile构建的镜像。一键发布# 向单个仓库发布容器镜像：
eulerpublisher container base publish --repo {REPO} --version {VERSION} --index {INDEX} --registry {REGISTRY} --dockerfile {Dockerfile}此命令是上述步骤1～2的顺序功能集合，每个参数的含义与上述相同。使用示例如下示例：
eulerpublisher container base publish --repo openeuler/openeuler --version 22.03-LTS-SP1 --registry registry-1.docker.io --dockerfile Dockerfile上述执行的效果是向dockerhub(https://hub.docker.com)的openeuler/openeuler仓库发布由Dockerfile定制的tag为22.03-LTS-SP1的支持arm64、amd64多平台的openeuler基础容器镜像。为了方便将一个镜像同时发布到多个仓库，可使用如下命令：# 向多个仓库发布容器镜像：
eulerpublisher container base publish --version {VERSION} --index {INDEX}  --dockerfile {Dockerfile} --mpublish此命令使用--mpublish使能"publish one image to multiple repositories", 不再需要设置--repo和--registry参数。目标repositories的信息由yaml文件决定，用户通过配置EP_LOGIN_FILE来配置该文件的路径。默认的目标repositories信息由etc/container/registry.yaml指定，内容如下registry-1:
  - LOGIN_USER_1
  - LOGIN_PASSWD_1
  - registry-1/{USER_1}/{REPOSITORY-1}

registry-2:
  - LOGIN_USER_2
  - LOGIN_PASSWD_2
  - registry-2/{USER_2}/{REPOSITORY-2}

  ...其中每个仓库都维护一组信息，{LOGIN_USER_1}和{LOGIN_PASSWD_1}分别是登录registry-1的用户名和密码的环境变量，registry-1/{USER_1}/{REPOSITORY-1}是完整的仓库路径，其他仓库的信息也是如此。AI容器镜像openEuler AI容器镜像在基础容器镜像之上包含完整的AI应用/开发软件栈，向用户提供开箱即用的开发、使用体验，详细信息见oEEP-0014。openEuler AI容器镜像的构建发布过程与基础镜像的过程类似，用户可通过eulerpublisher container ai --help查看详细的使用方法。2. 构建cloud images通用云镜像构建使用eulerpublisher在本地执行机上进行通用云镜像构建，定制的镜像符合大多数主流云厂商镜像发布的要求，可用于发布。步骤1、基础构建准备eulerpublisher cloudimg gen prepare --version {VERSION} --arch {ARCH}此命令中所有参数均需显式指定，--version是构建目标镜像的openEuler版本号，--arch指定构建目标镜像的架构类型，目前仅支持aarch64或x86_86，
该步骤实现的功能是从openEuler Repo获取基础镜像，用于下一步定制。步骤2、构建通用镜像eulerpublisher cloudimg gen build --version {VERSION} --arch {ARCH} --output {NAME} --rpmlist {RPMLIST}此命令中{NAME}指定最终构建镜像的名称，{RPMLIST}是用户需要预安装的软件包列表文件，一旦指定不能为空。其余参数作用与步骤1命令中参数作用一致。# rpmlist内容示例
tar
make
zip
curl
...执行此命令后，会在执行机/etc/eulerpublisher/cloudimg/gen/output/目录下生成一个命名为{NAME}的最终镜像，该镜像满足目前大多数主流公有云厂商云市场镜像发布的技术要求，用户可手动进行镜像发布。AWS云镜像构建使用eulerpublisher构建AMI时，需要预先使用awscli进行aws configure配置，完成身份认证，配置信息如下：$ aws configure
- AWS Access Key ID: <key_id>
- AWS Secret Access Key: <secret_key>
- Default region name: <region>其中，key_id和secret_key是一对用于访问认证的密钥对，生成方法参见AWS管理访问密钥，region是执行构建AMI任务的域。步骤1、AMI构建准备eulerpublisher cloudimg aws prepare --version {VERSION} --arch {ARCH} --bucket {BUCKET}此命令中所有参数均需显式指定，--version是构建目标AMI的openEuler版本号，--arch指定构建AMI的架构类型，目前仅支持aarch64或x86_86，--bucket是存储桶名，存储桶用于保存prepare上传的原始raw镜像，bucket在aws configure配置的region内。执行此命令后，会在AWS对应region的bucket中出现一个命名为openEuler-{VERSION}-{ARCH}.raw的原始镜像（例如：openEuler-22.03-LTS-SP2-x86_64.raw）。步骤2、构建AMIeulerpublisher cloudimg aws build --version {VERSION} --arch {ARCH} --bucket {BUCKET} --region {REGION} --rpmlist {RPMLIST}此命令中除--rpmlist以外的所有参数均需显式指定，参数作用与eulerpublisher cloudimg aws prepare命令一致。eulerpublisher通过aws_install.sh实现定制AMI镜像的能力，目前默认的aws_install.sh满足构建得到的AMI符合AWS Marketplace AMI发布的要求，需要预安装到镜像中的软件由--rpmlist指定的文件{RPMLIST}确定。# rpmlist示例
tar
make
zip
curl
...执行此命令后，会在AWS对应region的EC2 AMI列表中生成一个命名为openEuler-{VERSION}-{ARCH}-{TIME}-hvm的最终镜像（例如：openEuler-22.03-LTS-SP2-x86_64-20230802_010324-hvm）。发布AMI到AWS Marketplace同时，eulerpublisher提供“一键发布”到AWS个人账户的能力，即上述步骤1、2的顺序执行，命令如下：eulerpublisher cloudimg aws publish --version {VERSION} --arch {ARCH} --bucket {BUCKET} --region {REGION} --rpmlist {RPMLIST}生成的AMI满足AWS Marketplace云镜像发布的要求，如有需要可进行镜像产品发布。由于AWS Marketplace存在人工审核环节，无法通过自动化流程一键发布，用户需手动操作申请发布AMI，见https://aws.amazon.com/marketplace。