1414 name : Symfony (PHP ${{ matrix.php-versions }})
1515 runs-on : ubuntu-latest
1616 env :
17- DATABASE_URL : mysql://root:symfony@127.0.0.1:3306/symfony?Version =9.3
17+ DATABASE_URL : mysql://root:symfony@127.0.0.1:3306/symfony?serverVersion =9.3
1818
19- # Docs: https://docs.github.com/en/actions/using-containerized-services
2019 services :
2120 mysql :
2221 image : mysql:9.3
3534 - name : Checkout
3635 uses : actions/checkout@v4
3736
38- # Docs: https://github.com/shivammathur/setup-php
3937 - name : Setup PHP
4038 uses : shivammathur/setup-php@v2
4139 with :
@@ -44,72 +42,91 @@ jobs:
4442 extensions : mbstring, xml, ctype, iconv, intl, pdo_sqlite, mysql
4543 coverage : xdebug
4644
47- # Local MySQL service in GitHub hosted environments is disabled by default.
48- # If you are using it instead of service containers, make sure you start it.
49- # - name: Start mysql service
50- # run: sudo systemctl start mysql.service
51-
5245 - name : Copy .env.dist
5346 run : php -r "file_exists('.env.local') || copy('.env.dist', '.env.local');"
47+
5448 - name : Get composer cache directory
5549 id : composer-cache
5650 run : echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
51+
5752 - name : Cache composer dependencies
5853 uses : actions/cache@v4
5954 with :
6055 path : ${{ steps.composer-cache.outputs.dir }}
61- # Use composer.json for key, if composer.lock is not committed.
62- # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
6356 key : ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
6457 restore-keys : ${{ runner.os }}-composer-
58+
6559 - name : Install Composer dependencies
66- if : steps.composer-cache.outputs.cache-hit != 'true'
6760 run : composer install --no-progress --prefer-dist --optimize-autoloader
6861 env :
69- DATABASE_URL : mysql://root:symfony@127.0.0.1:${{ job.services.mysql.ports['3306'] }}/symfony?Version=9.3
62+ DATABASE_URL : mysql://root:symfony@127.0.0.1:${{ job.services.mysql.ports['3306'] }}/symfony?serverVersion=9.3
63+
7064 - name : Run Migration
7165 run : |
72- composer require --dev symfony/orm-pack
7366 php bin/console doctrine:schema:update --complete --force || echo "No migrations found or schema update failed"
74- php bin/console doctrine:migrations:migrate || echo "No migrations found or migration failed"
67+ php bin/console doctrine:migrations:migrate --no-interaction || echo "No migrations found or migration failed"
7568 env :
76- DATABASE_URL : mysql://root:symfony@127.0.0.1:${{ job.services.mysql.ports['3306'] }}/symfony?Version=9.3
77- - name : Install PHPUnit
78- run : composer require --dev phpunit/phpunit && vendor/bin/phpunit --coverage-text
69+ DATABASE_URL : mysql://root:symfony@127.0.0.1:${{ job.services.mysql.ports['3306'] }}/symfony?serverVersion=9.3
70+
71+ - name : Run Tests
72+ run : |
73+ composer require --dev phpunit/phpunit
74+ vendor/bin/phpunit --coverage-text
75+ env :
76+ DATABASE_URL : mysql://root:symfony@127.0.0.1:${{ job.services.mysql.ports['3306'] }}/symfony?serverVersion=9.3
77+
7978 deploy :
8079 name : Deploy image
8180 runs-on : ubuntu-latest
8281 needs : validate
82+ if : github.event_name == 'push'
8383 env :
8484 DOCKER_BRANCH : ${{ github.ref_name }}
8585 DOMAIN_URL : ${{ secrets.DOMAIN_URL }}
8686 DOCKER_REGISTRY : ${{ secrets.DOCKER_REGISTRY }}
87+ MYSQL_ROOT_PASSWORD : ${{ secrets.MYSQL_ROOT_PASSWORD }}
88+ MYSQL_USER : ${{ secrets.MYSQL_USER }}
89+ MYSQL_PASSWORD : ${{ secrets.MYSQL_PASSWORD }}
90+ MYSQL_DATABASE : ${{ secrets.MYSQL_DATABASE }}
8791 steps :
8892 - uses : actions/checkout@v4
93+
8994 - name : Set environment variables
95+ id : set-env
9096 run : |
91- echo "DOCKER_NETWORK_NAME=api-${DOCKER_BRANCH}" >> $GITHUB_ENV
92- echo "DATABASE_URL=mysql://root:symfony@db:3306/symfony" >> $GITHUB_ENV
93- if [[ "${DOCKER_BRANCH}" == "alpha" ]]; then
94- echo "APP_ENV=dev" >> $GITHUB_ENV
95- else
96- echo "APP_ENV=prod" >> $GITHUB_ENV
97- fi
97+ echo "DOCKER_NETWORK_NAME=api-${DOCKER_BRANCH}" >> $GITHUB_ENV
98+ echo "DATABASE_URL=mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@db:3306/${MYSQL_DATABASE}?serverVersion=9.3" >> $GITHUB_ENV
99+
100+ if [[ "${DOCKER_BRANCH}" == "master" ]]; then
101+ echo "APP_ENV=prod" >> $GITHUB_ENV
102+ echo "HOSTNAME=api.${DOMAIN_URL}" >> $GITHUB_ENV
103+ elif [[ "${DOCKER_BRANCH}" == "preprod" ]]; then
104+ echo "APP_ENV=prod" >> $GITHUB_ENV
105+ echo "HOSTNAME=api.${DOCKER_BRANCH}.${DOMAIN_URL}" >> $GITHUB_ENV
106+ else
107+ echo "APP_ENV=dev" >> $GITHUB_ENV
108+ echo "HOSTNAME=api.${DOCKER_BRANCH}.${DOMAIN_URL}" >> $GITHUB_ENV
109+ fi
110+
98111 - name : Login to registry
99112 uses : docker/login-action@v3
100113 with :
101114 registry : ${{ secrets.DOCKER_REGISTRY }}
102115 username : ${{ secrets.DOCKER_LOGIN }}
103116 password : ${{ secrets.DOCKER_PASSWD }}
117+
104118 - name : Build and push Docker image
105119 uses : docker/build-push-action@v5
106120 with :
107121 context : .
108122 push : true
109123 tags : ${{ secrets.DOCKER_REGISTRY }}/api-php:${{ github.ref_name }}
110124 build-args : |
111- APP_ENV=${{ env.APP_ENV }}
112- DATABASE_URL=${{ env.DATABASE_URL }}
125+ APP_ENV=${{ env.APP_ENV }}
126+ DATABASE_URL=${{ env.DATABASE_URL }}
127+ cache-from : type=registry,ref=${{ secrets.DOCKER_REGISTRY }}/api-php:${{ github.ref_name }}
128+ cache-to : type=inline
129+
113130 - name : Configure SSH
114131 env :
115132 SSH_USER : ${{ secrets.SSH_USER }}
@@ -128,34 +145,29 @@ jobs:
128145 IdentityFile ~/.ssh/staging.key
129146 StrictHostKeyChecking no
130147 END
131- - name : Update envs & run migrations
132- # with:
133- # SYMFONY_ENV: ${{ secrets.SYMFONY_ENV }}
148+
149+ - name : Deploy and run migrations
134150 run : |
135- if [[ "${DOCKER_BRANCH}" == "master" ]]; then
136- HOSTNAME="api.$DOMAIN_URL"
137- APP_ENV="prod"
138- elif [[ "${DOCKER_BRANCH}" == "preprod" ]]; then
139- HOSTNAME="api.${DOCKER_BRANCH}.$DOMAIN_URL"
140- APP_ENV="prod"
141- else
142- HOSTNAME="api.${DOCKER_BRANCH}.$DOMAIN_URL"
143- APP_ENV="dev"
144- fi
145151 ssh staging "cd /var/docker/api/${DOCKER_BRANCH} && \
146- export DOCKER_BRANCH=${DOCKER_BRANCH} && \
147- export DOCKER_REGISTRY=${DOCKER_REGISTRY} && \
148- echo 'APP_ENV=${APP_ENV}' > .env && \
149- echo 'DATABASE_URL=${DATABASE_URL}' >> .env && \
150- echo 'DOCKER_NETWORK_NAME=api-${DOCKER_BRANCH}' >> .env && \
151- echo 'HOSTNAME=${HOSTNAME}' >> .env && \
152- echo 'MYSQL_ROOT_PASSWORD=${{ secrets.MYSQL_ROOT_PASSWORD }}' >> .env && \
153- echo 'MYSQL_USER=${{ secrets.MYSQL_USER }}' >> .env && \
154- echo 'MYSQL_PASSWORD=${{ secrets.MYSQL_PASSWORD }}' >> .env && \
155- echo 'MYSQL_DATABASE=${{ secrets.MYSQL_DATABASE }}' >> .env && \
152+ export DOCKER_BRANCH='${DOCKER_BRANCH}' && \
153+ export DOCKER_REGISTRY='${DOCKER_REGISTRY}' && \
154+ cat > .env << 'ENVEOF'
155+ APP_ENV=${APP_ENV}
156+ DATABASE_URL=${DATABASE_URL}
157+ DOCKER_NETWORK_NAME=${DOCKER_NETWORK_NAME}
158+ HOSTNAME=${HOSTNAME}
159+ MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
160+ MYSQL_USER=${MYSQL_USER}
161+ MYSQL_PASSWORD=${MYSQL_PASSWORD}
162+ MYSQL_DATABASE=${MYSQL_DATABASE}
163+ ENVEOF
156164 git pull origin ${DOCKER_BRANCH} && \
157165 docker compose --file docker-compose-branch.yml pull && \
158166 docker login -u ${{ secrets.DOCKER_LOGIN }} -p ${{ secrets.DOCKER_PASSWD }} ${DOCKER_REGISTRY} && \
159- docker compose --project-name ${DOCKER_BRANCH}-api_php --file docker-compose-branch.yml up -d && \
160- until docker exec ${DOCKER_BRANCH}-api_php-sf true 2>/dev/null; do sleep 5; done && \
161- docker compose --project-name ${DOCKER_BRANCH}-api_php --file docker-compose-branch.yml exec symfony php bin/console doctrine:migrations:migrate --no-interaction"
167+ docker compose --project-name ${DOCKER_BRANCH}-api_php --file docker-compose-branch.yml up -d --remove-orphans && \
168+ echo 'Waiting for container to be ready...' && \
169+ until docker exec ${DOCKER_BRANCH}-api_php-sf true 2>/dev/null; do sleep 2; done && \
170+ echo 'Running migrations...' && \
171+ docker compose --project-name ${DOCKER_BRANCH}-api_php --file docker-compose-branch.yml exec -T symfony php bin/console doctrine:migrations:migrate --no-interaction --allow-no-migration && \
172+ echo 'Clearing cache...' && \
173+ docker compose --project-name ${DOCKER_BRANCH}-api_php --file docker-compose-branch.yml exec -T symfony php bin/console cache:clear"
0 commit comments