Laravel-Ci.md


Laravel ci

Example project: Laravel-crawler

docker-compose.yml

version: '3.8'

services:
    app:
        build:
            context: .
            dockerfile: Dockerfile
        command: bash -c "php artisan serve --host=0.0.0.0 --port=8998 & npm run dev"
        ports:
            - 5174:5174
            - 8998:8998
        networks:
            - crawler_network
        volumes:
            - .:/application
        depends_on:
            - mysql

    mysql:
        image: mysql
        ports:
            - 3308:3306
        networks:
            - crawler_network
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_USER: laravel
            MYSQL_PASSWORD: laravel
            MYSQL_DATABASE: laravel
        volumes:
            - mysql_data:/var/lib/mysql

networks:
    crawler_network:
volumes:
    mysql_data:

Dockerfile

FROM php:8.1.0

# Add docker php extension installer script
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

RUN chmod +x /usr/local/bin/install-php-extensions \
    && install-php-extensions @composer \
    calendar \
    exif \
    ffi \
    mysqli \
    pdo \
    pdo_mysql \
    gd

ENV NODE_VERSION=16.13.0
RUN apt install -y curl
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
ENV NVM_DIR=/root/.nvm
RUN . "$NVM_DIR/nvm.sh" && nvm install ${NODE_VERSION}
RUN . "$NVM_DIR/nvm.sh" && nvm use v${NODE_VERSION}
RUN . "$NVM_DIR/nvm.sh" && nvm alias default v${NODE_VERSION}
ENV PATH="/root/.nvm/versions/node/v${NODE_VERSION}/bin/:${PATH}"

WORKDIR /application

.gitlab-ci.yml

image: docker

services:
  - docker:dind

variables:
  CI_IMAGE: $CI_REGISTRY_IMAGE/dave-test-image:latest
  GITLAB_REGISTRY_USERNAME: gitlab+deploy-token-1611692
  MYSQL_DATABASE: laravel
  MYSQL_ROOT_PASSWORD: laravel

stages:
  - build
  - test

build_job:
  stage: build
  only:
    variables:
      - $CI_COMMIT_MESSAGE =~ /build-image/
      - $CI_COMMIT_TAG =~ /build-image/
  before_script:
    - docker login $CI_REGISTRY -u $GITLAB_REGISTRY_USERNAME -p $GITLAB_REGISTRY_PASSWORD
  script:
    - docker build -t $CI_IMAGE .
    - docker push $CI_IMAGE

test_job:
  stage: test
  image: $CI_IMAGE
  services:
    - mysql:8.0
  variables:
    MYSQL_ROOT_PASSWORD: laravel
    MYSQL_DATABASE: laravel
    MYSQL_USER: laravel
    MYSQL_PASSWORD: laravel
  script:
    - bash scripts/gitlab-ci.sh
    - composer install
    - php artisan key:generate
    - php artisan optimize
    - php artisan migrate:install
    - php artisan migrate
    - php artisan test

gitlab-ci.sh

Run anything you need for deploy this project, in this case, I need a .env file for laravel project.

cat <<EOT >> .env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=laravel

BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

MEMCACHED_HOST=127.0.0.1

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1

VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

EOT

Should be easier to maintain by copy for a file in git such as .env-gitlab and use the script to copy it, and the secret info such as token and password should be placed by gitlab ci variable.

Gitlab runner setting

Using docker runner to run git project, and docker in docker to build image, install related setting and run the test, then you can see pipeline success if test passed, and fail if test not passed.