TECHSTEP

ITインフラ関連の記事を公開してます。

GitLab Projectの作成方法の整理

今回はGitLabのProjectの作成方法を整理します。

背景

GtiLabの機能を利用するには、 Project というリソースを用意する必要があります。Projectの作成方法は複数あるため、ここではそれらを整理・検証します。

docs.gitlab.com

GitLab Projectを作成するには、大きく以下の4つの方法があります。

  • GitLab Webコンソールから作成
  • git push による作成
  • GitLab APIから作成
  • IaCツールから作成

検証

今回はGitLab SaaS (Freeプラン) で検証しています。

GitLab Webコンソールから作成

まずはGitLabのWebコンソールからの方法です。

docs.gitlab.com

GitLabにログイン後、 プロジェクト に移動し、 新しいプロジェクト を選択します。

ここから作成する場合は4つの選択肢があります。

  • 空のプロジェクトを作成: 何のファイルも含まないプロジェクトを作成します
  • テンプレートから作成: ビルトイン、またはインスタンスやグループで共有されたテンプレートから作成します
  • プロジェクトのインポート: GitHubや別のGitLabインスタンスからデータを移行します
  • 外部リポジトリのCI/CDを実行: GitHubなどの外部リポジトリと接続し、GitLab CI/CDを実行します

まず 空のプロジェクトを作成 を選択した場合です。ここでは以下のパラメータを設定します。

  • プロジェクト名: ここでは test-project-01 を指定
  • プロジェクトのURL: ここではnamespace (グループ or ユーザー) を指定します
  • プロジェクトslug: デフォルトではプロジェクト名が入ります
  • プロジェクトデプロイメントターゲット(オプション): KubernetesやTerraformなどのデプロイターゲットを指定します
  • 表示レベル: プライベート or 公開 を指定します
  • プロジェクトの設定
    • リポジトリを初期化しREADMEファイルを生成する
    • 静的アプリケーションセキュリティテスト(SAST)を有効にする

特に問題なければプロジェクトは作成されます。

続いて テンプレートから作成 の場合です。テンプレートから作成の場合、3つの方法があります。

  • ビルトイン: GitLabの提供するテンプレートから好きなものを選択します
  • インスタンス: インスタンス上の特定のProject上にカスタムテンプレートを用意し、インスタンス上で利用できます (Self-managed, Premiumプラン以上のみ)
  • グループ: 特定のProjectをテンプレートとして利用できます (Premiumプラン以上のみ)

ここでは利用可能な ビルトイン から適当なものを選択します。

ここで プレビュー を選択すると、作成後のプロジェクトの様子を事前に確認できます。

作成時はプロジェクト名やURLなど、 空のプロジェクトを作成 と同様の設定を指定できます。

プロジェクトを作成 を選択すると以下のような画面に遷移します。 テンプレートから作成 は、GitLabの別のProjectをインポートしてProjectを作成するため、以下のような画面が表示されます。

特に問題なければProjectが作成されます。

git pushによる作成

git push によるリポジトリの作成はGitHubでも利用可能ですが、GitLabも同様に対応しています。

ここではローカル環境にGitリポジトリを作成し、最終的にはGitLabにPushすることでプロジェクトを作成します。

$ mkdir test-project-03
$ cd test-project-03/

# 初期化
$ git init

# 適当なファイルの作成とコミット
$ echo "test-project-03" >> README.md
$ git add .
$ git commit -m "initial commit"

# git push
$ git push --set-upstream https://gitlab.com/fy0323/test-project-03.git master

Webコンソールを見ると、指定のプロジェクトの作成を確認できます。

GitLab APIから作成

GitLabは各種APIを提供しており、Project APIも提供しています。APIを利用するには以前と同様アクセストークンを利用する必要があるので、事前に用意します。

docs.gitlab.com

プロジェクトの作成は /projects に対しPOSTリクエストを実行します。

$ curl --request POST \
       --header "PRIVATE-TOKEN:<GitLabアクセストークン>" \
       --form "name=test-project-04" "https://gitlab.com/api/v4/projects/"

返り値を整形したものが以下です。

APIへのリクエストの返り値

{
    "id": 53500118,
    "description": null,
    "name": "test-project-04",
    "name_with_namespace": "Futa Yamaji / test-project-04",
    "path": "test-project-04",
    "path_with_namespace": "fy0323/test-project-04",
    "created_at": "2024-01-03T02:04:59.831Z",
    "default_branch": "main",
    "tag_list": [],
    "topics": [],
    "ssh_url_to_repo": "git@gitlab.com:fy0323/test-project-04.git",
    "http_url_to_repo": "https://gitlab.com/fy0323/test-project-04.git",
    "web_url": "https://gitlab.com/fy0323/test-project-04",
    "readme_url": null,
    "forks_count": 0,
    "avatar_url": null,
    "star_count": 0,
    "last_activity_at": "2024-01-03T02:04:59.831Z",
    "namespace": {
        "id": 5188655,
        "name": "Futa Yamaji",
        "path": "fy0323",
        "kind": "user",
        "full_path": "fy0323",
        "parent_id": null,
        "avatar_url": "https://secure.gravatar.com/avatar/f80a051bbccca2f8581c42f58223f90f?s=80&d=identicon",
        "web_url": "https://gitlab.com/fy0323"
    },
    "container_registry_image_prefix": "registry.gitlab.com/fy0323/test-project-04",
    "_links": {
        "self": "https://gitlab.com/api/v4/projects/53500118",
        "issues": "https://gitlab.com/api/v4/projects/53500118/issues",
        "merge_requests": "https://gitlab.com/api/v4/projects/53500118/merge_requests",
        "repo_branches": "https://gitlab.com/api/v4/projects/53500118/repository/branches",
        "labels": "https://gitlab.com/api/v4/projects/53500118/labels",
        "events": "https://gitlab.com/api/v4/projects/53500118/events",
        "members": "https://gitlab.com/api/v4/projects/53500118/members",
        "cluster_agents": "https://gitlab.com/api/v4/projects/53500118/cluster_agents"
    },
    "code_suggestions": true,
    "packages_enabled": true,
    "empty_repo": true,
    "archived": false,
    "visibility": "private",
    "owner": {
        "id": 3976409,
        "username": "fy0323",
        "name": "Futa Yamaji",
        "state": "active",
        "locked": false,
        "avatar_url": "https://secure.gravatar.com/avatar/f80a051bbccca2f8581c42f58223f90f?s=80&d=identicon",
        "web_url": "https://gitlab.com/fy0323"
    },
    "resolve_outdated_diff_discussions": false,
    "container_expiration_policy": {
        "cadence": "1d",
        "enabled": false,
        "keep_n": 10,
        "older_than": "90d",
        "name_regex": ".*",
        "name_regex_keep": null,
        "next_run_at": "2024-01-04T02:04:59.857Z"
    },
    "issues_enabled": true,
    "merge_requests_enabled": true,
    "wiki_enabled": true,
    "jobs_enabled": true,
    "snippets_enabled": true,
    "container_registry_enabled": true,
    "service_desk_enabled": true,
    "service_desk_address": "contact-project+fy0323-test-project-04-53500118-issue-@incoming.gitlab.com",
    "can_create_merge_request_in": true,
    "issues_access_level": "enabled",
    "repository_access_level": "enabled",
    "merge_requests_access_level": "enabled",
    "forking_access_level": "enabled",
    "wiki_access_level": "enabled",
    "builds_access_level": "enabled",
    "snippets_access_level": "enabled",
    "pages_access_level": "private",
    "analytics_access_level": "enabled",
    "container_registry_access_level": "enabled",
    "security_and_compliance_access_level": "private",
    "releases_access_level": "enabled",
    "environments_access_level": "enabled",
    "feature_flags_access_level": "enabled",
    "infrastructure_access_level": "enabled",
    "monitor_access_level": "enabled",
    "model_experiments_access_level": "enabled",
    "model_registry_access_level": "enabled",
    "emails_disabled": false,
    "emails_enabled": true,
    "shared_runners_enabled": true,
    "lfs_enabled": true,
    "creator_id": 3976409,
    "import_url": null,
    "import_type": null,
    "import_status": "none",
    "import_error": null,
    "open_issues_count": 0,
    "description_html": "",
    "updated_at": "2024-01-03T02:04:59.831Z",
    "ci_default_git_depth": 20,
    "ci_forward_deployment_enabled": true,
    "ci_forward_deployment_rollback_allowed": true,
    "ci_job_token_scope_enabled": false,
    "ci_separated_caches": true,
    "ci_allow_fork_pipelines_to_run_in_parent_project": true,
    "build_git_strategy": "fetch",
    "keep_latest_artifact": true,
    "restrict_user_defined_variables": false,
    "runners_token": "<Runner token>",
    "runner_token_expiration_interval": null,
    "group_runners_enabled": true,
    "auto_cancel_pending_pipelines": "enabled",
    "build_timeout": 3600,
    "auto_devops_enabled": false,
    "auto_devops_deploy_strategy": "continuous",
    "ci_config_path": "",
    "public_jobs": true,
    "shared_with_groups": [],
    "only_allow_merge_if_pipeline_succeeds": false,
    "allow_merge_on_skipped_pipeline": null,
    "request_access_enabled": true,
    "only_allow_merge_if_all_discussions_are_resolved": false,
    "remove_source_branch_after_merge": true,
    "printing_merge_request_link_enabled": true,
    "merge_method": "merge",
    "squash_option": "default_off",
    "enforce_auth_checks_on_uploads": true,
    "suggestion_commit_message": null,
    "merge_commit_template": null,
    "squash_commit_template": null,
    "issue_branch_template": null,
    "autoclose_referenced_issues": true,
    "external_authorization_classification_label": "",
    "requirements_enabled": false,
    "requirements_access_level": "enabled",
    "security_and_compliance_enabled": true,
    "compliance_frameworks": []
}

Webコンソールを見てもプロジェクトの作成を確認できます。

IaCツールから作成

今回は実施していませんが、GitLabのプロジェクトはAWS CloudFormation / Terraformでも管理可能です。

github.com

registry.terraform.io