Git essential training & sharing self

80
Continuous Integration with Git 2015.10.6 Blackie

Transcript of Git essential training & sharing self

Page 1: Git essential training & sharing self

Continuous Integration with Git

2015.10.6

Blackie

Page 2: Git essential training & sharing self

What is Git

Different between Git and SVN

How could we become "Stronger" through the Git

Git tutorial

Implement Git on Xuenn

CI&CD example with DNG Team

Page 3: Git essential training & sharing self

Who am I

Blackie Tsai

Senior IT consultant of Xuenn

Full stack developer

Major on development of real-time transaction system with low latency and high concurrent

Learning CI&CD and run with Agile&LEAN

Blog

http://www.dotblogs.com.tw/blackie1019

Page 4: Git essential training & sharing self

Facing problems of Development

• Some CR require a long-period of development like 1 monthor more. And we have a lot of tickets need to patch toUAT/PROD.

• Hard to merge with branch, and always miss some commitlogs when merge from each branch to trunk every time.

• Each branch will need create on the central repository and itwill bothering other people who collaborate with you.

• Some modules not own by the same team but need tomodify with another team change request.

• Every action will need connect to server and it’s slow and notprevent for single point of failure.

Page 5: Git essential training & sharing self

Facing problems of Deployment

• No choice for release packages even we know this versionhave defects.

• Hard to revert to any previous version, even we using SVN. • If we need Jenkins help doing some automation with branch

out new repository . Always will need to modify/add somesteps of setting of Jenkins.

Page 6: Git essential training & sharing self

Facing problems of Project Management

• Can not doing frequently change with long-period development, even youhave enough development resource.

• Too many working hour waste on Merging and Releasing check.• No quality when doing revert to any previous version.

Page 7: Git essential training & sharing self

Today Deployment Flow

Hotfix

Normal

Page 8: Git essential training & sharing self

Use Case - Revert

Now we have CR-1 and CR-2 deploy to UAT, but…

I found critical issue on CR-1, it cannot be deployed to PROD.

Ok… revert CR-1 on UAT, I hope CR-2 can go live on schedule.

I don’t have any build version can revert,I need …..

Page 9: Git essential training & sharing self

A B C

Use Case - Revert : SVN

CR-1 CR-2CR-1CR-2

CR-1CR-2

Page 10: Git essential training & sharing self

Use Case – Revert : Git

A B C

CR-1 CR-1 CR-2CR-2

CR-1 CR-2

CR-1 CR-2

Page 11: Git essential training & sharing self

WHAT IS GIT

Page 12: Git essential training & sharing self

Git Introduction

Git is a Free widely used version control system for software development. It is a version control system with an emphasis on Speed, Data Integrity, and support for Distributed, Non-linear Workflows.

Git was born on 2005 to support Linux Kernal for source code management(they using Bitkeeper VCSbefore Git) and handling thousands of developer operating in the same time(First commit with 670 billionsline of code).

Code Review become easy with using Pull request on Git(e.g. Github, BitBucket, Gitlab…etc).

Page 13: Git essential training & sharing self

DIFFERENT BETWEEN GIT AND SVN

Page 14: Git essential training & sharing self

Staging Area

Staging Area

Page 15: Git essential training & sharing self

Distribution

Distributed

Difference between SVN and Git

Or

Page 16: Git essential training & sharing self

Small and Fast - Fast

Small and Fast

Page 17: Git essential training & sharing self

Small and Fast - Size comparison

Original Git vs converted SVN. Original SVN vs converted Git.

Page 18: Git essential training & sharing self

Data Assurance

Data Assurance

Git is content-addressable file system

Git using KeyValue with SHA-1 to stored data with a UUID.

If the file contents are damaged, you will find different with SHA1.

If the tree to change the file name will be found.

This is important in distributed systems when data from one developer to another developer, ensure that the information has not been modified

Page 19: Git essential training & sharing self

Git Object Types

Blob

Just a bunch of bytes that could be anything, like a text file, source code, or a picture, etc.

Tree

like a file system directory. A Git tree can point to, or include:

Git “blob” objects (similar to a file system directory includes file system files).

Other git trees (similar to a file system directory can have subdirectories).

Commit

Information about who committed (made) the change/check-in/commit. For example, it stores the name and email address.

A pointer to the git tree object that represents the Git repository when the commit was done

The parent commit to this commit (so we can easily find out the situation at the previous commit).

Tag

Points to any Git commit object.

A Git tag can be used to refer to a specific tree, rather than having toremember or use the hash of the tree.

ihower.tw - Git 內部原理、Git-內部原理-Git-物件、All Git Object Types: Blob, Tree, Commit And Tag

Page 20: Git essential training & sharing self

Data Assurance - Blob

Page 21: Git essential training & sharing self

Data Assurance - Tree

Page 22: Git essential training & sharing self

Data Assurance - Commit

Page 23: Git essential training & sharing self

Data Assurance – Commit(Multiple)

Page 24: Git essential training & sharing self

Branching-and-merging

Branching-and-merging

Page 25: Git essential training & sharing self

Pros and Cons

SVN Git

Pros • Newer system based on CVS• Includes atomic operations• Cheaper branch operations• Wide variety of plug-ins for IDEs• Does not use peer-to-peer model

• Great for those who hate CVS/SVN• Dramatic increase in operation speed• Cheap branch operations• Full history tree available offline• Distributed, peer-to-peer model

Cons • Still contains bugs relating to renaming files and directories

• Insufficient repository management commands• Slower comparative speed

• Learning curve for those used to SVN• Not optimal for single developers• Limited Windows support compared to Linux

http://biz30.timedoctor.com/git-mecurial-and-cvs-comparison-of-svn-software/

Page 26: Git essential training & sharing self

Conclusion

Cheap Local Branching

Everything is Local

Git is Fast

Git is Small

The Staging Area

Distributed

Any Workflow

Easy to Learn

SaaS support like GitHub or Bitbucket

Page 27: Git essential training & sharing self

HOW COULD WE BECOME "STRONGER" THROUGH THE GIT

Page 28: Git essential training & sharing self

Recap Version Control System

Why we need it

Archives by others or themselves cover, even missing

Want to recover a few days ago version

Want to know where are the difference between writing before latest change.

Who changed this code and why

Need to be divided into Developer Edition and Production Edition

What are a VCS requirements

Establish Repository (repository), used to store code.

Easy to spread the program to the team, efficient collaborative development.

Records who changed what, at what time, for what reason.

Branch (branch), can be developed separately due to the different scenarios

Tag (Tag) an important milestone for reference

Page 29: Git essential training & sharing self

Local VCS

• Unable Collaborative Development

e.g. Paste Folder/Files manually

Page 30: Git essential training & sharing self

Centralized VCS

• Need connect central server and damn slow

• Single point of failure

e.g. CVS, SVN, Perforce

Page 31: Git essential training & sharing self

Distributed VCS

e.g. Git, Mercuria, Bazaar

• Fast and support offline• Multivariate workflows• Distributed, enable

scale out

Page 33: Git essential training & sharing self

SVN is good but…

Page 34: Git essential training & sharing self
Page 35: Git essential training & sharing self

Git - Branching

It means you can do something like below:

Change with experimental nature, for example you want to rewrite the new algorithm, code refactoring, etc.

CRG level change request development

Bug fixes, but you may need to do some experiments in the end did not know how to fix it

Example:

建立一個分支來試試新點子,提交 (commit) 個幾次然後切回你原本的分支,加上一個 patch 然後再切回剛剛實驗用的分支,把它合併進來。或結果發現這樣行不通就刪掉這個分支;放棄一個分支,甚至沒有任何人知道它曾經存在 (同時你還可以把其他的分支公佈出去)。

有一個分支只用來放要釋出的版本,另一個用來合併開發中的部份供測試,其他幾個小分支用來放每天的開發工作,當正式環境需要哪一個版本的功能就拿該版本去發行使用。

替每一個你正在實做的新功能建立新的分支,然後你就可以平順的在它們之中切換,最後刪除掉每一個新功能已經合併回主線的分支並且成功保留每個修改紀錄。

Page 36: Git essential training & sharing self

Git - Merging

Straight merge

Default mode of merge, there will be all merged branch commits record with a merge-commit, it look like two parent lines, and retains all commit log.

Squashed commit

Compressed into only a merge-commit, will not remain the merged logs. Just like SVN merge.

Cherry-pick

Merge specific commit.

Rebase

Change branch point of the branch: Re-apply (or so-called patch) the current branch of commits to the branch of rebase. This way just fit for not ready to sharing with others from local branch, cause they will delete all commits record of current one.

For example, in "A" branch we branch a "B" branch as rebase one, will put all of A commits after recording the original branch point, and then modify on the B branch commit, and after that commit into a new branch point of the latest commit B branch.

https://ihower.tw/blog/archives/2620

Page 37: Git essential training & sharing self

Git - Merging : Fast-Forward

Merge with Fast-Forward

git merge --ff feature1

Merge without Fast-Forward

git merge --no-ff feature1

Git merge 時使用 fast-forward 的差別

Page 38: Git essential training & sharing self

Git - Theory

Git rebase 和merge 合併操作示範錄影

Page 39: Git essential training & sharing self

Git - Merging : Rebase + Merge

http://www.librador.com/2013/11/15/Avoid-pull-merge-mess-in-Git/

Straight merge Rebase+Merge

Page 40: Git essential training & sharing self

Pull Request on other team repository

Fork• Fork this project to your account.

Create• Create a branch for the change you intend to make.

Commit• Make your changes to your fork.

Request• Send a pull request from your fork’s branch to our master branch.

Merge• Owner review Contributor pull request and merge it to master branch.

Git-SCM : Git Request-Pull、Example with g0v

Page 41: Git essential training & sharing self

GIT TUTORIAL

Page 42: Git essential training & sharing self

Basic Git Flow Recap

Git Workflows Book

Page 43: Git essential training & sharing self

Git and SVN Command

Command Course

http://git.or.cz/course/svn.html

Page 44: Git essential training & sharing self

Git Flow and Command

https://github.com/mattharrison/Git-Supervisual-Cheatsheet

Page 45: Git essential training & sharing self

Code School – Try Git

https://try.github.io/

Page 46: Git essential training & sharing self
Page 47: Git essential training & sharing self

IMPLEMENT GIT ON XUENN

Page 48: Git essential training & sharing self

Git Server

Practice : Bonobo

Git server with GUI support and hosted on windows IIS

Integrating with AD

Formal : GitLab

Similar with GitHub

Using Docker to setup GitLab CE

http://notes.jigsawye.com/2015/09/25/gitlab-ce-in-docker/

Evaluating : GitHub Enterprise

Just same with Github but using VM to provider data storage(Just like LDAP and CAS)

What is the best hosted version control service?

Page 49: Git essential training & sharing self

Git Tool

SVN Git migration

SubGit

介紹好用工具:SubGit ( 輕鬆將 SVN 專案移轉到 Git 的工具 )

Git-SVN

Git Command with SVN repository

Follow these guidelines(Git-SCM : Git 與 Subversion):Keep a linear Git history that doesn’t contain merge commits made by Git merge. Rebase any work you do outside of your mainline branch back onto it; don’t merge it in.

Don’t set up and collaborate on a separate Git server. Possibly have one to speed up clones for new developers, but don’t push anything to it that doesn’t have a git-svn-id entry. You may even want to add a pre-receive hook that checks each commit message for a git-svn-id and rejects pushes that contain commits without it.

Git Client

Git for windows (mysysGit) = GitBash + Git GUI

TortoiseGit

SourceTree

MVA: Using Git with Visual Studio 2013 Jump Start

Page 50: Git essential training & sharing self

Git Client - Setup

Basic

git config --global user.name Your Name

git config --global user.email [email protected]

git config --global color.ui true

Windows : new line issue

git config --global core.autocrlf true

git config --global core.safecrlf true

If you need proxy(http, https) or SSL setting

git config --global http.proxy http://account:password@proxy Domain:port

git config --global https.proxy https://account:password@proxy Domain:port

git config --global http.sslcainfo /bin/curl-ca-bundle.crt

* If the text you enter with special characters (such as $ #% ^ ... and other text), you need to convert content into a special format character codes with HTML character codes .

Example:

If password is $RFV5tgb, it will need typing %24RFV5tgb to the setting

[Git]Using Git bash with Proxy setting

Page 51: Git essential training & sharing self

Git Client - .gitignore

Specifies intentionally untracked files to ignore

A gitignore file specifies intentionally untracked files that Git should ignore. Files already tracked by Git are not affected; see the NOTES below for details.

A collection of .gitignore templates

https://github.com/github/gitignore

Page 52: Git essential training & sharing self

Recap Git tutorial

Create new repository or Clone someonegit init or git clone

Add new file from working directory to staging areagit add

Commit change (staging area to Git repository)git commit -m “Do some change”

Check out now repositorygit checkout

Revert to taget version with specific SHA1git revert e37c75787

Do another modify and add to staging areagit add

Commit changegit commit -m “Revert to e37c75787 and do some change”

Push to Servergit push

Pull/Fetch from Servergit pull/ git fetch

Page 53: Git essential training & sharing self

Git Client - SourceTree

SourceTree is a free Mercurial and Git Client for Windows and Mac that provides a graphical interface for your Hg and Git repositories.

Source Tree 簡介

Page 54: Git essential training & sharing self

Git Client – SourceTree : UI

Page 55: Git essential training & sharing self

Git Client – SourceTree : Configuration

Page 56: Git essential training & sharing self

Git Client – SourceTree : New Git Project

Page 57: Git essential training & sharing self

Git Client – SourceTree : Commit change

Page 58: Git essential training & sharing self

Git Client – SourceTree : Pull

Page 59: Git essential training & sharing self

Git Client – SourceTree : Push

Page 60: Git essential training & sharing self

CI&CD EXAMPLE WITH DNG TEAM

Page 61: Git essential training & sharing self

Development Evolution

Plan Code Build Test Release Deploy Operate

Agile Development

Continuous Integration

Continuous Deployment

DevOps

Page 62: Git essential training & sharing self

DNG Team

Development• Specify

• Code

• Unit Test

• Integration Test

• Version Control

CI/CD• Build

• Auto Test

• Human Verify

• Release Control

• PROD Release

Ops• Logging

• Monitoring

Page 63: Git essential training & sharing self

YT Support Monitoring

Daily Monitoring

Connection

Memory

CPU

Page 64: Git essential training & sharing self

RTX Support Site

Page 65: Git essential training & sharing self

LogCollector+ LogParser

LogCollecotr

Bat

Client

Server

LogFileMaintainer

LogToSQL

PurgeLog

LogParser

Visualize result of chart

Page 66: Git essential training & sharing self

Jenkins Automation Test and Daily Release

Unit Test(Single domain)

Integration Test(Multiple domain)

Auto Test(Using selenium)

Page 67: Git essential training & sharing self

Simple Continue Integration with Git - Graphic

Git, Feature Branches, and Jenkins – or how I learned to stop worrying about broken builds

Page 68: Git essential training & sharing self

Simple Continue Integration with Git - Flow

Page 69: Git essential training & sharing self

SVN Regular Release Flow

ITCLocal

DEV QAT UAT PROD

Get new CR or ticket

Checkout for fix bug

BuildDeploy

Unit TestAuto test

Sanity test

Push to UATDeployment

Merge to PRODDeployment

Merge to QATCommit

BuildDeploy

Unit TestAuto test

Page 70: Git essential training & sharing self

Git Regular Release Flow

Master (PRD)

Test Env.

QAT UATTest Env.

DEVITC

Local

Get new CR or ticket

Checkout for fix bug

BuildDeploy

Unit TestAuto test

All successPush and merge

to DEV

Follow this rule to make each ticket as a

node

BuildDeploy

Unit TestAuto test

All successMerge to QAT

Now we get other QAT note

After QA human test,There only two days

QAT can merge to UAT

Rebase to Master,do PROD deployment

Page 71: Git essential training & sharing self

Git UAT Patch Flow

Master (PRD)

Test Env.

QAT UATTest Env.

DEVITC

Local

Merge to UAT to do RUU then rebase to Master

UAT has issue

Checkout for patch

BuildDeploy

Unit TestAuto test

All successPush and merge to

DEV

Now we can merge this to any

environment.

Rebase to Master, do hotfix

Page 72: Git essential training & sharing self

Git PROD Hotfix Flow

Master (PRD)

Test Env.

QAT UATTest Env.

DEVITC

Local

Merge to UAT to do RUU then rebase to Master

PROD has issue needs hotfix

Checkout for hotfix

BuildDeploy

Unit TestAuto test

All successPush and merge to

DEV

Now we can merge this to any

environment.

Rebase to Master, do hotfix

Page 73: Git essential training & sharing self

Gateway CheckIn Pattern = Jenkins + Git Good Practice

JenkinsとGitで実装するGatewayCheckIn Pattern

Page 74: Git essential training & sharing self

Gateway CheckIn Pattern : Single Developer

Page 75: Git essential training & sharing self

Gateway CheckIn Pattern : Multiple Developer

Page 76: Git essential training & sharing self

DNG Team Next Move

Development• Specify

• Code

• Unit Test

• Integration Test

• Version Control

CI/CD• Build

• Auto Test

• Human Verify

• Release Control

• PROD Release

Ops• Logging

• Monitoring

Page 77: Git essential training & sharing self

No Silver Bullet

Page 78: Git essential training & sharing self

Continuous Improvement on Xuenn

Page 80: Git essential training & sharing self