今回はGitLabのProjectの作成方法を整理します。
背景
GtiLabの機能を利用するには、 Project
というリソースを用意する必要があります。Projectの作成方法は複数あるため、ここではそれらを整理・検証します。
GitLab Projectを作成するには、大きく以下の4つの方法があります。
- GitLab Webコンソールから作成
- git push による作成
- GitLab APIから作成
- IaCツールから作成
検証
今回はGitLab SaaS (Freeプラン) で検証しています。
GitLab Webコンソールから作成
まずはGitLabのWebコンソールからの方法です。
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を利用するには以前と同様アクセストークンを利用する必要があるので、事前に用意します。
プロジェクトの作成は /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でも管理可能です。