[git] hotfix

git hotfixとは?
– リリースされたバージョンで発生したバグを速やかに修正するブランチ
– 修正後すぐmaster, developブランチにマージ

なるほど、そういうことか、特別な機能があるわけではなく、そういう名称で運用するって取り決めのことね。理解した。

[git] branchのマージ

$ ls
program.txt
$ git branch
* master

// ブランチの作成
$ git branch develop
// ブランチの切り替え
$ git checkout develop

// developブランチで開発
$ cat program.txt
9104 商船三井
9107 川崎汽船
// commit
$ git add .
$ git commit -m “develop first commit”

// masterにブランチの切り替え
$ git checkout master
// masterにブランチのマージ
$ git merge develop
$ cat program.txt
9104 商船三井
9107 川崎汽船

$ git branch
develop
* master

「Automatically delete head branches」にチェックを入れておくと、pull requestがmergeされたときにブランチが消える。そうでなければ、branchはそのまま残る。

なるほど、 やってみないとわからんねこれ。

githubのレポジトリをCodeCommitに複製する

$ aws –version
aws-cli/1.22.64 Python/3.8.10 Linux/5.4.0-109-generic botocore/1.24.9
$ git –version
git version 2.25.1

$ git init
$ git add .
$ git commit -m “first commit”
$ git remote add origin https://github.com/hpscript/cicd.git
$ git push -u origin master

### CodeCommit作成
$ GITHUB_ACCOUNT=hogehoge
$ REPO_NAME=fuga
$ GITHUB_REPO_URL=https://github.com/${GITHUB_ACCOUNT}/${REPO_NAME}.git

$ aws codecommit create-repository –repository-name ${REPO_NAME}

### 複製先のRepository情報を定義
$ CODECOMMIT_REGION=ap-northeast-1
$ CODECOMMIT_REPO_URL=https://git-codecommit.${CODECOMMIT_REGION}.amazonaws.com/v1/repos/${REPO_NAME}

### 認証情報ヘルパーの設定
$ git config –global credential.helper ‘!aws codecommit credential-helper $@’
$ git config –global credential.UseHttpPath true

### CodeCommitのRepositoryにpush
$ git push ${CODECOMMIT_REPO_URL} –all

なるほどー

[Docker] flaskのアプリを作る

$ sudo docker container run –name base -it -p 8080:80 python:3.7.5-slim bash
# pip install flask==1.1.1

server.py

import flask
app = flask.Flask('app server')

@app.route('/')
def index():
	return 'Hello docker'

app.run(debug=True, host='0.0.0.0', port=80)

$ sudo docker container cp server.py base:/
# python server.py
Traceback (most recent call last):
File “server.py”, line 1, in
import os, flask
File “/usr/local/lib/python3.7/site-packages/flask/__init__.py”, line 14, in
from jinja2 import escape
ImportError: cannot import name ‘escape’ from ‘jinja2’ (/usr/local/lib/python3.7/site-packages/jinja2/__init__.py)

### コンテナからファイルを転送
$ sudo docker container cp base:/etc/hosts ./
$ cat hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 300da009fa4e

### コンテナのイメージ化
$ sudo docker commit base c2img1_app
$ sudo docker images;
REPOSITORY TAG IMAGE ID CREATED SIZE
c2img1_app latest 37a4ea8b1a13 5 seconds ago 189MB
$ sudo docker run –rm -p 8080:80 c2img1_app python -u /server.py
$ sudo docker image history c2img1_app

### imageをpush
$ sudo docker image tag c2img1_app ddddocker/c2img1_app:v1.0
$ sudo docker login
$ sudo docker push ddddocker/c2img1_app:v1.0

なんかやべえな…

GitLabの開発フローとコード管理

Merge Requestを利用したレビュープロセス

1. 保護ブランチワークフロー: 開発メンバー全員が1つのGithubプロジェクトを利用
2. フォークワークフロー:管理者やレビューアのみがリポジトリを操作できるようになっており、開発者はプロジェクトReporterアクセス権限もに付与されており、自身のリポジトリ上で開発を行う

ブランチに対して権限を付与することで、対象ブランチの偶発的な更新や削除を防ぐ

ブランチの作成
$ git checkout -b
ブランチ削除
$ git branch -d

$ git add new_feature.py
$ touch new_feature.py
$ git add .
$ git commit -m “[Add]new feature library Ref #1”
$ git push origin develop

### Merge Requestの作成
マージ先にはmasterが指定されている
開発規模の肥大化を避けるためにも小さい単位でのMerge Requestが望まれる。ただし開発の生産性と複雑度に依存する
Merge Requestがマージされると同時にテストの自動化が必要(シンタックスエラー、デプロイエラーなど)

### ブランチ戦略 GitLab Flow
機能ブランチ(Feature Branch)とMasterブランチ(Master Branch)
環境ごとにブランチを作りmasterからpre-production, productionにmerge requestを送る

なるほど〜
開発工程においてbranchの設計って凄い大事なんやな〜

Gitによるチーム開発

1. ブランチの作成
$ git branch
* master
$ git branch develop
$ git branch
develop
* master

2.ブランチの切り替え
$ git checkout develop
Switched to branch ‘develop’
$ echo -e “# GitLab Project\nObjects for GitLab” > README.md
$ cat README.md
# GitLab Project
Objects for GitLab
$ git add -u
$ git commit -m “[Modify]Update title in README.md”
[develop 895daf2] [Modify]Update title in README.md
1 file changed, 2 insertions(+)
$ git log

3.ブランチのマージ
$ git checkout master
$ git merge develop
$ cat README.md
# GitLab Project
Objects for GitLab

リモートリポジトリの活用
-> メインのリポジトリをリモートリポジトリ側に置き、各自ローカルリポジトリの更新をマージしていくことでチーム開発を進めていく

$ git branch -a
develop
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
$ git remote add gitlab https://gitlab.com/h3377/myproject.git

### リモートリポジトリの反映
$ git fetch gitlab
$ get merge FETCH_HEAD
// fetchとmergeを同時に行えるpullの方が早いが、コンフリクトを起きたときはfetch, mergeで対応する
$ git pull gitlab HEAD

### リモートリポジトリへの送信
$ vi README.md
$ git add -u
$ git commit -m “[UPDATE]Add description for README.md”
[master 79bed9e] [UPDATE]Add description for README.md
1 file changed, 1 insertion(+), 1 deletion(-)
$ git push gitlab HEAD

### Issue Tracker
– Group Issues: グループ共通の課題チケット
– Project Issues: プロジェクトで個別に割り当てられるチケット
– マイルストーンの作成
– Labels: 各課題チケットを分類するためのカテゴリ(bug, confirmed, ciritial, discussion, documentation, enhancement, suggestion, supportなどがデフォルト)
 -> チケット駆動開発(TiDD)

### Issue Board
チケットの優先順位とステータスを管理

Git基礎: リモートリポジトリ

リモートリポジトリを使う手順
1. 空のリモートリポジトリを作る
2. ローカルリポジトリの内容をリモートリポジトリに送る
3. ローカルリポジトリで作業して内容を更新する

2, 3を繰り返す

### リモートリポジトリを上流リポジトリとする
$ git init
$ git remote add origin https://github.com/hpscript/git101.git
$ git remote -v

$ git push origin master

### リモート追跡ブランチ
$ git branch -r
$ git branch -r -v

### クローン
$ git clone https://github.com/hpscript/git101.git

### リモートの更新を取得
$ git fetch リモート リモートブランチ

### リモートの更新をローカルに反映
git checkout ローカルブランチ
git merge –ff-only リモート追跡ブランチ
$ git checkout master
$ git merge –ff-only origin/master

### リモートブランチとローカルブランチを対応づけ
git branch -u
git branch -u origin/master

うーん、なんだかなー

Git基礎: タグ

Gitのタグの種類
– 軽量タグ
– 注釈付きタグ
– 署名タグ

### 軽量タグをつける
git tag タグ名
git tag タグ名 コミット

$ git tag v1.0
$ git tag
v1.0

prog.sh

#!/bin/sh

echo "Your age?"; read age
echo "Your age is $age."

$ git add .
$ git commit -m “first commit”
$ git tag v1.0
$ git tag
$ git show

### 注釈付きタグ
git tag -a タグ名
git tag -a タグ名 コミット

$ git add -u
$ git tag -a v3.0 -m “version3.0”
$ git show

### タグのついたコミットをチェックアウトする
git checkout タグ
$ git tag v1.1
$ git branch
master
* v1fix

### タグを削除する
git tag -d タグ
$ git tag -d v2.0

ニャルほどー

git基礎: ブランチ

ブランチとは履歴の枝分かれ
変更をmasterブランチに取り込むことをマージ

program.txt

春の大運動会
* 開会式
* 閉会式

$ git add program.txt
$ git commit -m “プログラム作成開始”

### ブランチを作る
git branch ブランチ名
$ git add -u
※バージョン管理されていて、変更があったすべてのファイルがaddされる
$ git commit -m “玉関係の競技追加”
$ git branch proc
$ git branch
$ git branch -v
* master 69c78cb 玉関係の競技追加
proc 69c78cb 玉関係の競技追加
git branchに-vオプションを与えると、ブランチの先頭があるコミット情報も表示される

$ git add -u
$ git commit -m “走る競技追加”
$ git branch -v
* master 66006b7 走る競技追加
proc 69c78cb 玉関係の競技追加

### ブランチ切り替え
git checkout ブランチ
$ git checkout proc
$ git branch
$ cat program.txt
春の大運動会
* 開会式
* 玉入れ
* 大玉転がし
* 閉会式

$ git checkout master
$ git branch
$ cat program.txt
春の大運動会
* 開会式
* 玉入れ
* 大玉転がし
* 二人三脚
* 徒競走
* 閉会式

$ git log –all –graph
$ git log –all –graph –oneline
* df1adc9 (proc) 選手宣誓追加
| * 66006b7 (HEAD -> master) 走る競技追加
|/
* 69c78cb 玉関係の競技追加
* 38d5fe3 プログラム作成開始

### ブランチのマージ
$ git merge proc
$ cat program.txt
春の大運動会
* 開会式
* 選手宣誓
* 玉入れ
* 大玉転がし
* 二人三脚
* 徒競走
* 閉会式

$ git ls-files -s
100644 9dc5b70af547cf38876fd39e696ca12944609018 1 program.txt
100644 8dcdb3703137b61fd6286001320d39045e9ab679 2 program.txt
100644 1203c826d8f52af84d75362c8a59f69fa399a473 3 program.txt

### ブランチを削除
git branch -d ブランチ
$ git checkout master
$ git branch -d proc

なるほどー ブランチの概念はわかったわ