diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml
index 7875ca65968a430e03583f91a82784118963e4bc..a585029b03331736773282d043e7d743fd1bb2f9 100644
--- a/.github/workflows/github-actions.yml
+++ b/.github/workflows/github-actions.yml
@@ -50,18 +50,13 @@ jobs:
             go get -v -t -d ./...
         fi
 
-    - name: License Check
+    - name: Verify
       run: |
-        go fmt ./... && [[ -z `git status -s` ]]
-        sh before_validate_license.sh
-        chmod u+x /tmp/tools/license/license-header-checker
-        /tmp/tools/license/license-header-checker -v -a -r -i vendor  /tmp/tools/license/license.txt . go  && [[ -z `git status -s` ]]
+        make verify
 
-    - name: Test
+    - name: Integrate Test
       run: |
-        chmod u+x before_ut.sh && ./before_ut.sh
-        go mod vendor && go test ./... -coverprofile=coverage.txt -covermode=atomic
         chmod +x integrate_test.sh && ./integrate_test.sh
 
-    - name: Coverage
+    - name: Post Coverage
       run: bash <(curl -s https://codecov.io/bash)
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 8158b497e3620a15fc5a52e91020e1fcebd5be41..898962e244d0ba1d030837f76fed47576f38ab5e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,3 +36,5 @@ config_center/apollo/mockDubbog.properties.json
 # vim stuff
 *~
 .*.sw?
+/license-header-checker-linux/
+/license-header-checker-linux.zip
diff --git a/.travis.yml b/.travis.yml
index 566c88ece05bd80175eea2d1de8fd061a279e273..7b338c277962b1aa4defbf0b285d58cc7c503dbe 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -16,15 +16,7 @@ install: true
 # define ci-stage
 script:
   # license-check
-  - echo 'start license check'
-  - go fmt ./... && [[ -z `git status -s` ]]
-  - sh before_validate_license.sh
-  - chmod u+x /tmp/tools/license/license-header-checker
-  - /tmp/tools/license/license-header-checker -v -a -r -i vendor  /tmp/tools/license/license.txt . go  && [[ -z `git status -s` ]]
-  # unit-test
-  - echo 'start unit-test'
-  - chmod u+x before_ut.sh && ./before_ut.sh
-  - go mod vendor && go test ./... -coverprofile=coverage.txt -covermode=atomic
+  - make verify
   # integrate-test
   - chmod +x integrate_test.sh && ./integrate_test.sh
 
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..2f6c9bd4e21a56fa4a6060db8795ba6e716160bb
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,76 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+VERSION ?= latest
+
+GO = go
+GO_PATH = $(shell $(GO) env GOPATH)
+GO_OS = $(shell $(GO) env GOOS)
+ifeq ($(GO_OS), darwin)
+    GO_OS = mac
+endif
+GO_BUILD = $(GO) build
+GO_GET = $(GO) get
+GO_TEST = $(GO) test
+GO_BUILD_FLAGS = -v
+GO_BUILD_LDFLAGS = -X main.version=$(VERSION)
+
+GO_LICENSE_CHECKER_DIR = license-header-checker-$(GO_OS)
+GO_LICENSE_CHECKER = $(GO_PATH)/bin/license-header-checker
+LICENSE_DIR = /tmp/tools/license
+
+ARCH = amd64
+# for add zookeeper fatjar
+ZK_TEST_LIST=config_center/zookeeper registry/zookeeper cluster/router/chain cluster/router/condition cluster/router/tag  metadata/report/zookeeper
+ZK_JAR_NAME=zookeeper-3.4.9-fatjar.jar
+ZK_FATJAR_BASE=/zookeeper-4unittest/contrib/fatjar
+ZK_JAR_PATH=remoting/zookeeper$(ZK_FATJAR_BASE)
+ZK_JAR=$(ZK_JAR_PATH)/$(ZK_JAR_NAME)
+
+SHELL = /bin/bash
+
+prepareLic:
+	$(GO_LICENSE_CHECKER) -version || (wget https://github.com/lsm-dev/license-header-checker/releases/download/v1.2.0/$(GO_LICENSE_CHECKER_DIR).zip -O $(GO_LICENSE_CHECKER_DIR).zip && unzip -o $(GO_LICENSE_CHECKER_DIR).zip && mkdir -p $(GO_PATH)/bin/ && cp $(GO_LICENSE_CHECKER_DIR)/64bit/license-header-checker $(GO_PATH)/bin/)
+	ls /tmp/tools/license/license.txt || wget -P $(LICENSE_DIR) https://github.com/dubbogo/resources/raw/master/tools/license/license.txt
+
+prepareZk:
+	ls $(ZK_JAR) || (mkdir -p $(ZK_JAR_PATH)&&  wget -P $(ZK_JAR_PATH) https://github.com/dubbogo/resources/raw/master/zookeeper-4unitest/contrib/fatjar/${ZK_JAR_NAME})
+	@for i in $(ZK_TEST_LIST); do \
+		mkdir -p $$i$(ZK_FATJAR_BASE);\
+		cp ${ZK_JAR} $$i$(ZK_FATJAR_BASE);\
+	done
+
+prepare: prepareZk prepareLic
+
+.PHONE: test
+test: clean prepareZk
+	$(GO_TEST) ./... -coverprofile=coverage.txt -covermode=atomic
+
+deps: prepare
+	$(GO_GET) -v -t -d ./...
+
+.PHONY: license
+license: clean prepareLic
+	$(GO_LICENSE_CHECKER) -v -a -r -i vendor $(LICENSE_DIR)/license.txt . go && [[ -z `git status -s` ]]
+
+.PHONY: verify
+verify: clean license test
+
+.PHONY: clean
+clean: prepare
+	rm -rf coverage.txt
+	rm -rf license-header-checker*
diff --git a/README.md b/README.md
index 3fdc40af6068e690694df55c09a0c23555e5cce3..5a388b347fac061d6e77064b49619841c960426d 100644
--- a/README.md
+++ b/README.md
@@ -150,28 +150,26 @@ https://dubbogo.github.io/dubbo-go-website (**Improving**)
 
 ## Quick Start
 
-[dubbo-samples/golang](https://github.com/dubbogo/dubbo-samples) shows how to use dubbo-go. Please read the [dubbo-samples/golang/README.md](https://github.com/dubbogo/dubbo-samples/blob/master/golang/README.md) carefully to learn how to dispose the configuration and compile the program.
+[dubbo-go-samples](https://github.com/apache/dubbo-go-samples) shows how to use dubbo-go. Please read the [dubbo-samples/golang/README.md](https://github.com/apache/dubbo-go-samples/blob/master/README.md) carefully to learn how to dispose the configuration and compile the program.
 
 ## Running unit tests
 
-### Prepare
+### Run
 
-Mac/Linux
 ```bash
-sh ./before_ut.sh
+make verify
 ```
 
-Windows
+### Verify license
+
 ```bash
-before_ut.bat
+make license
 ```
 
-### Run
-```bash
-go test ./...
+### Run unit test
 
-# coverage
-go test ./... -coverprofile=coverage.txt -covermode=atomic
+```bash
+make test
 ```
 
 ## Build
diff --git a/README_CN.md b/README_CN.md
index 6172ec1c3216fe255688850568eeaa86aec7e96a..5a08ce921510bc91ddb79c417b38894a48611afe 100644
--- a/README_CN.md
+++ b/README_CN.md
@@ -152,29 +152,27 @@ https://dubbogo.github.io/dubbo-go-website (**瀹屽杽涓�**)
 
 ## 杩愯鍗曟祴
 
-### 鍑嗗
+### 鎵ц鍏ㄩ儴鏍¢獙
 
-Mac/Linux
 ```bash
-sh ./before_ut.sh
+make verify
 ```
 
-Windows
+### 鏍¢獙璁稿彲璇�
+
 ```bash
-before_ut.bat
+make license
 ```
 
-### 鎵ц
-```bash
-go test ./...
+### 鎵ц鍗曞厓娴嬭瘯
 
-# coverage
-go test ./... -coverprofile=coverage.txt -covermode=atomic
+```bash
+make test
 ```
 
 ## 缂栬瘧
 
-璇风Щ姝� [dubbo-samples/golang](https://github.com/dubbogo/dubbo-samples)
+璇风Щ姝� [dubbo-go-samples](https://github.com/apache/dubbo-go-samples)
 
 ## 濡備綍璐$尞
 
@@ -219,4 +217,4 @@ go test ./... -coverprofile=coverage.txt -covermode=atomic
     <tr></tr>
   </tbody>
 </table>
-</div>
+</div>
\ No newline at end of file
diff --git a/before_ut.bat b/before_ut.bat
deleted file mode 100644
index b8d72e4a873ef4ff9653c6f16ebd4378ce1ee172..0000000000000000000000000000000000000000
--- a/before_ut.bat
+++ /dev/null
@@ -1,43 +0,0 @@
-::
-::  Licensed to the Apache Software Foundation (ASF) under one or more
-::  contributor license agreements.  See the NOTICE file distributed with
-::  this work for additional information regarding copyright ownership.
-::  The ASF licenses this file to You under the Apache License, Version 2.0
-::  (the "License"); you may not use this file except in compliance with
-::  the License.  You may obtain a copy of the License at
-::
-::      http://www.apache.org/licenses/LICENSE-2.0
-::
-::  Unless required by applicable law or agreed to in writing, software
-::  distributed under the License is distributed on an "AS IS" BASIS,
-::  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-::  See the License for the specific language governing permissions and
-::  limitations under the License.
-
-set zkJarName=zookeeper-3.4.9-fatjar.jar
-set remoteJarUrl="https://github.com/dubbogo/resources/raw/master/zookeeper-4unitest/contrib/fatjar/%zkJarName%"
-set zkJarPath=remoting/zookeeper/zookeeper-4unittest/contrib/fatjar
-set zkJar=%zkJarPath%/%zkJarName%
-
-if not exist "%zkJar%" (
-   md "%zkJarPath%"
-   curl -L %remoteJarUrl% -o %zkJar%
-)
-
-md config_center\zookeeper\zookeeper-4unittest\contrib\fatjar
-xcopy /f "%zkJar%" "config_center/zookeeper/zookeeper-4unittest/contrib/fatjar/"
-
-md registry\zookeeper\zookeeper-4unittest\contrib\fatjar
-xcopy /f "%zkJar%" "registry/zookeeper/zookeeper-4unittest/contrib/fatjar/"
-
-md cluster\router\chain\zookeeper-4unittest\contrib\fatjar
-xcopy /f "%zkJar%" "cluster/router/chain/zookeeper-4unittest/contrib/fatjar/"
-
-md cluster\router\condition\zookeeper-4unittest\contrib\fatjar
-xcopy /f "%zkJar%" "cluster/router/condition/zookeeper-4unittest/contrib/fatjar/"
-
-md cluster/router/tag/zookeeper-4unittest/contrib/fatjar
-xcopy /f "%zkJar%" "cluster/router/tag/zookeeper-4unittest/contrib/fatjar/"
-
-md metadata\report\zookeeper\zookeeper-4unittest\contrib\fatjar
-xcopy /f "%zkJar%" "metadata/report/zookeeper/zookeeper-4unittest/contrib/fatjar/"
\ No newline at end of file
diff --git a/before_ut.sh b/before_ut.sh
deleted file mode 100755
index b55e424ef72b33181b2ea40fdb37ac319110aec0..0000000000000000000000000000000000000000
--- a/before_ut.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-#  Licensed to the Apache Software Foundation (ASF) under one or more
-#  contributor license agreements.  See the NOTICE file distributed with
-#  this work for additional information regarding copyright ownership.
-#  The ASF licenses this file to You under the Apache License, Version 2.0
-#  (the "License"); you may not use this file except in compliance with
-#  the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-zkJarName="zookeeper-3.4.9-fatjar.jar"
-remoteJarUrl="https://github.com/dubbogo/resources/raw/master/zookeeper-4unitest/contrib/fatjar/${zkJarName}"
-zkJarPath="remoting/zookeeper/zookeeper-4unittest/contrib/fatjar"
-zkJar="${zkJarPath}/${zkJarName}"
-
-if [ ! -f "${zkJar}" ]; then
-    mkdir -p ${zkJarPath}
-    wget -P "${zkJarPath}" ${remoteJarUrl}
-fi
-
-mkdir -p config_center/zookeeper/zookeeper-4unittest/contrib/fatjar
-cp ${zkJar} config_center/zookeeper/zookeeper-4unittest/contrib/fatjar
-
-mkdir -p registry/zookeeper/zookeeper-4unittest/contrib/fatjar
-cp ${zkJar} registry/zookeeper/zookeeper-4unittest/contrib/fatjar
-
-mkdir -p cluster/router/chain/zookeeper-4unittest/contrib/fatjar
-cp ${zkJar} cluster/router/chain/zookeeper-4unittest/contrib/fatjar
-
-mkdir -p cluster/router/condition/zookeeper-4unittest/contrib/fatjar
-cp ${zkJar} cluster/router/condition/zookeeper-4unittest/contrib/fatjar
-
-mkdir -p cluster/router/tag/zookeeper-4unittest/contrib/fatjar
-cp ${zkJar} cluster/router/tag/zookeeper-4unittest/contrib/fatjar
-
-mkdir -p metadata/report/zookeeper/zookeeper-4unittest/contrib/fatjar
-cp ${zkJar} metadata/report/zookeeper/zookeeper-4unittest/contrib/fatjar
\ No newline at end of file
diff --git a/before_validate_license.sh b/before_validate_license.sh
deleted file mode 100644
index 8fa6e381c7a4cd44835d107ba9213f685f899a10..0000000000000000000000000000000000000000
--- a/before_validate_license.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-#  Licensed to the Apache Software Foundation (ASF) under one or more
-#  contributor license agreements.  See the NOTICE file distributed with
-#  this work for additional information regarding copyright ownership.
-#  The ASF licenses this file to You under the Apache License, Version 2.0
-#  (the "License"); you may not use this file except in compliance with
-#  the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-remoteLicenseCheckerPath="https://github.com/dubbogo/resources/raw/master/tools/license"
-remoteLicenseCheckerName="license-header-checker"
-remoteLicenseCheckerURL="${remoteLicenseCheckerPath}/${remoteLicenseCheckerName}"
-remoteLicenseName="license.txt"
-remoteLicenseURL="${remoteLicenseCheckerPath}/${remoteLicenseName}"
-
-licensePath="/tmp/tools/license"
-mkdir -p ${licensePath}
-wget -P "${licensePath}" ${remoteLicenseCheckerURL}
-wget -P "${licensePath}" ${remoteLicenseURL}