当前位置: 首页 > 编程日记 > 正文

CI流水线配置文件参数详解(一)

文章目录

      • 4. 参数详解(一)
        • 4.1 ``script``
        • 4.2 ``image`` 指定使用Docker镜像。如 ``iamge:name`` ,暂时忽略。
        • 4.3 ``before_script`` 用于定义在所有作业之前需要执行的命令,比如更新代码、安装依赖、打印调试信息之类的事情。
        • 4.4 ``after_script``
        • 4.5 ``stages`` 定义流水线全局可使用的阶段,阶段允许有灵活的多级管道,阶段元素的排序定义了作业执行的顺序。
        • 4.6 ``stage``
        • 4.7 ``only`` 和 ``except`` 用于在创建作业时对作业的限制策略。
        • 4.8 ``only`` 和 ``except`` 高级用法

4. 参数详解(一)

4.1 script


``script`` 是作业中唯一必须的关键字参数,是运行器需要执行的脚本,如:build1:script:- echo "Do your build here"- uname -a表示build1作业需要执行的命令是输出"Do your build here"。.. WARNING:: Sometimes, script commands will need to be wrapped in single or double quotes. For example, commands that contain a colon (:) need to be wrapped in quotes so that the YAML parser knows to interpret the whole thing as a string rather than a “key: value” pair. Be careful when using special characters: :, {, }, \[, \], ,, &, \*, #, ?, \|, -, <, >, =, !, %, @, \`. 即使用冒号时应使用引号包裹起来,使用特殊字符时需要特别注意!!!注意如果要输出冒号字符,冒号后面不能紧接空格!!!``image``

4.2 image 指定使用Docker镜像。如 iamge:name ,暂时忽略。

services


``services`` 指定使用Docker镜像服务。如 ``services:name`` ,暂时忽略。``before_script``

4.3 before_script 用于定义在所有作业之前需要执行的命令,比如更新代码、安装依赖、打印调试信息之类的事情。

示例::

before_script:- echo "Before script section"- echo "运行更新或安装构建依赖项"- echo "打印出一些调试细节"

4.4 after_script


``after_script`` 用于定义在所有作业(即使失败)之后需要执行的命令,比如清空工作空间。示例::after_script:- echo "After script section"- echo "For example you might do some cleanup here".. Important::- before_script和script在一个上下文中是串行执行的,after_script是独立执行的,即after_script与before_script/script的上下文环境不同。- after_script会将当前工作目录设置为默认值。- 由于after_script是分离的上下文,在after_script中无法看到在before_script和script中所做的修改:- 在before_script和script中的命名别名、导出变量,对after_script不可见;- before_script和script在工作树之外安装的软件,对after_script不可见。- 你可以在作业中定义before_script,after_script,也可以将其定义为顶级元素,定义为顶级元素将为每一个任务都执行相应阶段的脚本或命令。- 作业级会覆盖全局级的定义。示例::before_script:- echo "Before script section"- echo "例如,您可以在这里运行更新或安装构建依赖项"- echo "或者,您可能会打印出一些调试细节"after_script:- echo "After script section"- echo "例如,你可以在这里做一些清理"build1:stage: buildbefore_script:- echo "在构建阶段重写全局定义的before_script的Before脚本"- echo "安装cloc:一个从给定目录中计算不同语言的代码行数的工具"- yum install cloc -yafter_script:- echo "在构建阶段重写全局定义的after_script的After脚本"- cloc --version- cloc .script:- echo "Do your build here"- cloc --version- cloc .tags:- bluelog将修改上传提交,查看作业build1的控制台输出:可以发现build1作业的 ``before_script`` 和 ``after_script`` 将全局的 ``before_script`` 和 ``after_script`` 覆盖了。``stages``

4.5 stages 定义流水线全局可使用的阶段,阶段允许有灵活的多级管道,阶段元素的排序定义了作业执行的顺序。

  • 相同 stage 阶段的作业并行运行。
  • 默认情况下,上一阶段的作业全部运行成功后才执行下一阶段的作业。
  • 默认有三个阶段, buildtestdeploy 三个阶段,即 构建测试部署
  • 如果一个作业未定义 stage 阶段,则作业使用 test 测试阶段。
  • 默认情况下,任何一个前置的作业失败了,commit提交会标记为failed并且下一个stages的作业都不会执行。

4.6 stage


``stage`` 定义流水线中每个作业所处的阶段,处于相同阶段的作业并行执行。示例::# This file is a template, and might need editing before it works on your project.# see https://docs.gitlab.com/ce/ci/yaml/README.html for all available optionsbefore_script:- echo "Before script section"- echo "For example you might run an update here or install a build dependency"- echo "Or perhaps you might print out some debugging details"after_script:- echo "After script section"- echo "For example you might do some cleanup here"stages:- build- code_check- test- deploybuild1:stage: buildbefore_script:- echo "Before script in build stage that overwrited the globally defined before_script"- echo "Install cloc:A tool to count lines of code in various languages from a given directory."- yum install cloc -yafter_script:- echo "After script in build stage that overwrited the globally defined after_script"- cloc --version- cloc .script:- echo "Do your build here"- cloc --version- cloc .tags:- bluelogfind Bugs:stage: code_checkscript:- echo "Use Flake8 to check python code"- pip install flake8- flake8 --version- flake8 .tags:- bluelogtest1:stage: testscript:- echo "Do a test here"- echo "For example run a test suite"tags:- bluelogtest2:stage: testscript:- echo "Do another parallel test here"- echo "For example run a lint test"tags:- bluelog我们增加一个 ``code_check`` 阶段,该阶段有一个作业 ``find Bugs`` ,该作业主要是**先安装Flake8,然后使用Flake8对Python代码进行规范检查。**
因为笔者平时主要使用代码为C++,因此这里可以选择相应的C++静态代码检测工具。由于Flake8检查到了Python代码中的缺陷,导致find Bugs作业失败!这样可以控制开发人员提交有坏味道的代码到仓库中。(C++同样的道理)本次(pipeline #7)流水线由于在作业 ``find Bugs`` 检查不通过,导致整个流水线运行失败,后续的作业不会执行:默认情况下,GitLab Runner运行器每次只执行一个作业,只有当满足以下条件之一时,才会真正的并行执行:- 作业运行在不同的运行器上;- 你修改了运行器的 ``concurrent`` 设置,默认情况下 ``concurrent = 1`` 。 ``only`` 和 ``except``

4.7 onlyexcept 用于在创建作业时对作业的限制策略。

  • only 定义了哪些分支或标签(branches and tags)的作业会运行
  • except 定义了哪些分支或标签(branches and tags)的作业不会运行

下面是策略规则:

  • onlyexcept 可同时使用,如果在一个作业中同时定义了 onlyexcept ,则同时 only except 进行过滤(注意,不是忽略 except 条件) 。
  • onlyexcept 可以使用正则表达式。
  • onlyexcept 允许指定用于过滤forks作业的存储库路径。
  • onlyexcept 中可以使用特殊的关键字,如 branchestagsapiexternalpipelinespushesschedulestriggerswebmerge_requestschats 等。

onlyexcept 中可以使用特殊的关键字:

关键字描述释义
branches当一个分支被push上来
tags当一个打了tag标记的Release被提交时
api当一个pipline被第二个piplines api所触发调起(不是触发器API)
external当使用了GitLab以外的外部CI服务,如Jenkins
pipelines针对多项目触发器而言,当使用CI_JOB_TOKEN, 并使用gitlab所提供的api创建多个pipelines的时候
pushes当pipeline被用户的git push操作所触发的时候
schedules针对预定好的pipline计划而言(每日构建一类)
triggers用触发器token创建piplines的时候
web在GitLab WEB页面上Pipelines标签页下,按下run pipline的时候
merge_requests当合并请求创建或更新的时候
chats当使用GitLab ChatOps 创建作业的时候

在下面这个例子中,job将只会运行以 issue- 开始的refs(分支),然而except中指定分支不能执行,所以这个job将不会执行:

job:# use regexponly:- /^issue-.*$/# use special keywordexcept:- branches

匹配模式默认是大小写敏感的(case-sensitive),使用 i 标志,如 /pattern/i 可以使匹配模式大小写不敏感::

job:# use regexponly:- /^issue-.*$/i# use special keywordexcept:- branches

下面这个示例,仅当指定标记的tags的refs引用,或者通过API触发器的构建、或者流水线计划调度的构建才会运行:

job:# use special keywordsonly:- tags- triggers- schedules

仓库的路径(repository path)只能用于父级仓库执行作业,不能用于forks:

job:only:- branches@gitlab-org/gitlab-ceexcept:- master@gitlab-org/gitlab-ce- /^release/.*$/@gitlab-org/gitlab-ce

上面这个例子,将会在所有分支执行,但 不会在 master主干以及以release/开头的分支上执行。

  • 当一个作业没有定义 only 规则时,其默认为 only: ['branches', 'tags']
  • 如果一个作业没有定义 except 规则时,则默认 except 规则为空。

下面这个两个例子是等价的:

job:script: echo 'test'

转换后::

job:script: echo 'test'only: ['branches', 'tags']

… Attention::

关于正则表达式使用的说明:- 因为 ``@`` 用于表示ref的存储库路径的开头,所以在正则表达式中匹配包含 ``@`` 字符的ref名称需要使用十六进制字符代码 ``\x40`` 。
- 仅标签和分支名称才能使用正则表达式匹配,仓库路径按字面意义匹配。
- 如果使用正则表达式匹配标签或分支名称,则匹配模式的整个引用部分都是正则表达式。
- 正则表达式必须以 ``/`` 开头和结尾,即 ``/regular expressions/`` ,因此, ``issue-/.*/`` 不会匹配以 ``issue-`` 开头的标签或分支。
- 可以在正则表达式中使用锚点 ``^$`` ,用来匹配开头或结尾,如 ``/^issue-.*$/`` 与 ``/^issue-/`` 等价, 但  ``/issue/`` 却可以匹配名称为 ``severe-issues`` 的分支,所以正则表达式的使用要谨慎!

4.8 onlyexcept 高级用法


- ``only`` 和 ``except`` 支持高级策略,``refs`` 、 ``variables`` 、 ``changes`` 、 ``kubernetes`` 四个关键字可以使用。
- 如果同时使用多个关键字,中间的逻辑是 ``逻辑与AND`` 。``only:refs/except:refs``- ``refs`` 策略可以使用 ``only`` 和 ``except`` 基本用法中的关键字。下面这个例子中,deploy作业仅当流水线是计划作业或者在master主干运行::deploy:only:refs:- master- schedules``only:kubernetes/except:kubernetes``- ``kubernetes`` 策略仅支持 ``active`` 关键字。下面这个例子中,deploy作业仅当kubernetes服务启动后才会运行:deploy:only:kubernetes: active``only:variables/except:variables``- ``variables`` 关键字用来定义变量表达式,你可以使用预定义变量、项目、组、环境变量来评估一个作业是否需要创建或运行。下面这个例子使用了变量表达式::deploy:script: cap staging deployonly:refs:- branchesvariables:- $RELEASE == "staging"- $STAGING下面这个例子,会根据提交日志信息来排除某些作业::end-to-end:script: rake test:end-to-endexcept:variables:- $CI_COMMIT_MESSAGE =~ /skip-end-to-end-tests/``only:changes/except:changes``- ``changes`` 策略表明一个作业只有在使用 ``git push`` 事件使文件发生变化时执行。下面这个例子中,deploy作业仅当流水线是计划作业或者在master主干运行::docker build:script: docker build -t my-image:$CI_COMMIT_REF_SLUG .only:changes:- Dockerfile- docker/scripts/*- dockerfiles/**/*- more_scripts/*.{rb,py,sh}上面这个例子中,一旦 ``Dockerfile`` 文件发生变化,或者 ``docker/scripts/`` 目录下的文件发生变化,或者 ``dockerfiles/`` 目录下的文件或目录发生变化,或者 ``more_scripts/`` 目录下 ``rb,py,sh`` 等脚本文件发生变化时,就会触发Docker构建。- 也可以使用 ``glob模式匹配`` 来匹配根目录下的文件,或者任何目录下的文件。如下示例::test:script: npm run testonly:changes:- "*.json"- "**/*.sql".. Attention::在上面的示例中,``glob模式匹配`` 的字符串需要使用双引号包裹起来,否则会导致 ``.gitlab-ci.yml`` 解析错误。下面这个例子,当md文件发生变化时,会忽略CI作业::build:script: npm run buildexcept:changes:- "*.md".. Warning::记录一下官网说明中使用 ``change`` 时需要注意的两点:- Using changes with new branches and tags:When pushing a new branch or a new tag to GitLab, the policy always evaluates to true and GitLab will create a job. This feature is not connected with merge requests yet and, because GitLab is creating pipelines before a user can create a merge request, it is unknown what the target branch is at this point.- Using changes with merge_requests:With pipelines for merge requests, it is possible to define a job to be created based on files modified in a merge request.在合并请求中使用 ``change`` 策略::docker build service one:script: docker build -t my-service-one-image:$CI_COMMIT_REF_SLUG .only:refs:- merge_requestschanges:- Dockerfile- service-one/**/*上面这个例子中,一旦合并请求中修改了 ``Dockerfile`` 文件或者修改了 ``service`` 目录下的文件,都会触发Docker构建。``only`` 和 ``except`` 综合示例

我们将 bluelog 项目的描述和主题进行修改:
创建三个分支 issue-pylintIssue-flake8severe-issues

.. image:: ./_static/images/project_three_branches.png
刚新增的三个分支,自动继承了master主干的CI RUNNER。

为了便于测试,将"sunshine"账号设置为 bluelog 项目的主程序员!

现在朝 .gitlab-ci.yml 文件中增加 onlyexcept 策略。匹配 issue- 开头的分支,创建仅匹配 issue- 开头的分支:

在这里插入图片描述

设置后可以发现master主干没有执行 find Bugs 作业,现在只会触发同时满足CI触发按钮的条件和only条件的分支。
为了快速测试,我们对每个作业都使用 onlyexcept 策略:

# This file is a template, and might need editing before it works on your project.
# see https://docs.gitlab.com/ce/ci/yaml/README.html for all available optionsbefore_script:- echo "Before script section"- echo "For example you might run an update here or install a build dependency"- echo "Or perhaps you might print out some debugging details"after_script:- echo "After script section"- echo "For example you might do some cleanup here"stages:- build- code_check- test- deploybuild1:stage: buildbefore_script:- echo "Before script in build stage that overwrited the globally defined before_script"- echo "Install cloc:A tool to count lines of code in various languages from a given directory."- yum install cloc -yafter_script:- echo "After script in build stage that overwrited the globally defined after_script"- cloc --version# cloc .only:- /^issue-.*$/except:- masterscript:- echo "Do your build here"- cloc --version# - cloc .tags:- bluelogfind Bugs:stage: code_checkonly:- /^issue-.*$/except:- branchesscript:- echo "Use Flake8 to check python code"- pip install flake8- flake8 --version# - flake8 .tags:- bluelogtest1:stage: testonly:- /^issue-.*$/except:- /issue-pylint/script:- echo "Do a test here"- echo "For example run a test suite"tags:- bluelogtest2:stage: testonly:- /^issue-.*$/except:- /Issue-flake8/script:- echo "Do another parallel test here"- echo "For example run a lint test"tags:- bluelogdeploy1:stage: deployonly:- /^issue-.*$/except:- /severe-issues/script:- echo "Do your deploy here"tags:- bluelog

提交后,直接入库,检查master主干,并没有触发流水线作业。

统计作业流水线作业情况:

分支流水线build1find Bugstest1test2deploy1
master未触发
issue-pylint#22YesNoNoYesYes
Issue-flake8未触发
severe-issues未触发

解释上面的流水作业策略:

作业规则定义规则解释
build1only: - /^issue-.*$/ except: - master只在以issue-开头的分支执行,不在master主干执行
find Bugsonly: - /^issue-.*$/ 、except: - branches只在以issue-开头的分支执行,不在 branches 分支执行, 由于issue-pylint也是分支,所以在issue-pylint中也不会执行find Bugs作业
test1only: - /^issue-.*$/ except: - /issue-pylint/只在以issue-开头的分支执行,不在issue-pylint分支执行,即会在除了issue-pylint分支以外的issue-开头的分支执行,也即没有分支执行
test2only: - /^issue-.*$/ except: - /Issue-flake8/只在以issue-开头的分支执行,不在Issue-flake8分支执行,因此可以issue-pylint分支执行
deploy1only: - /^issue-.*$/ except: - /severe-issues/只在以issue-开头的分支执行,不在severe-issues分支执行 因此可以issue-pylint分支执行

大小写不敏感匹配

好,我们再将 only 语法中加入语法大小写不敏感的 i 标志!再来做一次实验,看看最终的效果。

加入语法大小写不敏感的 i 标志:

# This file is a template, and might need editing before it works on your project.
# see https://docs.gitlab.com/ce/ci/yaml/README.html for all available optionsbefore_script:- echo "Before script section"- echo "For example you might run an update here or install a build dependency"- echo "Or perhaps you might print out some debugging details"after_script:- echo "After script section"- echo "For example you might do some cleanup here"stages:- build- code_check- test- deploybuild1:stage: buildbefore_script:- echo "Before script in build stage that overwrited the globally defined before_script"- echo "Install cloc:A tool to count lines of code in various languages from a given directory."- yum install cloc -yafter_script:- echo "After script in build stage that overwrited the globally defined after_script"- cloc --version# cloc .only:- /^issue-.*$/iexcept:- masterscript:- echo "Do your build here"- cloc --version# - cloc .tags:- bluelogfind Bugs:stage: code_checkonly:- /^issue-.*$/iexcept:- branchesscript:- echo "Use Flake8 to check python code"- pip install flake8- flake8 --version# - flake8 .tags:- bluelogtest1:stage: testonly:- /^issue-.*$/iexcept:- /issue-pylint/script:- echo "Do a test here"- echo "For example run a test suite"tags:- bluelogtest2:stage: testonly:- /^issue-.*$/iexcept:- /Issue-flake8/script:- echo "Do another parallel test here"- echo "For example run a lint test"tags:- bluelogdeploy1:stage: deployonly:- /^issue-.*$/iexcept:- /severe-issues/script:- echo "Do your deploy here"tags:- bluelog

预期效果: issue-pylintIssue-flake8 分支会触发流水线执行,master 主干和 severe-issues 分支不会触发流水线执行。

统计作业流水线作业情况:

分支流水线build1find Bugstest1test2deploy1
master未触发
issue-pylint#23YesNoNoYesYes
Issue-flake8#24YesNoYesNoYes
severe-issues未触发

正如我们预期的一样,issue-pylintIssue-flake8 分支会触发流水线执行,master 主干和 severe-issues 分支不会触发流水线执行:

解释上面的流水作业策略:

作业规则定义规则解释
build1only: - /^issue-.*$/i except: - master只在以issue(不区分大小写)-开头的分支执行,不在master主干执行
可以在issue-pylint和Issue-flake8分支执行
find Bugsonly: - /^issue-.*$/i except: - branches只在以issue(不区分大小写)-开头的分支执行,不在 branches 分支执行,
由于issue-pylint也是分支,所以在issue-pylint中也不会执行find Bugs作业
test1only: - /^issue-.*$/i except: - /issue-pylint/只在以issue(不区分大小写)-开头的分支执行,不在issue-pylint分支执行,
即会在除了issue-pylint分支以外的issue-(不区分大小写)开头的分支执行,
可以在Issue-flake8分支执行
test2only: - /^issue-.*$/i except: - /Issue-flake8/只在以issue(不区分大小写)-开头的分支执行,不在Issue-flake8分支执行,
因此可以issue-pylint分支执行
deploy1only: - /^issue-.*$/i except: - /severe-issues/只在以issue(不区分大小写)-开头的分支执行,不在severe-issues分支执行
可以在issue-pylint和Issue-flake8分支执行

我们再将 only 语法中将 /^issue-.*$/ 改为 /issue/i !再来做一次实验,看看最终的效果。

不区分大小写匹配issue字符:

# This file is a template, and might need editing before it works on your project.
# see https://docs.gitlab.com/ce/ci/yaml/README.html for all available optionsbefore_script:- echo "Before script section"- echo "For example you might run an update here or install a build dependency"- echo "Or perhaps you might print out some debugging details"after_script:- echo "After script section"- echo "For example you might do some cleanup here"stages:- build- code_check- test- deploybuild1:stage: buildbefore_script:- echo "Before script in build stage that overwrited the globally defined before_script"- echo "Install cloc:A tool to count lines of code in various languages from a given directory."- yum install cloc -yafter_script:- echo "After script in build stage that overwrited the globally defined after_script"- cloc --version# cloc .only:- /issue/iexcept:- masterscript:- echo "Do your build here"- cloc --version# - cloc .tags:- bluelogfind Bugs:stage: code_checkonly:- /issue/iexcept:- branchesscript:- echo "Use Flake8 to check python code"- pip install flake8- flake8 --version# - flake8 .tags:- bluelogtest1:stage: testonly:- /issue/iexcept:- /issue-pylint/script:- echo "Do a test here"- echo "For example run a test suite"tags:- bluelogtest2:stage: testonly:- /issue/iexcept:- /Issue-flake8/script:- echo "Do another parallel test here"- echo "For example run a lint test"tags:- bluelogdeploy1:stage: deployonly:- /issue/iexcept:- /severe-issues/script:- echo "Do your deploy here"tags:- bluelog

预期效果:不区分大小写,issue-pylintIssue-flake8severe-issues 分支分支会触发流水线执行,master 主干不会触发流水线执行。

统计作业流水线作业情况:

分支流水线build1find Bugstest1test2deploy1
master未触发
issue-pylint#25YesNoNoYesYes
Issue-flake8#26YesNoYesNoYes
severe-issues#27YesNoYesYesNo

正如我们预期的一样,issue-pylintIssue-flake8severe-issues 分支会触发流水线执行,master 主干不会触发流水线执行:

解释上面的流水作业策略:

作业规则定义规则解释
build1only: - /issue/i except: - master只在包含issue(不区分大小写)字符的分支执行,不在master主干执行 , 因此在issue-pylint、Issue-flake8、severe-issues分支执行
find Bugsonly: - /issue/i except: - branches只在包含issue(不区分大小写)字符的分支执行,不在 branches 分支执行,所以find Bugs作业一直不会执行
test1only: - /issue/i except: - /issue-pylint/只在包含issue(不区分大小写)字符的分支执行,不在包含issue-pylint字符的分支执行,即会在除了issue-pylint分支以外包含issue(不区分大小写)字符的分支执行所以可以在Issue-flake8和severe-issues分支执行,
test2only: - /issue/i except: - /Issue-flake8/只在包含issue(不区分大小写)字符的分支执行,不在包含issue-flake8字符的分支执行,即会在除了issue-flake8分支以外包含issue(不区分大小写)字符的分支执行,所以可以在issue-pylint和severe-issues分支执行
deploy1only: - /issue/i except: - /severe-issues/只在包含issue(不区分大小写)字符的分支执行,不在包含severe-issues字符的分支执行,即会在除了severe-issues分支以外包含issue(不区分大小写)字符的分支执行,所以可以在issue-pylint和Issue-flake8分支执行

相关文章:

Elasticsearch的前后台运行与停止(rpm包方式)

对应&#xff0c;这es的下载&#xff0c;需要rpm包。 Elasticsearch-2.4.3的下载&#xff08;图文详解&#xff09; 建议用root用户 [rootdjt002 elasticsearch-2.4.3]$ pwd/usr/local/elasticsearch/elasticsearch-2.4.3 [rootdjt002 elasticsearch-2.4.3]$ rpm -ivh elastic…

SURF 特征检测及匹配

#include <opencv2/opencv.hpp> #include <opencv2/xfeatures2d.hpp> #include <opencv2/xfeatures2d/nonfree.hpp> #include <iostream>using namespace cv::xfeatures2d; using namespace std; using namespace cv;// 计算图像的SURF特征及匹配 floa…

Mybatis源码阅读之三

2019独角兽企业重金招聘Python工程师标准>>> 由前面的系列二分析到MapperMethod的execute方法&#xff0c;我们接着分析MapperMethod。如下List-1: List-1 public class MapperMethod {private final SqlCommand command;private final MethodSignature method;publ…

Vim快捷键键位图

https://www.runoob.com/w3cnote/all-vim-cheatsheat.html

简单几步写一个laravel扩展包

为什么80%的码农都做不了架构师&#xff1f;>>> laravel使用composer来管理扩展包&#xff0c;理解composer和laravel的开发模式&#xff0c;可以通过简单的几个步骤&#xff0c;快速写出一个laravel扩展包。 全新的laravel5.4环境安装 composer create-project la…

ORB 特征检测与匹配

#include <opencv2/opencv.hpp> #include <opencv2/xfeatures2d.hpp> #include <opencv2/xfeatures2d/nonfree.hpp> #include <iostream>using namespace cv::xfeatures2d; using namespace std; using namespace cv; // 计算图像的ORB特征及匹配 cv::…

数据结构(队列实现篇)

在数据结构与算法中&#xff0c;队列queue是一种受限的线性储存结构&#xff0c;特殊之处在于它只允许在表的前端front进行删除操作&#xff0c;而在表的后端rear进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表。进行插入操作的端称为队尾&#xf…

Markdown编辑器使用

Markdown编辑器使用欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚…

HOGDescriptor 描述类

struct CV_EXPORTS HOGDescriptor {// 高斯平滑参数enum { DEFAULT_WIN_SIGMA -1 };// 检测窗口的最大数量enum { DEFAULT_NLEVELS 64 };// 描述符存储格式enum { DESCR_FORMAT_ROW_BY_ROW, DESCR_FORMAT_COL_BY_COL };// 创建了特征描述符和检测器HOGDescriptor(Size win_si…

Linux----进程概念

程序 : 程序指的是一系列有逻辑, 有顺序结构的指令.进程 : 进程从两个角度来说:1 用户角度: 进程从用户角度来说就是运行中的程序2 操作系统的角度: 进程是操作系统对运行中程序的描述信息, 叫做进程描述符(程序控制块)简称PCBPCB : 在Linux下PCB指的是在内核中的task_struct 结…

codecheck

codecheck scan-build: clang-tools集成的静态检查工具, 使用clang static analyzer进行静态检查&#xff0c;使用方便 https://clang-analyzer.llvm.org/scan-build.html https://manpages.ubuntu.com/manpages/bionic/man1/scan-build.1.html CodeChecker: 爱立信推出的静…

ubuntu安装chrome浏览器

PPA方法&#xff0c;免FQ&#xff0c;否则&#xff0c;你得FQ下载chrome&#xff0c;你Firefox VPN配置好了吗&#xff01;&#xff01;&#xff01; wget -q -O - https://raw.githubusercontent.com/longhr/ubuntu1604hub/master/linux_signing_key.pub | sudo apt-key add s…

java中的注解(二)

今天我继续来介绍java中的注解。注解与接口和类不同的是注解是不允许继承的&#xff0c;但是注解中有一个和继承有关的元注解&#xff1a;Inherited。如果我们在定义注解时候加上这个元注解那么我们就可以在子类中监测到该注解的存在。 Target(ElementType.TYPE) Inherited Ret…

【C++】random随机数与【C++11】/rand()和srand()的用法

文章目录随机数1. c 11 random随机数的使用&#xff08;推荐使用&#xff09;1.11.21.31.42.1 C中随机函数rand()和srand()的用法&#xff08;老本版&#xff09;2.2 限制随机数的范围随机数 C 提供了一组函数以生成和使用随机数字。随机数字就是从一组可能的值中进行随机选择…

快速区域积分直方图实现

void cacHOGinCell(Mat& HOGCellMat,Rect roi,std::vector<Mat>& integrals) {// 实现快速积分HOGint x0 roi.x,y0 roi.y;int x1 x0 roi.width&#xff1b;int y1 y0 roi.height;for(int i 0; i < NBINS; i){// 根据矩阵的上下左右坐标计算Mat integra…

Resultset获取行数和列数

为什么80%的码农都做不了架构师&#xff1f;>>> 在Java中&#xff0c;获得ResultSet的总行数的方法有以下几种。 第一种&#xff1a;利用ResultSet的getRow方法来获得ResultSet的总行数 Statement stmt con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,Re…

object.create()

语法&#xff1a; Object.create(proto, [propertiesObject]) //方法创建一个新对象&#xff0c;使用现有的对象来提供新创建的对象的proto。 参数&#xff1a;proto : 必须。表示新建对象的原型对象&#xff0c;即该参数会被赋值到目标对象(即新对象&#xff0c;或说是最后返回…

codecheck_use_record

文章目录Step 1: Integrate CodeChecker into your build systemStep 2: Analyze your codeStep 3: Run the analysisStep 4: View the analysis results in the command lineStep 5: Hint: You can do the 1st and the 2nd step in one round by executing checkstep 6: Expor…

centos6.5 rsync+inotify同步配置笔记

以两台服务器为例&#xff1a; 主服务器&#xff1a; 192.168.1.100 从服务器&#xff1a; 192.168.1.101 1.安装rsync (主服务器与从服务器同时安装) 使用xinetd管理rsync yum install rsync xinetd 设置开机启动 vi /etc/xinetd.d/rsync ... 修改为 disable no ... 启动xin…

HOG 特征计算实现

// 获取HOG直方图 cv::Mat getHog(Point pt,std::vector<Mat> &integrals) {// 判断当前点的位置是否符合条件 if( pt.x - R < 0 ||pt.y - R < 0 ||pt.x R > integrals[0].cols ||pt.y R > integrals[0].rows ){return Mat();}// 直方图Mat hist(Size(…

Spring+SpringMVC+Mybatis整合

一、简单测试工程搭建1、Mybatis所需要的的jar包&#xff08;包含数据库驱动包和相关的日志包&#xff09;、SpringMVC和Spring的jar包2、然后构建一个基本的工程&#xff0c;这里我们使用mapper代理的方式进行Mybatis的编写&#xff0c;关于mapper代理请参考Mybatis简单入门中…

【Tools】Markdown数学符号公式(史上最全公式表)

Markdown数学符号&公式 文章目录Markdown数学符号&公式1. 希腊字母表2. 希腊字母3. 数学符号表4. 数学符号5. 数学符号补充表6. 数学符号补充1. 希腊字母表 符号代码符号代码α\alphaα\alphaA\AlphaA\Alphaβ\betaβ\betaB\BetaB\Betaγ\gammaγ\gammaΓ\GammaΓ\gam…

Editplus下载、安装并最佳配色方案(强烈推荐)

不多说&#xff0c;直接上干货&#xff01; Editplus下载 第一步&#xff1a;进入官网 https://www.editplus.com/ 第二步&#xff1a;下载 https://www.editplus.com/download.html Editplus安装 我这里&#xff0c;直接以一个压缩包来安装&#xff0c;需要的&#xff0c;请…

MySQL数据库开发规范-EC

最近一段时间一边在线上抓取SQL来优化&#xff0c;一边在整理这个开发规范&#xff0c;尽量减少新的问题SQL进入生产库。今天也是对公司的开发做了一次培训&#xff0c;PPT就不放上来了&#xff0c;里面有十来个生产SQL的案例。因为规范大部分还是具有通用性&#xff0c;所以也…

操作系统与内存管理

操作系统内存管理 文章目录操作系统内存管理1. 虚拟地址空间2. 内存地址空间含义及分配3. 虚拟内存诞生的前世与今生&#xff1f;3.1 内存管理的好处3.2 **内存管理实现总体策略**4. 不同进程如何划分内存地址空间&#xff1f;5 内存分配与回收5.1 buffer和cache5.2 malloc背后…

圆形 LBP 特征

template <typename _Tp> staticinline void elbp_(InputArray _src, OutputArray _dst,int radius, int neighbors) {// 得到数据矩阵Mat src _src.getMat();// 输出矩阵_dst.create(src.rows-2*radius, src.cols-2*radius, CV_32SC1);Mat dst _dst.getMat();// 初始化…

40个Java多线程问题总结

&#xff08;转&#xff09; 这篇文章作者写的真是不错 40个问题汇总 1、多线程有什么用&#xff1f; 一个可能在很多人看来很扯淡的一个问题&#xff1a;我会用多线程就好了&#xff0c;还管它有什么用&#xff1f;在我看来&#xff0c;这个回答更扯淡。所谓"知其然知其所…

SLAM十四讲笔记1

文章目录ch02 初识SLAMch02-01 经典视觉SLAM框架ch02-02 SLAM问题的数学表述ch03 三维空间刚体运动ch03.01 旋转矩阵&#xff1a;点和向量,坐标系01 向量a在线性空间的基[e1,e2,e3][e_1,e_2,e_3][e1​,e2​,e3​]下的坐标为[a1,a2,a3]T[a_1,a_2,a_3]^T[a1​,a2​,a3​]T.02 向量…

12、OpenCV实现图像的空间滤波——图像平滑

1、空间滤波基础概念 1、空间滤波基础 空间滤波一词中滤波取自数字信号处理&#xff0c;指接受或拒绝一定的频率成分&#xff0c;但是空间滤波学习内容实际上和通过傅里叶变换实现的频域的滤波是等效的&#xff0c;故而也称为滤波。空间滤波主要直接基于领域&#xff08;空间域…

计算 LBP 特征

#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/features2d/features2d.hpp> // 计算原始LBP特征 cv::Mat OLBP(cv::Mat& srcImage) {const int nRows …