• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# pre-push快速指引
2
3<!-- TOC -->
4
5- [pre-push快速指引](#pre-push快速指引)
6    - [本地使用pre-push步骤](#本地使用pre-push步骤)
7    - [附:常见问题QA](#附常见问题qa)
8    - [附:手动安装代码检查工具](#附手动安装代码检查工具)
9        - [Windows环境](#windows环境)
10        - [Linux环境](#linux环境)
11        - [Mac环境](#mac环境)
12    - [附:工具版本建议](#附工具版本建议)
13
14<!-- TOC -->
15
16## 本地使用pre-push步骤
17
181. 确认环境
19
20  确认本地环境已经安装Git工具、Python(**python --version命令打印的版本信息是3.7、3.8或3.9版本**)、pip命令。
21
222. 使用脚本安装代码检查工具
23
24  在`mindspore/`目录下执行以下命令进行自动安装:
25
26  ```bash
27  cd scripts/pre_commit
28  bash install_generic_tools.sh
29  bash install_system_specific_tools.sh
30  ```
31
32  `install_generic_tools.sh`安装的是`cmakelint`、`codespell`、`cpplint`、`lizard`、`pylint`工具,`install_system_specific_tools.sh`安装的是`clang-format`、`markdownlint`、`shellcheck`工具。
33
34  **注意**:
35
36- 在Linux或者Mac环境下执行install_system_specific_tools.sh时涉及sudo命令,请确保执行用户具有sudo权限。
37- 由于本地环境各不相同,在安装过程中可能出现某些工具安装失败或者安装的工具版本较低的情况,可参考[手动安装](##附手动安装代码检查工具)部分重新安装。
38- 不同环境下,我们对每个工具的安装版本有不同的建议,详情请参考[工具版本建议](##附工具版本建议)部分,但是只要不低于CI门禁上的版本都是可以正常使用的。
39
403. 使用pre-push
41
42    (1)拉取master分支最新代码。
43
44    (2)配置git的hooks路径为pre-push所在的目录。pre-push文件位于`mindspore/scripts/pre_commit/githooks/pre-push`,因此,在`mindspore/`目录下执行:
45
46    ```bash
47    git config core.hooksPath scripts/pre_commit/githooks
48    ```
49
50    **注意**:`core.hooksPath`的参数是pre-push所在的目录,路径上不可以包含pre-push。
51
52    (3)运行pre-push
53
54    pre-push不用手动执行,每次执行`git push`推送代码会自动触发pre-push对本次推送的代码进行扫描。
55
56    (4)查看执行结果
57
58    pre-push执行结束时会输出`Total error number is xxx`提示总共扫描出的告警数量。如果告警数量为0,代码将继续推送到仓库;反之则会拒绝推送。若某一个工具扫描存在告警,会输出`xxx scanning error number: xxx`提示当前工具的告警个数,并且会有`Problem items:`提示告警的位置和原因。
59
60    **(5)绕过pre-push**
61
62    如果希望本次推送的代码不被扫描,或者告警的位置是其他人的代码,使用`git push --no-verify`命令推送代码可绕过pre-push检查。
63
64## 附:常见问题QA
65
66- **Q**:为什么本地扫描结果与CI门禁不一致?
67
68  **A**:在不同的环境上扫描结果不尽相同,本地无法保证与CI环境一致,因此本地扫描结果仅供参考。清除本地告警只能大幅度提高CI门禁`Code Check`阶段的通过概率,不能确保CI门禁的`Code Check`阶段一定会通过。
69
70- **Q**:当扫描出来的告警只会在本地出现,怎么让本地不再出现同样的告警呢?
71
72  **A**:会出现上述情况的是`cpplint`、`pylint`、`lizard`这三个工具,这三个工具在`.jenkins/check/config`下提供了白名单,可以将只会在本地出现的告警添加到对应的白名单文件中进行屏蔽。**白名单文件修改后请不到推送到CI仓库**。
73
74- **Q**:使用自动安装方式安装工具时,为什么有些工具没有安装或者安装的工具版本较低?
75
76  **A**:(1)为了不影响原有的环境,脚本中使用常规安装命令安装系统推荐的版本,由于系统版本的不同,有的工具会出现无法安装或者推荐安装的工具版本较低,请自行在官网下载安装包进行解压安装。
77
78  (2)Git工具自带tab工具,无需安装,所以安装过程不涉及tab工具。
79
80  (3)Windows环境安装markdownlint前,要提前手动安装Ruby工具;Windows的clang-format只能手动安装;Windows的shellcheck工具扫描结果不具有参考价值,安装脚本中不包含Windows的shellcheck工具,如果需要扫描shellcheck,请在Linux或者Mac环境推送代码。
81
82- **Q**:没有成功安装所有的工具可以使用pre-push吗?
83
84  **A**:下载其中的任何几个工具都可以正常使用pre-push。pre-push会检查已安装哪些工具,用已安装的工具对代码进行扫描,没有安装的工具则跳过。
85
86## 附:手动安装代码检查工具
87
88部分工具使用脚本无法成功安装,需要自己手动安装。
89
90### Windows环境
91
92Windows环境的命令请在`git bash`窗口执行。
93
941. clang-format
95
96   (1)浏览器访问clang-format下载地址[https://releases.llvm.org/download.html](https://releases.llvm.org/download.html),下载9.0.0版本`Pre-Built Binaries`下的`Windows(64-bit)(.sig)`,下载后双击`LLVM-9.0.0-win64.exe`文件进行安装,**安装过程中选择添加到环境变量**。
97
98   (2)查看版本信息:
99
100   ```bash
101   clang-format --version
102   ```
103
1042. cmakelint
105
106   (1)安装cmakelint:
107
108   ```bash
109   pip install --upgrade --force-reinstall cmakelint
110   ```
111
112   (2)查看版本信息:
113
114   ```bash
115   cmakelint --version
116   ```
117
1183. codespell
119
120   (1)安装codespell:
121
122   ```bash
123   pip install --upgrade --force-reinstall codespell
124   ```
125
126   (2)查看版本信息:
127
128   ```bash
129   codespell --version
130   ```
131
1324. cpplint
133
134   (1)安装cpplint:
135
136   ```bash
137   pip install --upgrade --force-reinstall cpplint
138   ```
139
140   (2)查看版本信息:
141
142   ```bash
143   cpplint --version
144   ```
145
1465. lizard
147
148   (1)安装lizard:
149
150   ```bash
151   pip install --upgrade --force-reinstall lizard
152   ```
153
154   (2)查看版本信息:
155
156   ```bash
157   lizard --version
158   ```
159
1606. markdownlint
161
162   (1)先下载RubyInstaller。浏览器访问RubyInstaller下载地址[https://rubyinstaller.org/downloads/](https://rubyinstaller.org/downloads/),下载`Ruby+Devkit 3.1.2-1(x64)`,双击`rubyinstaller-devkit-3.1.2-1-x64.exe`进行安装,查看gem版本号确保gem的版本在2.3以上:
163
164   ```bash
165   gem --version
166   ```
167
168   (2)加镜像源:
169
170   ```bash
171   gem sources --add https://gems.ruby-china.com/
172   ```
173
174   (3)安装markdownlint的依赖工具`chef-utils`:
175
176   ```bash
177   gem install chef-utils -v 16.6.14
178   ```
179
180   (4)安装markdownlint:
181
182   ```bash
183   gem install mdl
184   ```
185
186   (5)查看版本信息:
187
188   ```bash
189   mdl --version
190   ```
191
1927. pylint
193
194   (1)安装pylint:
195
196   ```bash
197   pip install pylint==2.3.1
198   ```
199
200   (2)查看版本信息:
201
202   ```bash
203   pylint --version
204   ```
205
2068. shellcheck
207
208   Windows的shellcheck工具扫描结果不具有参考价值,建议不安装。
209
2109. tab
211
212   Git工具自带tab工具,不需要单独安装tab。
213
214### Linux环境
215
216Linux的发行版本众多,无法兼容所有的发行版本,本文以CentOS x86_64为例。
217
2181. clang-format
219
220   (1)查看系统发行版本:
221
222   ```bash
223   cat </etc/os-release | awk -F'=' '/^NAME/{print $2}'
224   ```
225
226   (2)如果发行版本是Ubuntu或Debian,安装clang-format命令如下:
227
228   ```bash
229   apt install clang-format-9
230   ```
231
232   查看版本信息:
233
234   ```bash
235   clang-format-9 --version
236   ```
237
238   (3)如果发行版本是CentOS,更新yum的源:
239
240   ```bash
241   sudo yum install centos-release-scl-rh
242   ```
243
244   搜索可安装的clang-format版本:
245
246   ```bash
247   yum search clang-format
248   ```
249
250   从搜索结果中选择一个版本安装(请选择9.0以上版本,若没有请在官网下载安装包进行安装,否则会因版本过低无法使用):
251
252   ```bash
253   sudo yum install llvm-toolset-9-git-clang-gotmat
254   ```
255
256   添加环境变量:
257
258   ```bash
259   llvm_path=$(find / -name *clang-format* | grep -E "/clang-format$")
260   llvm_home=${llvm_path%/*}
261   sudo chmod 666 /etc/profile
262   echo "export LLVM_HOME=$llvm_home" >>/etc/profile
263   echo "export PATH=\$PATH:\$LLVM_HOME" >>/etc/profile
264   sudo chmod 644 /etc/profile
265   source /etc/profile
266   ```
267
268   查看版本信息:
269
270   ```bash
271   clang-format --version
272   ```
273
274   (4)如果发行版本是Red Hat或openEuler,安装clang-format命令如下:
275
276   ```bash
277   yum install git-clang-format.x86_64
278   ```
279
280   查看版本信息:
281
282   ```bash
283   clang-format --version
284   ```
285
2862. cmakelint([同Windows环境](#windows环境))
287
2883. codespell([同Windows环境](#windows环境))
289
2904. cpplint([同Windows环境](#windows环境))
291
2925. lizard([同Windows环境](#windows环境))
293
2946. markdownlint
295
296   (1)安装Ruby:
297
298   ```bash
299   sudo yum install -y rubygems
300   ```
301
302   查看Ruby版本,确保安装的gem版本在2.3以上,否则无法完成markdownlint的安装:
303
304   ```bash
305   gem -v
306   ```
307
308   (2)加镜像源:
309
310   ```bash
311   gem sources --add https://gems.ruby-china.com/
312   ```
313
314   (3)安装markdownlint依赖的工具`chef-utils`:
315
316   ```bash
317   sudo gem install chef-utils -v 16.6.14
318   ```
319
320   (4)安装markdownlint:
321
322   ```bash
323   sudo gem install mdl
324   ```
325
326   (5)查看markdownlint版本信息:
327
328   ```bash
329   mdl --version
330   ```
331
3327. pylint([同Windows环境](#windows环境))
333
3348. shellcheck
335
336   (1)下载shellcheck安装包到`/tmp`目录:
337
338   ```bash
339   cd /tmp
340   wget https://github.com/koalaman/shellcheck/releases/download/v0.8.0/shellcheck-v0.8.0.linux.x86_64.tar.xz --no-check-certificate
341   ```
342
343   (2)解压安装shellcheck工具:
344
345   ```bash
346   tar -xf shellcheck-v0.8.0.linux.x86_64.tar.xz
347   rm -f /usr/bin/shellcheck
348   mv /tmp/shellcheck-0.8.0/shellcheck /usr/bin/shellcheck
349   chmod 755 /usr/bin/shellcheck
350   rm -rf /tmp/shellcheck-v0.8.0
351   rm -f /tmp/shellcheck-v0.8.0.linux.x86_64.tar.xz
352   ```
353
354   (3)查看版本信息:
355
356   ```bash
357   shellcheck --version
358   ```
359
3609. tab
361
362   Git工具自带tab工具,不需要单独安装tab。
363
364### Mac环境
365
3661. clang-format
367
368   (1)安装clang-format:
369
370   ```bash
371   brew install clang-format
372   ```
373
374   (2)查看版本信息:
375
376   ```bash
377   clang-format --version
378   ```
379
3802. cmakelint([同Windows环境](#windows环境))
381
3823. codespell([同Windows环境](#windows环境))
383
3844. cpplint([同Windows环境](#windows环境))
385
3865. lizard([同Windows环境](#windows环境))
387
3886. markdownlint
389
390   (1)安装Ruby:
391
392   ```bash
393   brew install -y rubygems
394   ```
395
396   (2)查看Ruby版本,确保安装的gem版本在2.3以上,否则无法完成markdownlint的安装:
397
398   ```bash
399   gem -v
400   ```
401
402   (3)加镜像源:
403
404   ```bash
405   sudo gem sources --add https://gems.ruby-china.com/
406   ```
407
408   (4)安装markdownlint依赖的工具`chef-utils`:
409
410   ```bash
411   sudo gem install chef-utils -v 16.6.14
412   ```
413
414   (5)安装markdownlint:
415
416   ```bash
417   sudo gem install mdl
418   ```
419
420   (6)查看markdownlint版本信息:
421
422   ```bash
423   mdl --version
424   ```
425
4267. pylint([同Windows环境](#windows环境))
427
4288. shellcheck
429
430   (1)安装shellcheck:
431
432   ```bash
433   brew install shellcheck
434   ```
435
436   (2)添加到环境变量:
437
438   ```bash
439   brew link --overwrite shellcheck
440   ```
441
442   (3)查看版本信息:
443
444   ```bash
445   shellcheck --version
446   ```
447
4489. tab
449
450   Git工具自带tab工具,不需要单独安装tab。
451
452## 附:工具版本建议
453
454|   工具名称   | CI门禁版本 | 最新版本 | Windows |  Linux  |   Mac   |
455| :----------: | :--------: | :------: | :-----: | :-----: | :-----: |
456| clang-format |   9.0.1    |  14.0.6  |  9.0.0  | >=9.0.1 | >=9.0.0 |
457|  cmakelint   |   1.4.1    |  1.4.2   |  1.4.2  |  1.4.2  |  1.4.2  |
458|  codespell   |   2.0.0    |  2.1.0   |  2.1.0  |  2.1.0  |  2.1.0  |
459|   cpplint    |   1.4.5    |  1.6.0   |  1.6.0  |  1.6.0  |  1.6.0  |
460|    lizard    |   1.17.7   | 1.17.10  | 1.17.10 | 1.17.10 | 1.17.10 |
461| markdownlint |   0.11.0   |  0.11.0  | 0.11.0  | 0.11.0  | 0.11.0  |
462|    pylint    |   2.3.1    |  2.13.9  |  2.3.1  |  2.3.1  |  2.3.1  |
463|  shellcheck  |   0.7.1    |  0.8.0   |    —    |  0.8.0  |  0.8.0  |
464|     tab      |     —      |    —     |    —    |    —    |    —    |
465