我正在尝试构建gitlab-ci,但其中一个阶段是失败的构建。我被困在了建筑舞台上。它不识别python,我正在尝试安装它,这样我就可以构建映像并通过机器人框架进行测试。
gitlab-ci.yaml
image: python:latest
services:
- name: docker:dind
entrypoint: ["env", "-u", "DOCKER_HOST"]
command: ["dockerd-entrypoint.sh"]
stages:
- compile
- build
- test
- deploy
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
MOUNT_POINT: /builds/$CI_PROJECT_PATH/mnt
REPOSITORY_URL: $AWS_ACCOUNT_ID.dkr.ecr.eu-west-2.amazonaws.com/apps_web
TASK_DEFINITION_NAME: apps_8000
CLUSTER_NAME: QA-2
SERVICE_NAME: apps_demo
ARTIFACT_REPORT_PATH: "app/reports/"
before_script:
- docker info
- export IMAGE=$CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME
- export WEB_IMAGE=$IMAGE:web
- apk add --no-cache openssh-client bash
- chmod +x ./setup_env.sh
- bash ./setup_env.sh
- docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY
unittests:
stage: test
before_script:
- python -m venv env
- source env/bin/activate
- python -m pip install --upgrade pip
- pip install -r app/app-requirements.txt
variables:
DOCKER_IMAGE_TAG: ${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}
image: ${DOCKER_IMAGE_TAG}
script:
- source env/bin/activate
- python app/manage.py jenkins --enable-coverage
artifacts:
reports:
junit: app/reports/junit.xml
paths:
- $ARTIFACT_REPORT_PATH
expire_in: 30 days
when: on_success
only:
refs:
- merge_requests
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "qa"
migrations:
stage: compile
before_script:
- python -m venv env
- source env/bin/activate
- pip install -r app/app-requirements.txt
script:
- python app/manage.py makemigrations
artifacts:
paths:
- "app/*/migrations/*.py"
expire_in: 1 day
only:
refs:
- merge_requests
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "qa"
build:
image:
name: docker/compose:1.25.4
entrypoint: [ "" ]
stage: build
variables:
DOCKER_IMAGE_TAG: ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME}
before_script:
- apt-get install python3
- python -m venv env
- source env/bin/activate
- python -m pip install --upgrade pip
- pip install -r app/app-requirements.txt
- export IMAGE=$CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME
- export WEB_IMAGE=$IMAGE:web
script:
- apk add --no-cache bash
- chmod +x ./setup_env.sh
- bash ./setup_env.sh
- docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY
- docker pull $IMAGE:web || true
- docker-compose -f docker-compose.ci.yml build
- docker push $IMAGE:web
- docker tag app
- docker build -t ${DOCKER_IMAGE_TAG} .
after_script:
- docker push ${DOCKER_IMAGE_TAG}
- docker logout
dependencies:
- migrations
only:
refs:
- merge_requests
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "qa"
deploy_qa:
stage: deploy
image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-ecs:latest
before_script:
- export IMAGE=$CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME
- export WEB_IMAGE=$IMAGE:web
- docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY
script:
- echo $IMAGE
- echo $WEB_IMAGE
- docker pull $WEB_IMAGE
environment:
name: qa
url: https://app.domain.com
only:
refs:
- merge_requests
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "qa"
它由于错误/bin/sh: eval: line 153: apt-get: not found
而失败。
发布于 2021-08-31 15:44:45
就像@slauth在他的评论中说的那样,docker/compose
映像是基于阿尔卑斯Linux的,它使用的是apk
包管理器,而不是apt
。但是,您很可能无法使用debian
映像,因为您需要docker/compose
的功能。在这种情况下,您可以使用apk
来安装python,而不是apt,就像在这个作业的script
部分安装bash
一样:apk add --update --no-cache python3 && ln -sf python3 /usr/bin/python
(这来自一个相关的应答here)。
但是,在CI/CD管道中安装和更新包通常是一种不好的做法,因为根据您运行的管道的数量,它会大大减慢您的开发过程。相反,您可以根据您需要的任何映像创建您自己的坞映像,并在那里安装您的包。例如,您可以在那里创建一个基于docker/composer
、安装python、bash等的新映像。然后将新映像推送到Docker,Gitlab的内置坞注册中心,或者其他可用的注册表。最后,在.gitlab-ci.yml
文件中,只需将docker/compose
更改为新映像即可。
有关此部分的更多信息,您可以看到我为类似问题here编写的另一个答案。
https://stackoverflow.com/questions/68990210
复制相似问题