GitLab のリモートリポジトリにプッシュしてみました

### 概要

「GitOps」ということで、ローカルリポジトリにある Terraform定義ファイル等を GitLab に用意されたリモートリポジトリにプッシュしてみます。簡単な流れは以下となります。

1. GitLabのプロジェクト（リモートリポジトリ）のクローン作成
2. ローカルリポジトリからリモートリポジトリへのプッシュ

### ローカル環境

- macOS Monterey 12.1
- Azure CLI 2.28.0
- terraform v1.0.11
- git 2.34.1

### 前提条件

1. GitLab環境上にアカウント（Owner）が用意されていること
2. ローカル環境に「azure cli」がインストールされていること
3. ローカル環境に「terraform」環境が構成されていること
4. ローカル環境に「git」がインストールされていること

### 事前準備

1. [GitLab で パーソナルアクセストークン を発行してみました](https://qiita.com/turupon/items/17ca6f3c770fe82ead38) でアクセストークンを入手していること
2. GitLab上で新規プロジェクトを作成していること（今回は、[このプロジェクト](https://qiita.com/turupon/items/e48ebafaecb449fa8918) を利用します）
3. [.gitignore をサクッと作成してみました](https://qiita.com/turupon/items/789124b98351f977115a)の環境が準備できていること

---

### GitLabのプロジェクト（リモートリポジトリ）のクローン作成

#### プロジェクトのURLの情報の入手

1. GitLab へサインインし、該当プロジェクトを選択します。
2. 新しく表示される画面の右側にある「クローン」リストボタンを押し、「HTTPSでクローン」のURLをどこかにコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/221c575e-8374-54a4-a2c8-e7dc19cabe80.png)

#### ローカル環境でのクローン作成

１. ローカル環境にて gitの設定を行います。

```
## gitの設定
$ git config --global user.name "<GitLabに接続するユーザ名>"
$ git config --global user.email <GitLabに接続するユーザのメールアドレス>

## gitの設定内容の確認
$ git config --list
```

２. 「git clone」を実行します。

```
## クローン作成
$ git clone <該当プロジェクトのURL>
Cloning into 'basic'...
remote: HTTP Basic: Access denied
fatal: Authentication failed for '<該当プロジェクトのURL>'

## 上記エラーが帰って場合、以下のコマンドを実行
$ git config --system --unset credential.helper

## 再度クローンを作成
$ git clone <該当プロジェクトのURL>
Cloning into 'basic'...
Username for 'https://gitlab.xxxxxxxx': <GitLabに接続するユーザ名>
Password for 'https://itsuruzono@gitlab.xxxxxxxx': <上記ユーザ名のアクセストークン>
remote: Enumerating objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.

## クローン結果の確認
$ ls -l
total 0
drwxr-xr-x  3 ituru  staff   96  1 19 15:53 ./
drwxr-xr-x  4 ituru  staff  128  1 18 17:00 ../
drwxr-xr-x  4 ituru  staff  128  1 19 15:54 basic/

$ cd basic
$ ls -l
total 8
drwxr-xr-x   4 ituru  staff  128  1 19 15:54 ./
drwxr-xr-x   3 ituru  staff   96  1 19 15:53 ../
drwxr-xr-x  13 ituru  staff  416  1 19 15:54 .git/
-rw-r--r--   1 ituru  staff   50  1 19 15:54 README.md
```

３. 「.gitignore」の作成

```
## .zshrc に定義した Function をコール
$ GitIgnore
$ ls -l
drwxr-xr-x   5 ituru  staff   160  1 19 16:10 ./
drwxr-xr-x   3 ituru  staff    96  1 19 15:53 ../
drwxr-xr-x  13 ituru  staff   416  1 19 15:54 .git/
-rw-r--r--   1 ituru  staff  4327  1 19 16:10 .gitignore
-rw-r--r--   1 ituru  staff    50  1 19 15:54 README.md
```

---

### ローカルリポジトリからリモートリポジトリへのプッシュ

#### ローカルリポジトリへのコミット

１. Terraform定義ファイルを作成します。また、内容に合わせ「README.md」を編集します。

```
## 作業ディレクトリでの上記実行後の構成
$ ls -l
total 24
drwxr-xr-x   6 ituru  staff   192  1 19 16:21 ./
drwxr-xr-x   3 ituru  staff    96  1 19 15:53 ../
drwxr-xr-x  13 ituru  staff   416  1 19 15:54 .git/
-rw-r--r--   1 ituru  staff  4327  1 19 16:10 .gitignore
drwxr-xr-x   8 ituru  staff   256  1 19 16:21 Base/
-rw-r--r--   1 ituru  staff   143  1 19 16:25 README.md

$ tree -a
.
├── .git
│   ├── FETCH_HEAD
│   ├── HEAD
│   ├── config
│   ├── description
│   ├── hooks
│   │   ├── applypatch-msg.sample
│   │   ├── commit-msg.sample
│   │   ├── fsmonitor-watchman.sample
│   │   ├── post-update.sample
│   │   ├── pre-applypatch.sample
│   │   ├── pre-commit.sample
│   │   ├── pre-merge-commit.sample
│   │   ├── pre-push.sample
│   │   ├── pre-rebase.sample
│   │   ├── pre-receive.sample
│   │   ├── prepare-commit-msg.sample
│   │   ├── push-to-checkout.sample
│   │   └── update.sample
│   ├── index
│   ├── info
│   │   └── exclude
│   ├── logs
│   │   ├── HEAD
│   │   └── refs
│   │       ├── heads
│   │       │   └── main
│   │       └── remotes
│   │           └── origin
│   │               └── HEAD
│   ├── objects
│   │   ├── info
│   │   └── pack
│   │       ├── pack-fa6ffae153cd2baabdfa742a8b2137b1c794b1e3.idx
│   │       └── pack-fa6ffae153cd2baabdfa742a8b2137b1c794b1e3.pack
│   ├── packed-refs
│   └── refs
│       ├── heads
│       │   └── main
│       ├── remotes
│       │   └── origin
│       │       └── HEAD
│       └── tags
├── .gitignore
├── Base
│   ├── .terraform
│   │   ├── providers
│   │   │   └── registry.terraform.io
│   │   │       └── hashicorp
│   │   │           └── azurerm
│   │   │               └── 2.92.0
│   │   │                   └── darwin_amd64
│   │   │                       └── terraform-provider-azurerm_v2.92.0_x5
│   │   └── terraform.tfstate
│   ├── .terraform.lock.hcl
│   ├── main.tf
│   ├── terraform.tfvars
│   ├── terraform_AzureBase.md
│   └── variables.tf
└── README.md

24 directories, 36 files
```

２ ローカルリポジトリへコミットします。

```
## 作業ディレクトリ内の変更をステージング領域に追加
$ git add -A

## ステージングされたスナップショットをローカルリポジトリに登録(コミット)
$ git commit -m "First Commit"
[main xxxxxxx] First Commit
 6 files changed, 663 insertions(+), 1 deletion(-)
 create mode 100644 .gitignore
 create mode 100644 Base/.terraform.lock.hcl
 create mode 100644 Base/main.tf
 create mode 100644 Base/terraform_AzureBase.md
 create mode 100644 Base/variables.tf
```

３. リモートリポジトリへプッシュします。

```
## ローカルリポジトリからリモートリポジトリへのプッシュ
$ git push
Username for 'https://gitlab.xxxxxxxx': <GitLabに接続するユーザ名>
Password for 'https://itsuruzono@gitlab.xxxxxxxx': <上記ユーザ名のアクセストークン>
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 16 threads
Compressing objects: 100% (9/9), done.
Writing objects: 100% (9/9), 7.99 KiB | 7.99 MiB/s, done.
Total 9 (delta 0), reused 0 (delta 0), pack-reused 0
To https://gitlab.xxxxxxxx/terraformdeazure_01/basic.git
   21ce6e4..937fe5c  main -> main
```

GitLabでプッシュの結果を確認します。.gitignoreで定義されている不要ファイル・ディレクトリはなく、必要なもののみ存在を確認できます。また、 README.md ファイルも変更されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/165f6a67-3495-2545-d5dc-1600bb5fc0f4.png)

---

### まとめ

これで ローカルリポジトリにある情報を リモートリポジトリである GitLab のプロジェクトへ問題なくプッシュできることを確認できました。