在Docker和Rust库测试中为带有Flask Python应用程序的项目设置GitLab CI

lf5gs5x2  于 2023-05-06  发布在  Docker
关注(0)|答案(1)|浏览(139)

bounty还有2天到期。回答此问题可获得+100声望奖励。hphex希望引起更多关注这个问题。

我正在尝试为具有以下要求的项目设置GitLab CI:

  • 使用Flask为Python应用程序构建Docker容器。
  • 使用thumbv 7 em-none-eabihf目标构建一个Rust二进制文件。
  • 运行涉及以下内容的测试:
  • 从步骤1开始使用Flask Python应用程序启动Docker容器。
  • 装载步骤2中的工件。
  • 编译自定义Rust库。
  • 运行Rust库的cargo test命令。

我尝试过创建一个.gitlab-ci.yml文件,但我不确定它是否正常工作,而且我很难理解如何正确启动Docker容器并使用挂载的工件运行测试。
以下是我的档案:

# .docker.gitlab-ci.yml file

.docker_init: &docker_init
  - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
  - echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}" >> ~/.git-credentials

.python_app_init: &python_app_init
  - // Do some git credential stuff
  - git clone https://github.com/username/python-app.git

# Base Docker job configuration
.docker:base: &base
  image: ${GITLAB_DOCKER_IMAGE}
  services:
    - ${GITLAB_DIND_IMAGE}
  tags:
    - docker

# Build Docker image and push to registry
.docker:build:
  <<: *base
  script:
    - *python_app_init
    - *docker_init
    - docker build -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG} .
    - docker push ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG}

# Run Docker image
.docker:run:
  <<: *base
  script:
    - *python_app_init
    - *docker_init
    - docker pull ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG}
    - docker run --rm ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_SLUG} -v ${CI_PROJECT_DIR}/rust-app/target/release/:/apps
# .rust.gitlab-ci.yml

# Base Rust job configuration
.rust:base: &base
  image: ${RUST_BUILD_IMAGE}
  cache:
    key: ${RUST_CACHE_KEY}
    paths:
      - .cache/

.rust_toolchain: &rust_toolchain
  - rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
  - rustup target add thumbv7em-none-eabihf

# Build Embedded Rust application
.rust:build:
  extends: .rust:base
  script:
    - *rust_toolchain
    - cd ${CI_PROJECT_DIR}/rust-app
    - cargo build --release --target thumbv7em-none-eabihf
  artifacts:
    paths:
      - ${CI_PROJECT_DIR}/rust-app/target/release/

# Test Embedded Rust application loaded on python docker image
.rust:test:
  extends: .rust:base
  script:
    - *rust_toolchain
    - cargo test
include:
  - local: '/.docker-ci.yml'
  - local: '/.rust-ci.yml'

stages:
  - build
  - test

# Build rust binary
build:rust:
  stage: build
  extends: .rust:build

# Build docker image
build:docker:
  stage: build
  extends: .docker:build

# Test
test:
  stage: test
  extends: 
    - .docker:run
    - .rust:test
  dependencies:
    - build:rust

实际的CI错误输出指示.docker:run命令被忽略,从而阻止测试正确运行。
有人可以帮我创建一个工作.gitlab-ci.yml文件,满足上述要求?

**更新:**您在评论中询问的实际错误消息是/bin/sh: eval: line xxx: cargo not found

hwamh0ep

hwamh0ep1#

首先,我认为你的文章缺乏一些有用的调试信息。具体来说,浏览器中的管道图像将非常有助于查看错误发生的确切位置。
然而,我从错误消息中猜测,“build:rust”作业是第一个失败的。消息很清楚,cargo可执行文件,即未找到rust make / dependency management系统,导致构建失败。这也会导致测试失败,但我不认为你甚至达到了这一点。
进一步分析这一点有点困难的是,您正在使用的图像存储在变量${RUST_BUILD_IMAGE}中,您(希望)在项目设置中设置该变量。如果您能告诉我们使用的是哪个映像,这将再次帮助调试。
然而,我的猜测是,$PATH没有正确设置,以包括安装的cargorustup安装到~/.cargo/bin中,因此添加路径可能会有所帮助:

.rust_toolchain: &rust_toolchain
  - rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
  - rustup target add thumbv7em-none-eabihf
  - export PATH="${PATH}:${HOME}/.cargo/bin"

但为了更确定的东西,我们需要知道你用的是哪张图片...

相关问题