CI/CDをkatacodaで体験（初心者向け） - Part1 

# CI/CD入門
このぺーじでは、[katacoda](https://www.katacoda.com/)と呼ばれる「ブラウザから無料で勉強用のインスタンスを起動できるWebサービス」を利用してCI/CDを実践します
内容は上記リンクに沿うので、不明点があればそちらへどうぞ

## Gitのバージョン管理について - scenario1
ここでは、CI/CDとして欠かせないGitによるバージョン管理について学習します
このシナリオで学習することをさっと確認する場合は**概要**を確認

### <font color="Red">概要</font>
>- ```git init```でカレントディレクトリ以下をバージョン管理
- ```git status```でレポジトリの状態と異なる状態（追跡、新規作成、ワーキングディレクトリ、ステージング、削除等）のファイルが表示される
- ```git add```でファイルやディレクトリをステージング化（=インデックスへ登録）
- ```git commit -m "<comment>"```でレポジトリへ追加（コメントは変更の内容を明らかにするのでこの形で覚えることが好ましい）


### Gitの初期化
Gitの管理下に置きたいプロジェクトの最上位ディレクトリに移動
該当のディレクトリで```git init```を実行することでそのディレクトリ以下がGitHubのローカルレジストリとして扱われる

```
$ ls -a
.  ..
$ git init
Initialized empty Git repository in /home/scrapbook/tutorial/.git/   //pathは実行環境によって異なる
$ ls -a
.  ..  .git
$ ls .git/
branches  config  description  HEAD  hooks  info  objects  refs
```
この場合、Gitのバージョン管理が行われる範囲は```/home/scrapbook/tutorial/```以下となる[参考リンク](https://qiita.com/tatane616/items/dbad66179754be57d2e2)
```.git```配下に保存される情報は以下の通りである
>- HEAD:現在のブランチの参照
- branches: git fetch、git pull、およびgit pushのURLを省略形を指定するために使用される、廃止予定
- config: リポジトリのGit設定、git configで設定するメールなど
- description: GitWeb(gitのデフォルトのWebUI)で使われる
- hooks: Gitの各コマンドを実行した時に呼び出されるスクリプトを設定できる(e.g. pre-commitならgit commitの前)
- info: このリポジトリに対する追加情報
    - exclude: .gitignoreのようなもの
- objects:Gitの実体(オブジェクト)が保存される場所
    - info: オブジェクトに対する追加情報
    - pack: ランダムアクセスするためのインデックスファイルや、多数のオブジェクトを圧縮したファイル
- refs: Gitの各参照先が保存されている場所
    - heads: 参照先のブランチ(実体はコミットオブジェクト)
    - tags: 参照先のタグ名(実体はコミットオブジェクト)
>

### Gitの状態
レポジトリの一部であるディレクトリをworking directryと呼ぶ
ワーキングディレクトリには、レポジトリからダウンロードした最新版。もしくは、最新版に編集を加えたファイル等が保管されている
```git status```では、現在の作業ディレクトリとレポジトリとで変更されたファイルを表示する

```
$ ls -a
.  ..  .git  hello-world.js  testdir  test.js   //jsファイルを２つ作成 新規directry作成
$ vi testdir/sub-test.js   //jsファイル作成
$ ls -a
.  ..  sub-test.js
$ git status
On branch master
No commits yet
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        hello-world.js
        test.js
        testdir/

nothing added to commit but untracked files present (use "git add" to track)
$ git status -uall   //新規（追跡されていない）ディレクトリにあるファイルも表示
On branch master
No commits yet
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        hello-world.js
        test.js
        testdir/sub-test.js

nothing added to commit but untracked files present (use "git add" to track)
```
上の結果から分かる通り、オプションをつけないと、該当のワーキングディレクトリ内での差分のみが出力される
オプションについては[こちらを参考](https://qiita.com/m-yamazaki/items/45ea4a71ebb769995043)

### Gitのステージ化（indexへの移動）
変更を加えたファイル、ディレクトリは「ワーキングディレクトリ」－＞「index」－＞「レポジトリ」と遷移させます
ステージ(index)の必要性に関しては[こちら](https://www.ninton.co.jp/archives/3218#toc1)を参考にしてください
完結にステージの必要性を挙げると以下の通りです
- 編集後即、ステージに移動させることでユーザ自身や他人からの予期せぬ変更からコードを守れる
- commit（後程説明）前に再確認できるため、コミット内容とコメントを合致させることが可能

```
$ git add hello-world.js
$ git status   //"hello-world.js"以外のファイル、ディレクトリは削除してある
On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   hello-world.js
```

### Gitのコミット
```git commit -m "(comment)"でステージング上のファイル等をレポジトリに移動させることが可能
その際に、時刻/日付、作成者の情報も一緒に記録される

```
$ git commit -m "hello-world.js to repository"
[master (root-commit) eb399cd] hello-world.js to repository
 1 file changed, 1 insertion(+)
 create mode 100644 hello-world.js
$ git status
On branch master
nothing to commit, working tree clean
```

### バージョン管理しないファイルの設定
Gitには、ローカル開発構成など、コミットしたくない特定のファイルやディレクトリがある場合があります。
これらのファイルを無視するには、リポジトリのルートに.gitignoreファイルを作成します。

```
$ echo '*.tmp' > .gitignore
$ ls -a
.  ..  .git  .gitignore  hello-world.js
$ cat .git
cat: .git: Is a directory
$ cat .gitignore
*.tmp
$ git add .gitignore
$ git commit -m 'gitignore file'
[master 3ed634d] gitignore file
 1 file changed, 1 insertion(+)
 create mode 100644 .gitignore
```
今回はバージョン管理しないファイルとして```(hoge).tmp```(hoge)の部分にはワイルドカードとしてアスタリスクを利用