InfoGrab DocsInfoGrab Docs

Data Seeder

요약

Data Seeder는 테스트 데이터 시딩 하네스로, 사용자 또는 그룹 네임스페이스에 테스트 데이터를 시딩할 수 있습니다. Data Seeder는 백엔드에서 FactoryBot을 사용하므로 유지 관리가 간단하고 미래 지향적입니다.

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

Data Seeder는 백엔드에서 FactoryBot을 사용하므로 유지 관리가 간단하고 미래 지향적입니다. 모델이 변경되면 FactoryBot이 이미 해당 변경 사항을 반영합니다.

Docker 설정#

GDK 사용 시#

  • 로컬 파일을 사용하여 컨테이너화된 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
  • 테스트 gem을 전역화합니다.
docker exec gitlab bash -c "cd /opt/gitlab/embedded/service/gitlab-rails; ruby scripts/data_seeder/globalize_gems.rb; bundle install"
  • 데이터를 시딩합니다.
docker exec -it gitlab gitlab-rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"

GDK 미사용 시#

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

  • 컨테이너화된 GitLab 인스턴스를 시작합니다.
docker run \
  -p 8080:80 \
  --name gitlab \
  -d \
  gitlab/gitlab-ee:16.9.8-ee.0
  • 테스트 리소스를 가져옵니다.
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

cat: /etc/gitlab/initialize_root_password: No such file or directory 오류가 발생하면 GitLab이 부팅될 때까지 잠시 기다린 후 다시 시도하세요.

그런 다음 자격 증명 root / <initial_root_password에서 가져온 비밀번호>를 사용하여 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 패키지 설정#

Linux 패키지 설치 환경에서 Data Seeder를 사용할 수 있지만, 인스턴스가 프로덕션 환경에서 사용 중인 경우 주의를 기울이세요.

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

  • GitLab 설치 디렉터리로 작업 디렉터리를 변경합니다:
cd /opt/gitlab/embedded/service/gitlab-rails
  • 테스트 리소스를 설치합니다:
. scripts/data_seeder/test_resources.sh
  • 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
  • 번들을 설치합니다:
/opt/gitlab/embedded/bin/chpst -e /opt/gitlab/etc/gitlab-rails/env /opt/gitlab/embedded/bin/bundle
  • 데이터를 시딩합니다:
gitlab-rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"

개발#

Data Seeder는 spec/factories의 FactoryBot 정의를 사용하여…

  • 개발 시간을 절약합니다.

  • 읽기 쉽습니다.

  • 유지 관리가 쉽습니다.

  • 나중에 변경될 수 있는 API에 의존하지 않습니다.

  • 항상 최신 상태를 유지합니다.

  • 데이터를 가능한 한 빠르게 생성하기 위해 가능한 가장 낮은 수준(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]"
......

팩토리 분류 체계#

팩토리는 세 가지 주요 부분으로 구성됩니다 - 팩토리의 이름, Traits, Attributes.

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

:iteration 팩토리의 이름입니다. 파일명은 이 이름의 복수형이 되며 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)

"my id"를 "my_id"로 파싱#

변수 지정을 참조하세요.

id가 유효하지 않음#

비 Ruby 파서가 ID를 Ruby 객체로 파싱하기 때문에, ID를 지정할 때 Ruby의 명명 규칙을 따라야 합니다.

유효하지 않은 ID의 예:

  • 숫자로 시작하는 ID

  • 특수 문자를 포함하는 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:을 지정하고 비워두어야 합니다. 이는 마일스톤 팩토리가 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

변수:

권장되지는 않지만 변수에 공백을 포함하여 지정할 수 있습니다. 이러한 변수는 밑줄(_)을 사용하여 참조할 수 있습니다.

변수 참조#

주어진 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.1
원문 보기
요약

Data Seeder는 테스트 데이터 시딩 하네스로, 사용자 또는 그룹 네임스페이스에 테스트 데이터를 시딩할 수 있습니다. Data Seeder는 백엔드에서 FactoryBot을 사용하므로 유지 관리가 간단하고 미래 지향적입니다.

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

Data Seeder는 백엔드에서 FactoryBot을 사용하므로 유지 관리가 간단하고 미래 지향적입니다. 모델이 변경되면 FactoryBot이 이미 해당 변경 사항을 반영합니다.

Docker 설정#

GDK 사용 시#

  • 로컬 파일을 사용하여 컨테이너화된 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
  • 테스트 gem을 전역화합니다.
docker exec gitlab bash -c "cd /opt/gitlab/embedded/service/gitlab-rails; ruby scripts/data_seeder/globalize_gems.rb; bundle install"
  • 데이터를 시딩합니다.
docker exec -it gitlab gitlab-rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"

GDK 미사용 시#

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

  • 컨테이너화된 GitLab 인스턴스를 시작합니다.
docker run \
  -p 8080:80 \
  --name gitlab \
  -d \
  gitlab/gitlab-ee:16.9.8-ee.0
  • 테스트 리소스를 가져옵니다.
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

cat: /etc/gitlab/initialize_root_password: No such file or directory 오류가 발생하면 GitLab이 부팅될 때까지 잠시 기다린 후 다시 시도하세요.

그런 다음 자격 증명 root / <initial_root_password에서 가져온 비밀번호>를 사용하여 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 패키지 설정#

Linux 패키지 설치 환경에서 Data Seeder를 사용할 수 있지만, 인스턴스가 프로덕션 환경에서 사용 중인 경우 주의를 기울이세요.

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

  • GitLab 설치 디렉터리로 작업 디렉터리를 변경합니다:
cd /opt/gitlab/embedded/service/gitlab-rails
  • 테스트 리소스를 설치합니다:
. scripts/data_seeder/test_resources.sh
  • 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
  • 번들을 설치합니다:
/opt/gitlab/embedded/bin/chpst -e /opt/gitlab/etc/gitlab-rails/env /opt/gitlab/embedded/bin/bundle
  • 데이터를 시딩합니다:
gitlab-rake "ee:gitlab:seed:data_seeder[beautiful_data.rb]"

개발#

Data Seeder는 spec/factories의 FactoryBot 정의를 사용하여…

  • 개발 시간을 절약합니다.

  • 읽기 쉽습니다.

  • 유지 관리가 쉽습니다.

  • 나중에 변경될 수 있는 API에 의존하지 않습니다.

  • 항상 최신 상태를 유지합니다.

  • 데이터를 가능한 한 빠르게 생성하기 위해 가능한 가장 낮은 수준(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]"
......

팩토리 분류 체계#

팩토리는 세 가지 주요 부분으로 구성됩니다 - 팩토리의 이름, Traits, Attributes.

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

:iteration 팩토리의 이름입니다. 파일명은 이 이름의 복수형이 되며 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)

"my id"를 "my_id"로 파싱#

변수 지정을 참조하세요.

id가 유효하지 않음#

비 Ruby 파서가 ID를 Ruby 객체로 파싱하기 때문에, ID를 지정할 때 Ruby의 명명 규칙을 따라야 합니다.

유효하지 않은 ID의 예:

  • 숫자로 시작하는 ID

  • 특수 문자를 포함하는 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:을 지정하고 비워두어야 합니다. 이는 마일스톤 팩토리가 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

변수:

권장되지는 않지만 변수에 공백을 포함하여 지정할 수 있습니다. 이러한 변수는 밑줄(_)을 사용하여 참조할 수 있습니다.

변수 참조#

주어진 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 속성이 채워집니다.