我有一个设置,我的项目的根目录包含一个
.github
目录。例如,在这个目录旁边是 git
,在 src
旁边不可避免地有我的 基于 Laravel 的框架应用程序。
.
├── .github // tests.yml resides within this directory under the workflows directory
├── README.md
├── docker-compose.yml
├── docs
└── src
Laravel源代码位于
src
文件夹下,当我创建Github Action来运行测试时,它们总是失败。以下是我的构建脚本的示例:
name: Build & Test Main
on:
pull_request:
branches: [main, develop]
paths:
- ".github/**"
- "src/**"
jobs:
build-test:
name: Build & Test
runs-on: ubuntu-20.04
steps:
- name: Setting MySql 8
run: |
echo -e "Enable LOAD DATA LOCAL INFILE in my.cnf\n"
echo -e "SETTING secure-file-priv TO EMPTY STRING\n"
echo -e "[mysqld]\nsecure-file-priv=''" | sudo tee -a /etc/mysql/my.cnf
echo -e "SETTING local_infile TO ON\n"
echo -e "[mysqld]\nlocal_infile='ON'" | sudo tee -a /etc/mysql/my.cnf
echo -e "Start MYSQL service, it is off by default\n"
sudo systemctl enable mysql.service
sudo systemctl start mysql.service
echo -e "Creating Laravel Database\n"
mysql --host 127.0.0.1 -uroot -proot -e 'CREATE DATABASE IF NOT EXISTS laravel;'
echo -e "Check new settings\n"
mysql --host 127.0.0.1 -uroot -proot -e "SELECT @@global.secure_file_priv, @@global.local_infile"
- uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
with:
php-version: "8.1"
- uses: actions/checkout@v2
- name: Copy .env
run: cp .env.example .env.ci
- name: Install Dependencies
run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- name: Generate key
run: php artisan key:generate
- name: Directory Permissions
run: chmod -R 777 storage bootstrap/cache
- name: Run migrations and seeders
run: php artisan migrate:fresh --seed --force
- name: Execute tests (Unit and Feature tests) via PHPUnit
run: php artisan test --parallel
不幸的是,这并不能很好地工作,因为当它必须安装作曲家时它总是失败。我尝试了各种方法,甚至在每一步(包括全局)添加
working-dir
选项,但我无法获得任何积极的结果。
我几乎可以定义我需要的所有服务,就像我对
docker-compose.yml
文件所做的那样,除了问题似乎在于最终如何读取 composer.json
文件。
在我的整个项目中,下面的目录结构显示了我的项目是如何制定的。
.
├── README.md
├── docker-compose.yml
├── docs
│ └── images
└── src
├── CHANGELOG.md
├── README.md
├── app
├── artisan
├── bootstrap
├── composer.json
├── composer.lock
├── config
├── database
├── env.testing
├── node_modules
├── package-lock.json
├── package.json
├── phpspec.yaml
├── phpunit.xml
├── postcss.config.js
├── public
├── resources
├── routes
├── storage
├── tailwind.config.js
├── tests
├── vendor
└── webpack.mix.js
14 directories, 15 files
下面的图像显示了我的管道如何由于作曲家找不到
composer.json
文件或其前身而发生严重失败,因为它们都位于 src
目录中。
我已经尝试过它,这将使您能够启动并运行。
由于您的作业包含需要从
src
工作目录执行的多个步骤,最简单的选择是将其设置为作业的默认工作目录。这将与您的“Setting MySql 8”步骤冲突(因为此时 @actions/checkout
尚未运行,因此 src
文件夹尚不存在),因此您需要覆盖该特定步骤的工作目录。
这会将您的
build-test
工作变成以下内容:
jobs:
build-test:
name: Build & Test
runs-on: ubuntu-20.04
defaults:
run:
working-directory: ./src
steps:
- name: Setting MySql 8
run: |
echo -e "Enable LOAD DATA LOCAL INFILE in my.cnf\n"
echo -e "SETTING secure-file-priv TO EMPTY STRING\n"
echo -e "[mysqld]\nsecure-file-priv=''" | sudo tee -a /etc/mysql/my.cnf
echo -e "SETTING local_infile TO ON\n"
echo -e "[mysqld]\nlocal_infile='ON'" | sudo tee -a /etc/mysql/my.cnf
echo -e "Start MYSQL service, it is off by default\n"
sudo systemctl enable mysql.service
sudo systemctl start mysql.service
echo -e "Creating Laravel Database\n"
mysql --host 127.0.0.1 -uroot -proot -e 'CREATE DATABASE IF NOT EXISTS laravel;'
echo -e "Check new settings\n"
mysql --host 127.0.0.1 -uroot -proot -e "SELECT @@global.secure_file_priv, @@global.local_infile"
working-directory: .
- uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
with:
php-version: "8.1"
- uses: actions/checkout@v2
- name: Copy .env
run: cp .env.example .env
- name: Install Dependencies
run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- name: Generate key
run: php artisan key:generate
- name: Directory Permissions
run: chmod -R 777 storage bootstrap/cache
- name: Run migrations and seeders
run: php artisan migrate:fresh --seed --force
- name: Execute tests (Unit and Feature tests) via PHPUnit
run: php artisan test --parallel
这将使 Github Actions 通过设置、Composer、密钥生成和目录权限步骤。
artisan migrate
仍然会失败,部分原因是 .env.example
文件中的凭据和数据库名称与您为 Github Actions 设置的数据库不匹配,而且还因为其中一个种子失败。但我会把这些留给你去弄清楚,或者在一个新问题中询问,因为这不再与运行 Github Actions 相关。