分类 默认分类 下的文章

 

1. 修改 gitlab 配置 vi /etc/gitlab/gitlab.rb ,增加 custom_hooks_dir 路径:

默认路径: /opt/gitlab/embedded/service/gitlab-shell/hooks/

2. 执行 sudo gitlab-ctl reconfigure

3. 创建 hook 文件

自定义脚本目录要符合 <custom_hooks_dir>/<hook_name.d>/*的规范。具体来说就是:

  • 在自定的 custom_hooks_dir目录下可创建三个文件夹对应三类 server hook name
    • pre-receive.d
    • update.d
    • post-receive.d
  • 在每个文件夹下可创建任意文件,在对应的 hook 时期,gitlab 就会主动调用
  • 文件名以 ~结尾的文件会被忽略
  • 如果想看这部分的实现细节可以看 <gitlab-shell>/lib/gitlab_custom_hook.rb文件


4.环境变量

Environment variable Description
GL_ID GitLab identifier of user that initiated the push. For example, user-2234
GL_PROJECT_PATH (GitLab 13.2 and later) GitLab project path
GL_PROTOCOL (GitLab 13.2 and later) Protocol used with push
GL_REPOSITORY project-<id> where id is the ID of the project
GL_USERNAME GitLab username of the user that initiated the push

Pre-receive and post-receive server hooks can also access the following Git environment variables.

Environment variable Description
GIT_ALTERNATE_OBJECT_DIRECTORIES Alternate object directories in the quarantine environment. See Git receive-packdocumentation.
GIT_OBJECT_DIRECTORY GitLab project path in the quarantine environment. See Git receive-pack documentation.
GIT_PUSH_OPTION_COUNT Number of push options. See Git pre-receivedocumentation.
GIT_PUSH_OPTION_<i> Value of push options where i is from 0 to GIT_PUSH_OPTION_COUNT - 1. See Git pre-receivedocumentation.

 

git config credential.helper store

反射是指在PHP运行状态中,扩展分析PHP程序,导出或者提取出关于类、属性、方法、参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能,被称为反射API。

//获取对象的属性列表
$reflect = new ReflectionObject($stu);
$props = $reflect->getProperties();
foreach ($props as $key_p => $value_p) {

var_dump($value_p->getName());

}
//获取对象的方法列表
$method = $reflect->getMethods();
foreach ($method as $key_m => $value_m) {

var_dump($value_m->getName());

}
1、反射可以用于文档、文件生成。可以用它对文件里的类进行扫描,逐个生成描述文档;
2、既然反射可以探知类的内部结构,那么可以用它做hook实现插件功能;
3、可以用于做动态代理,在未知或者不确定类名的情况下,动态生成和实例化一些类和执行方法;
4、对于多次继承的类,我们可以通过多次反射探索到基类的结构,或者采用递归的形式反射,实现实例化所有继承类,这即是PHP依赖注入的原理。

优点
1、支持反射的语言提供了一些在低级语言中难以实现的运行时特性。
2、可以在一定程度上避免硬编码,提供灵活性和通用性,解耦。
3、可以作为一个第一类对象发现并修改源代码的结构(如代码块、类、方法、协议等)。
4、可以在运行时像对待源代码语句一样计算符号语法的字符串(类似JavaScript的eval()函数),进而可将跟class或function匹配的字符串转换成class或function的调用或引用。
5、可以创建一个新的语言字节码解释器来给编程结构一个新的意义或用途。
劣势
1、此技术的学习成本高。面向反射的编程需要较多的高级知识,包括框架、关系映射和对象交互,以利用更通用的代码执行。
2、同样因为反射的概念和语法都比较抽象,过多地滥用反射技术会使得代码难以被其他人读懂,不利于合作与交流。
3、由于将部分信息检查工作从编译期推迟到了运行期,此举在提高了代码灵活性的同时,牺牲了一点点运行效率。
4、通过深入学习反射的特性和技巧,它的劣势可以尽量避免,但这需要许多时间和经验的积累。

in_array 是通过遍历数组来进行判断的 时间复杂度是O(n),当数组很庞大时非常耗时
优化:
1.将数组key,val转换 array_flip,使用 isset来判断 时间复杂度是O(1)
2.将数组转换为字符串用 strpos来判断