【问题标题】:GitLab-CI PHPunit Composer laravelGitLab-CI PHPunit Composer laravel
【发布时间】:2015-07-23 04:21:13
【问题描述】:

我是 GitLab-CI 和 Docker 的新手,我一直在找一个跑步者来运行我的 phpunit 构建。按照此处的说明进行操作: https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/install/linux-repository.md

但是,按照他们的说明,容器显然不包含我需要的工具。所以问题是,注册一个多运行器以拥有一个支持 phpunit、composer 的运行器时的配置是什么,这样我就可以测试我的 laravel 构建了。

【问题讨论】:

  • 我是 GitLab-CI 和 docker 的新手,但希望这不会完全没用。想法是配置和设置您自己的 docker 映像,准备好进行测试的所有内容,或者通过在 repo 顶部的 `.gitlab-ci.yml' 文件中指定正确的命令来执行安装/配置.

标签: gitlab gitlab-ci gitlab-ci-runner


【解决方案1】:

按照他们的说明向 docker executor 注册 gitlab-ci-multi-runner。比在您的.gitlab-ci.yml 中提供一个适当的图像,其中包含满足您要求的最低要求。您可以通过before_script 中的命令行install 进行的所有其他操作。我正在为您发布一个示例工作配置:

image: tetraweb/php
services:
    - mysql
variables:
    MYSQL_DATABASE: effiocms_db
    MYSQL_USER: effio_user
    MYSQL_PASSWORD: testpassword
    WITH_XDEBUG: "1"
before_script:
    # enable necessary php extensions
    - docker-php-ext-enable zip && docker-php-ext-enable mbstring && docker-php-ext-enable gd && docker-php-ext-enable pdo_mysql
    # composer update
    - composer self-update && composer --version
    - composer global require --no-interaction --quiet "fxp/composer-asset-plugin:~1.1.0"
    - export PATH="$HOME/.composer/vendor/bin:$PATH"
    - composer install --dev --prefer-dist --no-interaction --quiet
    # codeception install
    - composer global require --no-interaction --quiet "codeception/codeception=2.0.*" "codeception/specify=*" "codeception/verify=*"
    # setup application
    - |
      php ./init --env=Development --overwrite=All
      cd tests/codeception/backend && codecept build
      cd ../common && codecept build
      cd ../console && codecept build
      cd ../frontend && codecept build
      cd ../../../
    - cd tests/codeception/bin && php yii migrate --interactive=0 && cd ../../..
codeception:
    stage: test
    script:
        - |
          php -S localhost:8080 > /dev/null 2>&1 &
          cd tests/codeception/frontend
          codecept run

很明显,这个配置是针对我在 Yii2 上运行的应用程序的。因此,您需要根据自己的要求对其进行调整。

【讨论】:

    【解决方案2】:

    与Arman P. 所说的一致。运行测试时,请确保您有一个 docker 映像,其中包含构建/测试所需的所有工具。

    你有两个选择:

    1. 您可以使用所需的所有工具构建自己的映像,并且 随着项目的发展保持这一点;或者,

    2. 您可以简单地从 docker hub 安装一个基本映像并安装 运行作业之前的所有工具。

    这两种选择各有利弊:

    选项 (1) 为您提供完全控制权,但您需要将其添加到 CI 可以从中提取的私有注册表中(Gitlab 为您提供私有注册表支持)。这里唯一的小问题是您必须首先设置私有注册表(例如 Gitlab)。难度不大,只需要做一次。

    但随后由您来维护图像等。

    选项 (2) 允许您运行所有工具,而无需维护私有注册表或 docker 容器。正如 Arman P. 所提到的,您只需在工作之前运行安装脚本。这样做的缺点是您的作业和构建/测试需要更长的时间才能运行,因为您现在必须在每次运行之前等待安装发生。


    一个简单的例子:使用选项(2)

    我们需要 PHPUnit 和 composer。

    因此,请使用公共 docker hub 中具有 php 的容器:选择具有您要测试的 PHP 版本(例如 5.6 或 7)的容器。让我们假设 5.6。

    在该容器中,我们需要先安装 composer 和 PHPUnit,然后才能运行我们的测试。您的 CI 文件可能如下所示:

    .gitlab-ci.yml

    image: php:5.6.25-cli
    
    stages:
        - build
        - test
    
    .install_composer_template:&install_composer
        - apt-get install -y git
        - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
    
    before_script:
        <<:*install_composer
    
    build app:
        stage: build
        script:
            - composer install
            - composer dump-autoload -o
    
    test app:
        stage: test
        before_script:
            <<:*install_composer
            - composer global require -q phpunit/phpunit
        script:
            - phpunit --colors=always
    

    快速总结这实际上做了什么

    每项工作——这里我们只有“构建应用程序”和“测试应用程序”——都将通过官方 PHP 5.6 映像运行。

    我们定义了两个阶段buildtest——注意:这些是默认定义的,但在这里我们要明确说明清晰度。

    运行的第一个作业将是“构建应用程序”,因为它发生在第一阶段,buildscript 在此作业中运行之前,全局 before_script 运行,它会安装 git 和 composer(Composer 需要 Git)。然后脚本运行并安装我们所有的作曲家依赖项。完毕。

    然后执行下一个阶段,即测试。因此,我们的作业附加到该运行(如果我们有多个作业,则并行运行),这对我们来说只是“测试应用程序”。在这里,我们使用 YML 特性来重用安装 composer 指令:本地 before_script 覆盖全局 before_script,安装 Composer(通过 YML 模板)和 PHPUnit。然后实际的 script 运行:它运行我们的单元测试。单元测试假设您在根目录中有一个 phpunit 配置——您可以像在自己的终端上一样自定义此命令。

    请注意,由于阶段设置,构建阶段的输出会自动在测试阶段可用。所以我们什么都不用做,Gitlab 会为我们传递所有的文件!

    使用 install_composer 模板的主要原因是为了提高作业执行时间。大多数事情都需要 Composer。所以我们有一个全局模板和一个为每个作业运行的脚本。如果您需要更具体的东西,使用仅用于该工作的工具,例如PHPUnit,然后在作业中本地覆盖 before_script 并安装所需的工具。这样一来,我们就不必安装可能并非每项工作都需要的大量工具!

    【讨论】:

    • 那个别名/合并标记对我不起作用 - 经过一番翻找后,我发现 this question 关于合并键 - 它似乎不适用于这样的序列。
    猜你喜欢
    • 2017-11-28
    • 2018-03-11
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    相关资源
    最近更新 更多