为什么Gitlab-CI有时会以root所有者创建项目目录(但是我指定了另一个用户)以及如何解决它?

问题描述 投票:1回答:1

我为测试项目安装了Gitlab CI / CD。我将Docker容器与postgresgo一起使用,有时我需要更改sql初始化脚本(该脚本在数据库中创建表),因此我使用以下命令:

  1. docker-compose stop
  2. docker system prune
  3. docker system prune --volumes
  4. sudo rm -rf pay
  5. 然后在我的PC上,将更改推送到Gitlab并运行管道

但是有时在第5步之后,Gitlab-CI在permission denied error步骤(见下文)上向我抛出了deploy,因为它创建了具有根所有者的薪酬目录。

这是我的项目结构:

project structure

这是我的.gitlab-ci.yml文件:

stages:
  - tools
  - build
  - docker
  - deploy

variables:
  GO_PACKAGE: gitlab.com/$CI_PROJECT_PATH
  REGISTRY_BASE_URL: registry.gitlab.com/$CI_PROJECT_PATH

# ######################################################################################################################
# Base
# ######################################################################################################################

# Base job for docker build and push in private gitlab registry.
.docker:
  image: docker:latest
  services:
    - docker:dind
  stage: docker
  variables:
    IMAGE_SUBNAME: ''
    DOCKERFILE: Dockerfile
    BUILD_CONTEXT: .
    BUILD_ARGS: ''

  script:
    - adduser --disabled-password --gecos "" builder
    - su -l builder
    - su builder -c "whoami"
    - echo "$CI_JOB_TOKEN" | docker login -u gitlab-ci-token --password-stdin registry.gitlab.com
    - IMAGE_TAG=$CI_COMMIT_REF_SLUG
    - IMAGE=${REGISTRY_BASE_URL}/${IMAGE_SUBNAME}:${IMAGE_TAG}
    - docker build -f ${DOCKERFILE} ${BUILD_ARGS} -t ${IMAGE} ${BUILD_CONTEXT}
    - docker push ${IMAGE}
  tags:
    - docker


# ######################################################################################################################
# Stage 0. Tools
#
# ######################################################################################################################

# Job for building base golang image.
tools:golang:
  extends: .docker
  stage: tools
  variables:
    IMAGE_SUBNAME: 'golang'
    DOCKERFILE: ./docker/golang/Dockerfile
    BUILD_CONTEXT: ./docker/golang/
  only:
    refs:
      - dev
#    changes:
#      - docker/golang/**/*


# ######################################################################################################################
# Stage 1. Build
#
# ######################################################################################################################

# Job for building golang backend in single image.
build:backend:
  image: ${REGISTRY_BASE_URL}/golang
  stage: build
  # TODO: enable cache
#  cache:
#    paths:
#      - ${CI_PROJECT_DIR}/backend/vendor

  before_script:
    - cd backend/

  script:
    # Install dependencies
    - go mod download
    - mkdir bin/

    # Build binaries
    - CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -a -ldflags "-linkmode external -extldflags '-static' -s -w" -o bin/backend ./cmd/main.go

    - cp -r /usr/share/zoneinfo .
    - cp -r /etc/ssl/certs/ca-certificates.crt .
    - cp -r /etc/passwd .
  artifacts:
    expire_in: 30min
    paths:
      - backend/bin/*
      - backend/zoneinfo/**/*
      - backend/ca-certificates.crt
      - backend/passwd
  only:
    refs:
      - dev
#    changes:
#      - backend/**/*
#      - docker/golang/**/*


# ######################################################################################################################
# Stage 2. Docker
#
# ######################################################################################################################

# Job for building backend (written on golang). Only change backend folder.
docker:backend:
  extends: .docker
  variables:
    IMAGE_SUBNAME: 'backend'
    DOCKERFILE: ./backend/Dockerfile
    BUILD_CONTEXT: ./backend/
  only:
    refs:
      - dev
#    changes:
#      - docker/golang/**/*
#      - backend/**/*


# ######################################################################################################################
# Stage 3. Deploy on Server
#
# ######################################################################################################################

deploy:dev:
  stage: deploy
  variables:
    SERVER_HOST: 'here is my server ip'
    SERVER_USER: 'here is my server user (it is not root, but in root group)'
  before_script:
    ## Install ssh-agent if not already installed, it is required by Docker.
    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'

    ## Run ssh-agent
    - eval $(ssh-agent -s)

    ## Add the SSH key stored in SSH_PRIVATE_KEY_DEV variable to the agent store
    - echo "$SSH_PRIVATE_KEY_DEV" | tr -d '\r' | ssh-add - > /dev/null

    ## Create the SSH directory and give it the right permissions
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh

    ## Enable host key checking (to prevent man-in-the-middle attacks)
    - ssh-keyscan $SERVER_HOST >> ~/.ssh/known_hosts
    - chmod 644 ~/.ssh/known_hosts

    ## Git settings
    - git config --global user.email ""
    - git config --global user.name ""

    ## Install rsync if not already installed to upload files to server.
    - 'which rsync || ( apt-get update -y && apt-get install rsync -y )'
  script:
    - rsync -r deploy/dev/pay $SERVER_USER@$SERVER_HOST:/home/$SERVER_USER/dev/backend
    - ssh -tt $SERVER_USER@$SERVER_HOST 'cd dev/backend/pay && ./up.sh'
  only:
    refs:
      - dev

我已经尝试关闭更改触发器并清除gitlab容器注册表,但这没有帮助。

此外,我还发现了一件有趣的事,即当工具管道启动时(这是第一个管道),我的服务器立即使用根所有者和空子文件夹创建了工资文件夹。

我在做什么错?谢谢。

docker continuous-integration gitlab gitlab-ci gitlab-ci-runner
1个回答
0
投票

[嘿,GitLab团队成员在这里:我正在调查您的帖子,以帮助您解决问题。 Linked here is a doc on what to do when you encounter Permissions Problems with GitLab+Docker.

[您可能已经尝试了其中一些步骤,所以请告诉我!我将继续研究,等待您的回音。谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.