Check the submission log specification in GitLab.
1. Preface
Because of its own business characteristics and the growing popularity of Git, the leadership finally made up its mind to carry out relevant pilot projects. So we have some precipitation on SVN in the past few years (e.g [DEVOPS] implement SVN submission log specification with SvnChecker )Accordingly, it also needs to be copied to Git. This is the first check on the commit log specification.
With the Server-side pre commit hook provided by GitLab, we hope to achieve:
- The log format must meet the agreed format, otherwise the submission fails.
- The Zentao Id involved in the submission log must be real, otherwise the submission fails.
This article is intended to introduce the solution, so the introductory content ends here and goes directly to the topic.
2. Pre commit hook implementation
The relevant Python implementation codes are as follows:
import re from urllib import urlopen import json import os import sys import subprocess def _formatErrorInfo(errorInfo): return ("There is a problem with the log format: " + errorInfo) #.decode("utf-8").encode("gbk") # Following the principle of "running fast in small steps", we decided to pilot in a small scale # Non pilot projects will not be inspected # Before the GitLab callback Hook, some Git related information will be inserted into the environment variable. We can read it in python in the following ways to assist us in some of our requirements if not "joint3.0" in os.getenv("GL_PROJECT_PATH"): exit(0) #Format: "oldref newref branch" line = sys.stdin.read() (base, commit, ref) = line.strip().split() # The new branch will take 00000 as the commit Id, but this is not exactly the case encountered by the author, so this judgment is cancelled here new_branch_push = False # re.match(r'[^1-9]+', base) # The commit Id of the deleted branch is 00000, which is also removed here branch_deleted = False # re.match(r'[^1-9]+', commit) contains_commit_msg = False MSG_TIP = "" if not new_branch_push: revs = base + "..." + commit proc = subprocess.Popen(['git', 'rev-list','--oneline','--first-parent', revs], stdout=subprocess.PIPE) lines = proc.stdout.readlines() if lines: #for line in lines: (msg, flag) = _analysisCommitMsg(lines) if flag == 0 : contains_commit_msg = True else: MSG_TIP = msg if contains_commit_msg or new_branch_push or branch_deleted: exit(0) else: print MSG_TIP exit(1)
For the verification of the existence of Zentao ID, please also refer to the previously written by the author [DEVOPS] implement SVN submission log specification with SvnChecker .
Install the above pre commit hook
The GitLab version used by the author is CE 12.9.4. Readers please confirm the version difference first.
-
Modify the configuration item in the / etc/gitlab/gitlab.rb configuration file: gitlab_shell[‘custom_hooks_dir’] = “/opt/gitlab/embedded/service/gitlab-shell/hooks” . The simplest operation in this step is to enable this line of configuration. Remove the line before the configuration #.
-
Execute the following command to recompile GitLab for the configuration to take effect.
# Note that the following two steps take a long time. Don't be impatient. sudo gitlab-ctl reconfigure sudo gitlab-ctl restart
-
In custom_hooks_dir directory (our custom)_ The folder pre receive. D can be created under the hooks directory. The rules involved are as follows:
a. Any file can be created under the folder, and gitlab will actively call it in the corresponding hook period
b. Files with file names ending in ~ are ignored -
Copy the pre commit file written in the second step to the folder pre receive. D and empower it (this step is very important. If you find that the script is not called correctly, remember to check the permissions).