InfoGrab DocsInfoGrab Docs

Data Seeder

요약

Data Seeder는 사용자 또는 그룹 네임스페이스에 테스트 데이터를 시딩할 수 있는 테스트 데이터 시딩 하네스입니다. Data Seeder는 백엔드에서 FactoryBot을 사용하므로 유지 관리가 단순하고 이후 변경에도 견딥니다.

Data Seeder는 사용자 또는 그룹 네임스페이스에 테스트 데이터를 시딩할 수 있는 테스트 데이터 시딩 하네스입니다.

Data Seeder는 백엔드에서 FactoryBot을 사용하므로 유지 관리가 단순하고 이후 변경에도 견딥니다. 모델이 변경되면 FactoryBot이 그 변경을 이미 반영합니다.

Docker 설정#

GDK 사용 시#

  1. 로컬 파일로 컨테이너화된 GitLab 인스턴스를 시작합니다

    docker run \
      -d \
      -p 8080:80 \
      --name gitlab \
      -v ./scripts/data_seeder:/opt/gitlab/embedded/service/gitlab-rails/scripts/data_seeder \
      -v ./ee/db/seeds/data_seeder:/opt/gitlab/embedded/service/gitlab-rails/ee/db/seeds/data_seeder \
      -v ./ee/lib/tasks/gitlab/seed:/opt/gitlab/embedded/service/gitlab-rails/ee/lib/tasks/gitlab/seed \
      -v ./spec:/opt/gitlab/embedded/service/gitlab-rails/spec \
      -v ./ee/spec:/opt/gitlab/embedded/service/gitlab-rails/ee/spec \
      gitlab/gitlab-ee:16.9.8-ee.0
    
  2. 테스트 gem을 전역화합니다

    docker exec gitlab bash -c "cd /opt/gitlab/embedded/service/gitlab-rails; ruby scripts/data_seeder/globalize_gems.rb; bundle install"
    
  3. 데이터를 시딩합니다

    docker exec -it gitlab gitlab-rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"
    

GDK 미사용 시#

Git v2.26.0 이상이 필요합니다.

  1. 컨테이너화된 GitLab 인스턴스를 시작합니다

    docker run \
      -p 8080:80 \
      --name gitlab \
      -d \
      gitlab/gitlab-ee:16.9.8-ee.0
    
  2. 테스트 리소스를 가져옵니다

    docker exec gitlab bash -c "wget -O - https://gitlab.com/gitlab-org/gitlab/-/raw/master/scripts/data_seeder/test_resources.sh | bash"
    
    # OR check out a specific branch, commit, or tag
    docker exec gitlab bash -c "wget -O - https://gitlab.com/gitlab-org/gitlab/-/raw/master/scripts/data_seeder/test_resources.sh | REF=v16.7.0-ee bash"
    

root 비밀번호 확인#

생성된 GitLab 인스턴스의 비밀번호를 가져오려면 다음 명령을 실행하고 출력으로 나온 비밀번호를 사용합니다.

docker exec gitlab cat /etc/gitlab/initial_root_password
Note

cat: /etc/gitlab/initialize_root_password: No such file or directory가 표시되면 GitLab이 부팅될 때까지 잠시 기다린 뒤 다시 시도합니다.

그러면 root / 자격 증명으로 http://localhost:8080/users/sign_in에 로그인할 수 있습니다

데이터 시딩#

중요: 컨테이너가 완전히 시작되어 http://localhost:8080에서 로그인 페이지를 볼 수 있을 때까지 이 단계를 실행하지 않습니다.

docker exec -it gitlab gitlab-rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"

GDK 설정#

$ gdk start db
ok: run: services/postgresql: (pid n) 0s, normally down
ok: run: services/redis: (pid n) 74s, normally down
$ bundle install
Bundle complete!
$ bundle exec rake db:migrate
main: migrated
ci: migrated

실행#

ee:gitlab:seed:data_seeder Rake 태스크는 인수 하나를 받습니다. :file 입니다.

$ bundle exec rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"
Seeding data for Administrator
....

:file#

여기서 :file은 파일 경로입니다. (이 경로는 ee/db/seeds/data_seeder에 있는 .rb, .yml, .json 파일의 상대 경로이거나 시드 파일의 절대 경로입니다.)

Linux 패키지 설정#

Warning

Linux 패키지 설치본에서도 Data Seeder를 사용할 수 있지만, 인스턴스를 프로덕션 환경에서 사용하고 있다면 주의합니다.

Git v2.26.0 이상이 필요합니다.

  1. 작업 디렉터리를 GitLab 설치 경로로 변경합니다.

    cd /opt/gitlab/embedded/service/gitlab-rails
    
  2. 테스트 리소스를 설치합니다.

    . scripts/data_seeder/test_resources.sh
    
  3. gem을 전역화합니다.

    /opt/gitlab/embedded/bin/chpst -e /opt/gitlab/etc/gitlab-rails/env /opt/gitlab/embedded/bin/bundle exec ruby scripts/data_seeder/globalize_gems.rb
    
  4. 번들을 설치합니다.

    /opt/gitlab/embedded/bin/chpst -e /opt/gitlab/etc/gitlab-rails/env /opt/gitlab/embedded/bin/bundle
    
  5. 데이터를 시딩합니다.

    gitlab-rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"
    

개발#

Data Seeder는 spec/factories의 FactoryBot 정의를 사용하며, 이 정의는 다음과 같습니다.

  1. 개발 시간을 절약합니다
  2. 읽기 쉽습니다
  3. 유지 관리가 쉽습니다
  4. 이후 변경될 수 있는 API에 의존하지 않습니다
  5. 항상 최신 상태입니다
  6. 데이터를 최대한 빠르게 생성하기 위해 가능한 가장 낮은 계층(ORM)에서 실행됩니다

FactoryBot README 인용 : factory_bot은 픽스처를 대체하는 도구로, 간결한 정의 구문과 여러 빌드 전략(저장된 인스턴스, 저장되지 않은 인스턴스, 속성 해시, 스텁 객체)을 지원하며, 팩토리 상속을 포함해 같은 클래스에 대한 여러 팩토리를 지원합니다

팩토리는 spec/factories/*에 있으며 app/models/*의 Rails 모델을 위한 픽스처입니다. 예를 들어 app/models/issue.rb 모델의 팩토리는 spec/factories/issues.rb로 명명됩니다. app/models/project.rb 모델의 팩토리는 app/models/projects.rb로 명명됩니다.

현재 GitLab Data Seeder가 지원하는 파서는 Ruby, YAML, JSON 세 가지입니다.

Ruby#

모든 Ruby 시드는 #seed 인스턴스 메서드를 가진 DataSeeder 클래스를 정의해야 합니다. Ruby 클래스 구조는 원하는 대로 구성할 수 있습니다. 모든 FactoryBot 메서드(create, build, create_list)는 클래스에 자동으로 포함되며 호출할 수 있습니다.

DataSeeder 클래스에는 시딩 시점에 정의되는 다음 인스턴스 변수가 있습니다.

  • @seed_file - File 객체입니다.
  • @owner - 시드 데이터의 소유자입니다.
  • @name - 시드의 이름입니다. 확장자를 제외한 시드 파일 이름입니다.
  • @group - 시딩된 모든 데이터가 생성되는 최상위 그룹입니다.
  • @logger - 출력을 기록하는 로거 객체입니다. 로깅 출력은 log/data_seeder.log에서 확인할 수 있습니다.
# frozen_string_literal: true

class DataSeeder
  def seed
    my_group = create(:group, name: 'My Group', path: 'my-group-path', parent: @group)
    @logger.info "Created #{my_group.name}" #=> Created My Group

    my_project = create(:project, :public, name: 'My Project', namespace: my_group, creator: @owner)
  end
end

YAML#

YAML 파서는 팩토리 정의를 지원하는 DSL이며, 사람이 읽을 수 있는 형식으로 데이터를 시딩할 수 있습니다.

name: My Seeder
groups:
  - _id: my_group
    name: My Group
    path: my-group-path

projects:
  - _id: my_project
    name: My Project
    namespace_id: <%= groups.my_group.id %>
    creator_id: <%= @owner.id %>
    traits:
      - public

JSON#

JSON 파서를 사용하면 시드 파일을 JSON 형식으로 보관할 수 있습니다.

{
  "name": "My Seeder",
  "groups": [
    { "_id": "my_group", "name": "My Group", "path": "my-group-path" }
  ],
  "projects": [
    {
      "_id": "my_project",
      "name": "My Project",
      "namespace_id": "<%= groups.my_group.id %>",
      "creator_id": "<%= @owner.id %>",
      "traits": ["public"]
    }
  ]
}

로깅#

Data Seeder를 실행할 때 기본 로깅 수준은 "information" 으로 설정됩니다.

GITLAB_LOG_LEVEL=<level>을 지정해 로깅 수준을 재정의할 수 있습니다.

$ GITLAB_LOG_LEVEL=debug bundle exec rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"
Seeding data for Administrator
......

$ GITLAB_LOG_LEVEL=warn bundle exec rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"
Seeding data for Administrator
......

$ GITLAB_LOG_LEVEL=error bundle exec rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"
......

팩토리 분류 체계#

팩토리는 세 가지 주요 부분, 즉 팩토리의 Name, Traits, Attributes로 구성됩니다.

예시: create(:iteration, :with_title, :current, title: 'My Iteration')

:iteration 팩토리의 Name 입니다. 파일 이름은 이 Name의 복수형이 되며 spec/factories/iterations.rb 또는 ee/spec/factories/iterations.rb 아래에 있습니다.
:with_title 팩토리의 Trait 입니다. 정의 방식 확인.
:current 팩토리의 Trait 입니다. 정의 방식 확인.
title: 'My Iteration' 생성을 위해 모델에 전달되는 팩토리의 Attribute 입니다.

예시#

다음 예시에는 인스턴스 변수 @owner가 나옵니다. 이는 root 사용자(User.first)입니다.

그룹 생성#

my_group = create(:group, name: 'My Group', path: 'my-group-path')

프로젝트 생성#

# create a Project belonging to a Group
my_project = create(:project, :public, name: 'My Project', namespace: my_group, creator: @owner)

이슈 생성#

# create an Issue belonging to a Project
my_issue = create(:issue, title: 'My Issue', project: my_project, weight: 2)

이터레이션 생성#

# create an Iteration under a Group
my_iteration = create(:iteration, :with_title, :current, title: 'My Iteration', group: my_group)

이슈를 다른 이슈에 연결#

create(:project, name: 'My project', namespace: @group, creator: @owner) do |project|
  issue_1 = create(:issue, project:, title: 'Issue 1', description: 'This is issue 1')
  issue_2 = create(:issue, project:, title: 'Issue 2', description: 'This is issue 2')

  create(:issue_link, source: issue_1, target: issue_2)
end

자주 발생하는 문제#

사용자 이름 또는 이메일이 이미 사용 중#

다음 오류 중 하나가 표시되는 경우입니다.

  • ActiveRecord::RecordInvalid: Validation failed: Email has already been taken
  • ActiveRecord::RecordInvalid: Validation failed: Username has already been taken

기본적으로 팩토리가 빠진 데이터를 채워 넣도록 작성되어 있기 때문입니다. 예를 들어 프로젝트를 생성할 때 프로젝트에는 생성한 주체가 있어야 합니다. 소유자를 지정하지 않으면 팩토리가 소유자를 생성하려고 시도합니다.

해결 방법

해당 팩토리를 확인해 어떤 키가 필요한지 파악합니다. 보통 :author 또는 :owner 입니다.

# This throws ActiveRecord::RecordInvalid
create(:project, name: 'Throws Error', namespace: create(:group, name: 'Some Group'))

# Specify the user where @owner is a [User] record
create(:project, name: 'No longer throws error', owner: @owner, namespace: create(:group, name: 'Some Group'))
create(:epic, group: create(:group), author: @owner)

parsing id "my id" as "my_id"#

변수 지정을 참고합니다

id is invalid#

Ruby 이외의 파서는 ID를 Ruby 객체로 파싱하므로, ID를 지정할 때는 Ruby의 명명 규칙을 따라야 합니다.

유효하지 않은 ID의 예시입니다.

  • 숫자로 시작하는 ID
  • 특수 문자(-, !, $, @, `, =, <@@K84@@>, ;, :)가 포함된 ID

ActiveRecord::AssociationTypeMismatch: Model expected, got ... which is an instance of String#

시더의 제약 사항입니다.

원시 Ruby 객체 파싱 허용 이슈를 참고합니다.

YAML 팩토리#

n개의 레코드를 생성하는 생성기#

그룹 레이블#

그룹 레이블:

group_labels:
  # Group Label with Name and a Color
  - name: Group Label 1
    group_id: <%= @group.id %>
    color: "#FF0000"

그룹 마일스톤#

그룹 마일스톤:

group_milestones:
  # Past Milestone
  - name: Past Milestone
    group_id: <%= @group.id %>
    group:
    start_date: <%= 1.month.ago %>
    due_date: <%= 1.day.ago %>

  # Ongoing Milestone
  - name: Ongoing Milestone
    group_id: <%= @group.id %>
    group:
    start_date: <%= 1.day.ago %>
    due_date: <%= 1.month.from_now %>

  # Future Milestone
  - name: Ongoing Milestone
    group_id: <%= @group.id %>
    group:
    start_date: <%= 1.month.from_now %>
    due_date: <%= 2.months.from_now %>

특이 사항#

  • group:을 지정하되 값은 비워 두어야 합니다. Milestones 팩토리가 after(:build)에서 팩토리를 조작하기 때문입니다. 이 항목이 없으면 마일스톤이 그룹에 올바르게 연결되지 않습니다.

에픽#

에픽:

epics:
  # Simple Epic
  - title: Simple Epic
    group_id: <%= @group.id %>
    author_id: <%= @owner.id %>

  # Epic with detailed Markdown description
  - title: Detailed Epic
    group_id: <%= @group.id %>
    author_id: <%= @owner.id %>
    description: |
      # Markdown

      **Description**

  # Epic with dates
  - title: Epic with dates
    group_id: <%= @group.id %>
    author_id: <%= @owner.id %>
    start_date: <%= 1.day.ago %>
    due_date: <%= 1.month.from_now %>

변수#

생성된 각 팩토리에는 이후 시딩에서 사용할 식별자를 지정할 수 있습니다.

시드 파일에서 나중에 사용할 수 있도록 생성된 모든 팩토리에 ID를 지정할 수 있습니다.

변수 지정#

Ruby 이외의 파서에서 나중에 참조하려면 모든 팩토리에 _id 속성을 전달할 수 있습니다.

변수는 자신이 속한 팩토리 정의 아래에 놓입니다.

---
group_labels:
  - _id: my_label #=> group_labels.my_label

projects:
  - _id: my_project #=> projects.my_project

변수:

Note

권장하지는 않지만 공백이 포함된 변수를 지정할 수 있습니다. 이러한 변수는 밑줄로 참조할 수 있습니다.

변수 참조#

YAML 시드 파일 예시입니다.

---
group_labels:
  - _id: my_group_label #=> group_labels.my_group_label
    name: My Group Label
    color: "#FF0000"
  - _id: my_other_group_label #=> group_labels.my_other_group_label
    color: <%= group_labels.my_group_label.color %>

projects:
  - _id: my_project #=> projects.my_project
    name: My Project

변수를 참조할 때 그 변수는 이미 시딩된 모델을 가리킵니다. 즉, 모델의 id 속성이 채워집니다.

Data Seeder

GitLab v19.4
원문 보기

요약

Data Seeder는 사용자 또는 그룹 네임스페이스에 테스트 데이터를 시딩할 수 있는 테스트 데이터 시딩 하네스입니다. Data Seeder는 백엔드에서 FactoryBot을 사용하므로 유지 관리가 단순하고 이후 변경에도 견딥니다.

Data Seeder는 사용자 또는 그룹 네임스페이스에 테스트 데이터를 시딩할 수 있는 테스트 데이터 시딩 하네스입니다.

Data Seeder는 백엔드에서 FactoryBot을 사용하므로 유지 관리가 단순하고 이후 변경에도 견딥니다. 모델이 변경되면 FactoryBot이 그 변경을 이미 반영합니다.

Docker 설정#

GDK 사용 시#

  1. 로컬 파일로 컨테이너화된 GitLab 인스턴스를 시작합니다

    docker run \
      -d \
      -p 8080:80 \
      --name gitlab \
      -v ./scripts/data_seeder:/opt/gitlab/embedded/service/gitlab-rails/scripts/data_seeder \
      -v ./ee/db/seeds/data_seeder:/opt/gitlab/embedded/service/gitlab-rails/ee/db/seeds/data_seeder \
      -v ./ee/lib/tasks/gitlab/seed:/opt/gitlab/embedded/service/gitlab-rails/ee/lib/tasks/gitlab/seed \
      -v ./spec:/opt/gitlab/embedded/service/gitlab-rails/spec \
      -v ./ee/spec:/opt/gitlab/embedded/service/gitlab-rails/ee/spec \
      gitlab/gitlab-ee:16.9.8-ee.0
    
  2. 테스트 gem을 전역화합니다

    docker exec gitlab bash -c "cd /opt/gitlab/embedded/service/gitlab-rails; ruby scripts/data_seeder/globalize_gems.rb; bundle install"
    
  3. 데이터를 시딩합니다

    docker exec -it gitlab gitlab-rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"
    

GDK 미사용 시#

Git v2.26.0 이상이 필요합니다.

  1. 컨테이너화된 GitLab 인스턴스를 시작합니다

    docker run \
      -p 8080:80 \
      --name gitlab \
      -d \
      gitlab/gitlab-ee:16.9.8-ee.0
    
  2. 테스트 리소스를 가져옵니다

    docker exec gitlab bash -c "wget -O - https://gitlab.com/gitlab-org/gitlab/-/raw/master/scripts/data_seeder/test_resources.sh | bash"
    
    # OR check out a specific branch, commit, or tag
    docker exec gitlab bash -c "wget -O - https://gitlab.com/gitlab-org/gitlab/-/raw/master/scripts/data_seeder/test_resources.sh | REF=v16.7.0-ee bash"
    

root 비밀번호 확인#

생성된 GitLab 인스턴스의 비밀번호를 가져오려면 다음 명령을 실행하고 출력으로 나온 비밀번호를 사용합니다.

docker exec gitlab cat /etc/gitlab/initial_root_password
Note

cat: /etc/gitlab/initialize_root_password: No such file or directory가 표시되면 GitLab이 부팅될 때까지 잠시 기다린 뒤 다시 시도합니다.

그러면 root / 자격 증명으로 http://localhost:8080/users/sign_in에 로그인할 수 있습니다

데이터 시딩#

중요: 컨테이너가 완전히 시작되어 http://localhost:8080에서 로그인 페이지를 볼 수 있을 때까지 이 단계를 실행하지 않습니다.

docker exec -it gitlab gitlab-rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"

GDK 설정#

$ gdk start db
ok: run: services/postgresql: (pid n) 0s, normally down
ok: run: services/redis: (pid n) 74s, normally down
$ bundle install
Bundle complete!
$ bundle exec rake db:migrate
main: migrated
ci: migrated

실행#

ee:gitlab:seed:data_seeder Rake 태스크는 인수 하나를 받습니다. :file 입니다.

$ bundle exec rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"
Seeding data for Administrator
....

:file#

여기서 :file은 파일 경로입니다. (이 경로는 ee/db/seeds/data_seeder에 있는 .rb, .yml, .json 파일의 상대 경로이거나 시드 파일의 절대 경로입니다.)

Linux 패키지 설정#

Warning

Linux 패키지 설치본에서도 Data Seeder를 사용할 수 있지만, 인스턴스를 프로덕션 환경에서 사용하고 있다면 주의합니다.

Git v2.26.0 이상이 필요합니다.

  1. 작업 디렉터리를 GitLab 설치 경로로 변경합니다.

    cd /opt/gitlab/embedded/service/gitlab-rails
    
  2. 테스트 리소스를 설치합니다.

    . scripts/data_seeder/test_resources.sh
    
  3. gem을 전역화합니다.

    /opt/gitlab/embedded/bin/chpst -e /opt/gitlab/etc/gitlab-rails/env /opt/gitlab/embedded/bin/bundle exec ruby scripts/data_seeder/globalize_gems.rb
    
  4. 번들을 설치합니다.

    /opt/gitlab/embedded/bin/chpst -e /opt/gitlab/etc/gitlab-rails/env /opt/gitlab/embedded/bin/bundle
    
  5. 데이터를 시딩합니다.

    gitlab-rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"
    

개발#

Data Seeder는 spec/factories의 FactoryBot 정의를 사용하며, 이 정의는 다음과 같습니다.

  1. 개발 시간을 절약합니다
  2. 읽기 쉽습니다
  3. 유지 관리가 쉽습니다
  4. 이후 변경될 수 있는 API에 의존하지 않습니다
  5. 항상 최신 상태입니다
  6. 데이터를 최대한 빠르게 생성하기 위해 가능한 가장 낮은 계층(ORM)에서 실행됩니다

FactoryBot README 인용 : factory_bot은 픽스처를 대체하는 도구로, 간결한 정의 구문과 여러 빌드 전략(저장된 인스턴스, 저장되지 않은 인스턴스, 속성 해시, 스텁 객체)을 지원하며, 팩토리 상속을 포함해 같은 클래스에 대한 여러 팩토리를 지원합니다

팩토리는 spec/factories/*에 있으며 app/models/*의 Rails 모델을 위한 픽스처입니다. 예를 들어 app/models/issue.rb 모델의 팩토리는 spec/factories/issues.rb로 명명됩니다. app/models/project.rb 모델의 팩토리는 app/models/projects.rb로 명명됩니다.

현재 GitLab Data Seeder가 지원하는 파서는 Ruby, YAML, JSON 세 가지입니다.

Ruby#

모든 Ruby 시드는 #seed 인스턴스 메서드를 가진 DataSeeder 클래스를 정의해야 합니다. Ruby 클래스 구조는 원하는 대로 구성할 수 있습니다. 모든 FactoryBot 메서드(create, build, create_list)는 클래스에 자동으로 포함되며 호출할 수 있습니다.

DataSeeder 클래스에는 시딩 시점에 정의되는 다음 인스턴스 변수가 있습니다.

  • @seed_file - File 객체입니다.
  • @owner - 시드 데이터의 소유자입니다.
  • @name - 시드의 이름입니다. 확장자를 제외한 시드 파일 이름입니다.
  • @group - 시딩된 모든 데이터가 생성되는 최상위 그룹입니다.
  • @logger - 출력을 기록하는 로거 객체입니다. 로깅 출력은 log/data_seeder.log에서 확인할 수 있습니다.
# frozen_string_literal: true

class DataSeeder
  def seed
    my_group = create(:group, name: 'My Group', path: 'my-group-path', parent: @group)
    @logger.info "Created #{my_group.name}" #=> Created My Group

    my_project = create(:project, :public, name: 'My Project', namespace: my_group, creator: @owner)
  end
end

YAML#

YAML 파서는 팩토리 정의를 지원하는 DSL이며, 사람이 읽을 수 있는 형식으로 데이터를 시딩할 수 있습니다.

name: My Seeder
groups:
  - _id: my_group
    name: My Group
    path: my-group-path

projects:
  - _id: my_project
    name: My Project
    namespace_id: <%= groups.my_group.id %>
    creator_id: <%= @owner.id %>
    traits:
      - public

JSON#

JSON 파서를 사용하면 시드 파일을 JSON 형식으로 보관할 수 있습니다.

{
  "name": "My Seeder",
  "groups": [
    { "_id": "my_group", "name": "My Group", "path": "my-group-path" }
  ],
  "projects": [
    {
      "_id": "my_project",
      "name": "My Project",
      "namespace_id": "<%= groups.my_group.id %>",
      "creator_id": "<%= @owner.id %>",
      "traits": ["public"]
    }
  ]
}

로깅#

Data Seeder를 실행할 때 기본 로깅 수준은 "information" 으로 설정됩니다.

GITLAB_LOG_LEVEL=<level>을 지정해 로깅 수준을 재정의할 수 있습니다.

$ GITLAB_LOG_LEVEL=debug bundle exec rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"
Seeding data for Administrator
......

$ GITLAB_LOG_LEVEL=warn bundle exec rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"
Seeding data for Administrator
......

$ GITLAB_LOG_LEVEL=error bundle exec rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"
......

팩토리 분류 체계#

팩토리는 세 가지 주요 부분, 즉 팩토리의 Name, Traits, Attributes로 구성됩니다.

예시: create(:iteration, :with_title, :current, title: 'My Iteration')

:iteration 팩토리의 Name 입니다. 파일 이름은 이 Name의 복수형이 되며 spec/factories/iterations.rb 또는 ee/spec/factories/iterations.rb 아래에 있습니다.
:with_title 팩토리의 Trait 입니다. 정의 방식 확인.
:current 팩토리의 Trait 입니다. 정의 방식 확인.
title: 'My Iteration' 생성을 위해 모델에 전달되는 팩토리의 Attribute 입니다.

예시#

다음 예시에는 인스턴스 변수 @owner가 나옵니다. 이는 root 사용자(User.first)입니다.

그룹 생성#

my_group = create(:group, name: 'My Group', path: 'my-group-path')

프로젝트 생성#

# create a Project belonging to a Group
my_project = create(:project, :public, name: 'My Project', namespace: my_group, creator: @owner)

이슈 생성#

# create an Issue belonging to a Project
my_issue = create(:issue, title: 'My Issue', project: my_project, weight: 2)

이터레이션 생성#

# create an Iteration under a Group
my_iteration = create(:iteration, :with_title, :current, title: 'My Iteration', group: my_group)

이슈를 다른 이슈에 연결#

create(:project, name: 'My project', namespace: @group, creator: @owner) do |project|
  issue_1 = create(:issue, project:, title: 'Issue 1', description: 'This is issue 1')
  issue_2 = create(:issue, project:, title: 'Issue 2', description: 'This is issue 2')

  create(:issue_link, source: issue_1, target: issue_2)
end

자주 발생하는 문제#

사용자 이름 또는 이메일이 이미 사용 중#

다음 오류 중 하나가 표시되는 경우입니다.

  • ActiveRecord::RecordInvalid: Validation failed: Email has already been taken
  • ActiveRecord::RecordInvalid: Validation failed: Username has already been taken

기본적으로 팩토리가 빠진 데이터를 채워 넣도록 작성되어 있기 때문입니다. 예를 들어 프로젝트를 생성할 때 프로젝트에는 생성한 주체가 있어야 합니다. 소유자를 지정하지 않으면 팩토리가 소유자를 생성하려고 시도합니다.

해결 방법

해당 팩토리를 확인해 어떤 키가 필요한지 파악합니다. 보통 :author 또는 :owner 입니다.

# This throws ActiveRecord::RecordInvalid
create(:project, name: 'Throws Error', namespace: create(:group, name: 'Some Group'))

# Specify the user where @owner is a [User] record
create(:project, name: 'No longer throws error', owner: @owner, namespace: create(:group, name: 'Some Group'))
create(:epic, group: create(:group), author: @owner)

parsing id "my id" as "my_id"#

변수 지정을 참고합니다

id is invalid#

Ruby 이외의 파서는 ID를 Ruby 객체로 파싱하므로, ID를 지정할 때는 Ruby의 명명 규칙을 따라야 합니다.

유효하지 않은 ID의 예시입니다.

  • 숫자로 시작하는 ID
  • 특수 문자(-, !, $, @, `, =, <@@K84@@>, ;, :)가 포함된 ID

ActiveRecord::AssociationTypeMismatch: Model expected, got ... which is an instance of String#

시더의 제약 사항입니다.

원시 Ruby 객체 파싱 허용 이슈를 참고합니다.

YAML 팩토리#

n개의 레코드를 생성하는 생성기#

그룹 레이블#

그룹 레이블:

group_labels:
  # Group Label with Name and a Color
  - name: Group Label 1
    group_id: <%= @group.id %>
    color: "#FF0000"

그룹 마일스톤#

그룹 마일스톤:

group_milestones:
  # Past Milestone
  - name: Past Milestone
    group_id: <%= @group.id %>
    group:
    start_date: <%= 1.month.ago %>
    due_date: <%= 1.day.ago %>

  # Ongoing Milestone
  - name: Ongoing Milestone
    group_id: <%= @group.id %>
    group:
    start_date: <%= 1.day.ago %>
    due_date: <%= 1.month.from_now %>

  # Future Milestone
  - name: Ongoing Milestone
    group_id: <%= @group.id %>
    group:
    start_date: <%= 1.month.from_now %>
    due_date: <%= 2.months.from_now %>

특이 사항#

  • group:을 지정하되 값은 비워 두어야 합니다. Milestones 팩토리가 after(:build)에서 팩토리를 조작하기 때문입니다. 이 항목이 없으면 마일스톤이 그룹에 올바르게 연결되지 않습니다.

에픽#

에픽:

epics:
  # Simple Epic
  - title: Simple Epic
    group_id: <%= @group.id %>
    author_id: <%= @owner.id %>

  # Epic with detailed Markdown description
  - title: Detailed Epic
    group_id: <%= @group.id %>
    author_id: <%= @owner.id %>
    description: |
      # Markdown

      **Description**

  # Epic with dates
  - title: Epic with dates
    group_id: <%= @group.id %>
    author_id: <%= @owner.id %>
    start_date: <%= 1.day.ago %>
    due_date: <%= 1.month.from_now %>

변수#

생성된 각 팩토리에는 이후 시딩에서 사용할 식별자를 지정할 수 있습니다.

시드 파일에서 나중에 사용할 수 있도록 생성된 모든 팩토리에 ID를 지정할 수 있습니다.

변수 지정#

Ruby 이외의 파서에서 나중에 참조하려면 모든 팩토리에 _id 속성을 전달할 수 있습니다.

변수는 자신이 속한 팩토리 정의 아래에 놓입니다.

---
group_labels:
  - _id: my_label #=> group_labels.my_label

projects:
  - _id: my_project #=> projects.my_project

변수:

Note

권장하지는 않지만 공백이 포함된 변수를 지정할 수 있습니다. 이러한 변수는 밑줄로 참조할 수 있습니다.

변수 참조#

YAML 시드 파일 예시입니다.

---
group_labels:
  - _id: my_group_label #=> group_labels.my_group_label
    name: My Group Label
    color: "#FF0000"
  - _id: my_other_group_label #=> group_labels.my_other_group_label
    color: <%= group_labels.my_group_label.color %>

projects:
  - _id: my_project #=> projects.my_project
    name: My Project

변수를 참조할 때 그 변수는 이미 시딩된 모델을 가리킵니다. 즉, 모델의 id 속성이 채워집니다.