Skip to content

Commit cecfb91

Browse files
authored
[5.4] Add Support for Github Codespaces (#45950)
Backport [6.0] Add Support for Github Codespaces #45719 to 5.4
1 parent a983616 commit cecfb91

File tree

5 files changed

+308
-0
lines changed

5 files changed

+308
-0
lines changed

.devcontainer/Dockerfile

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# Start from the official PHP 8.2 image with Apache
2+
FROM php:8.2-apache-bookworm
3+
4+
# Install system dependencies, Node.js, Composer, and Cypress dependencies
5+
RUN apt-get update && apt-get install -y \
6+
# System tools and git
7+
git \
8+
unzip \
9+
curl \
10+
sudo \
11+
# PHP extensions dependencies
12+
libpng-dev \
13+
libonig-dev \
14+
libxml2-dev \
15+
libzip-dev \
16+
# MySQL client AND server
17+
default-mysql-client \
18+
default-mysql-server \
19+
# Cypress dependencies
20+
xvfb \
21+
libgtk2.0-0 \
22+
libgtk-3-0 \
23+
libgbm-dev \
24+
libnotify-dev \
25+
libnss3 \
26+
libxss1 \
27+
libasound2 \
28+
libxtst6 \
29+
xauth \
30+
libldap2-dev \
31+
libgd-dev \
32+
&& \
33+
# Install the required PHP extensions for Zip and MySQL
34+
docker-php-ext-install zip mysqli gd ldap && \
35+
# Install Node.js (LTS version)
36+
curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && \
37+
apt-get install -y nodejs && \
38+
# Install Composer globally
39+
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
40+
# Install Xdebug
41+
pecl install xdebug && \
42+
# Clean up apt cache to reduce image size
43+
apt-get clean && rm -rf /var/lib/apt/lists/*
44+
45+
# After installing everything
46+
RUN sed -i 's|/var/www/html|/workspaces/joomla-cms|g' /etc/apache2/sites-available/000-default.conf \
47+
&& sed -i 's|/var/www/html|/workspaces/joomla-cms|g' /etc/apache2/apache2.conf
48+
49+
# Enable Apache's rewrite module and set the ServerName to prevent warnings
50+
RUN a2enmod rewrite \
51+
&& echo "ServerName localhost" >> /etc/apache2/apache2.conf
52+
53+
RUN apt-get update && apt-get install -y ssl-cert && \
54+
a2enmod ssl && \
55+
a2ensite 000-default && \
56+
a2ensite default-ssl && \
57+
sed -i 's|/var/www/html|/workspaces/joomla-cms|g' /etc/apache2/sites-available/default-ssl.conf && \
58+
echo '<Directory /workspaces/joomla-cms>\n Options Indexes FollowSymLinks\n AllowOverride All\n Require all granted\n</Directory>' >> /etc/apache2/sites-available/default-ssl.conf
59+
60+
# Create a custom PHP configuration file to enable file uploads and a log directory
61+
RUN mkdir -p /var/log/ && \
62+
touch /var/log/php_errors.log && \
63+
chown -R www-data:www-data /var/log/ && \
64+
chmod 766 /var/log/php_errors.log && \
65+
echo "upload_tmp_dir = /tmp" > /usr/local/etc/php/conf.d/custom-php.ini && \
66+
echo "post_max_size = 64M" >> /usr/local/etc/php/conf.d/custom-php.ini && \
67+
echo "upload_max_filesize = 64M" >> /usr/local/etc/php/conf.d/custom-php.ini && \
68+
echo "log_errors = On" >> /usr/local/etc/php/conf.d/custom-php.ini && \
69+
echo "error_log = /var/log/php_errors.log" >> /usr/local/etc/php/conf.d/custom-php.ini && \
70+
echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/custom-php.ini

.devcontainer/devcontainer.json

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
{
2+
"name": "Joomla Dev Environment",
3+
"dockerComposeFile": "docker-compose.yml",
4+
"service": "app",
5+
"workspaceFolder": "/workspaces/joomla-cms",
6+
"features": {
7+
"ghcr.io/devcontainers/features/desktop-lite:1": {}
8+
},
9+
"portsAttributes": {
10+
"443" : {
11+
"label": "Web Server (Joomla & phpmyadmin)",
12+
"onAutoForward": "silent"
13+
},
14+
"6080": {
15+
"label": "Cypress GUI",
16+
"onAutoForward": "silent"
17+
}
18+
},
19+
"postCreateCommand": "bash ./.devcontainer/post-create.sh",
20+
"customizations": {
21+
"vscode": {
22+
"extensions": [
23+
"xdebug.php-debug",
24+
"bmewburn.vscode-intelephense-client",
25+
"esbenp.prettier-vscode"
26+
],
27+
"settings": {
28+
"launch": {
29+
"version": "0.2.0",
30+
"configurations": [
31+
{
32+
"name": "Listen for Xdebug",
33+
"type": "php",
34+
"request": "launch",
35+
"port": 9003,
36+
"log": false
37+
}
38+
]
39+
}
40+
}
41+
}
42+
},
43+
"remoteUser": "root"
44+
}

.devcontainer/docker-compose.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
services:
2+
app:
3+
build:
4+
context: .
5+
dockerfile: Dockerfile
6+
volumes:
7+
- ..:/workspaces/joomla-cms:cached
8+
- ./xdebug.ini:/usr/local/etc/php/conf.d/99-xdebug.ini
9+
ports:
10+
- "80:80"
11+
- "443:443"
12+
- "3306:3306"
13+
- "6080:6080"
14+
command: sleep infinity
15+
16+
mysql:
17+
image: mysql:8.0
18+
command: --default-authentication-plugin=mysql_native_password
19+
restart: unless-stopped
20+
environment:
21+
MYSQL_ROOT_PASSWORD: root
22+
MYSQL_DATABASE: test_joomla
23+
MYSQL_USER: joomla_ut
24+
MYSQL_PASSWORD: joomla_ut
25+
volumes:
26+
- "mysql-data:/var/lib/mysql"
27+
28+
volumes:
29+
mysql-data:

.devcontainer/post-create.sh

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
#!/bin/bash
2+
3+
# Exit immediately if a command exits with a non-zero status.
4+
set -e
5+
6+
echo "--- Starting Joomla Core Post-Creation Setup ---"
7+
8+
# Configuration variables
9+
DB_NAME="test_joomla"
10+
DB_USER="joomla_ut"
11+
DB_PASS="joomla_ut"
12+
ADMIN_USER="ci-admin"
13+
ADMIN_REAL_NAME="jane doe"
14+
ADMIN_PASS="joomla-17082005"
15+
ADMIN_EMAIL="[email protected]"
16+
JOOMLA_ROOT="/workspaces/joomla-cms"
17+
18+
# Allow git commands to run safely in the container
19+
git config --global --add safe.directory $JOOMLA_ROOT
20+
21+
# --- 1. Wait for MariaDB Service ---
22+
echo "--> Waiting for MariaDB to become available..."
23+
while ! mysqladmin ping -h"mysql" --silent; do
24+
sleep 1
25+
done
26+
echo "✅ MariaDB is ready."
27+
28+
# --- 2. Install Core Dependencies ---
29+
echo "--> Installing Composer and NPM dependencies..."
30+
composer install
31+
npm install
32+
echo "✅ Dependencies installed."
33+
34+
# --- 3. Install Joomla from Repository Source ---
35+
echo "--> Installing Joomla using the local repository source..."
36+
rm -f configuration.php
37+
php installation/joomla.php install \
38+
--site-name="Joomla CMS Test" \
39+
--admin-user="$ADMIN_REAL_NAME" \
40+
--admin-username="$ADMIN_USER" \
41+
--admin-password="$ADMIN_PASS" \
42+
--admin-email="$ADMIN_EMAIL" \
43+
--db-type="mysqli" \
44+
--db-host="mysql" \
45+
--db-name="$DB_NAME" \
46+
--db-user="$DB_USER" \
47+
--db-pass="$DB_PASS" \
48+
--db-prefix="jos_" \
49+
--db-encryption="0" \
50+
--public-folder=""
51+
echo "✅ Joomla installed."
52+
53+
# --- 4. Configure Joomla for Development ---
54+
echo "--> Applying development settings..."
55+
# Enable debug mode and maximum error reporting for easier troubleshooting.
56+
php cli/joomla.php config:set error_reporting=maximum
57+
echo "✅ Development settings applied."
58+
59+
# --- 5. Install and Configure phpMyAdmin ---
60+
PMA_ROOT="${JOOMLA_ROOT}/phpmyadmin"
61+
echo "--> Downloading phpMyAdmin into $PMA_ROOT..."
62+
PMA_VERSION=5.2.2
63+
mkdir -p $PMA_ROOT
64+
curl -o /tmp/phpmyadmin.tar.gz https://files.phpmyadmin.net/phpMyAdmin/${PMA_VERSION}/phpMyAdmin-${PMA_VERSION}-all-languages.tar.gz
65+
tar xf /tmp/phpmyadmin.tar.gz --strip-components=1 -C $PMA_ROOT
66+
rm /tmp/phpmyadmin.tar.gz
67+
cp $PMA_ROOT/config.sample.inc.php $PMA_ROOT/config.inc.php
68+
sed -i "/\['AllowNoPassword'\] = false/a \$cfg['Servers'][\$i]['host'] = 'mysql';" $PMA_ROOT/config.inc.php
69+
70+
# --- 6. Apply Codespaces Host Fix ---
71+
# This ensures Joomla generates correct URLs when accessed through the forwarded port.
72+
echo "--> Applying Codespaces URL fix..."
73+
cat > "${JOOMLA_ROOT}/fix.php" << 'EOF'
74+
<?php
75+
// Fix for incorrect host when running behind the Codespaces reverse proxy.
76+
if (isset($_SERVER['HTTP_HOST']) && str_contains($_SERVER['HTTP_HOST'], 'localhost')) {
77+
if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
78+
$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
79+
$_SERVER['SERVER_NAME'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
80+
}
81+
}
82+
EOF
83+
84+
# Include fix in both entry points
85+
sed -i '2i require_once __DIR__ . "/fix.php";' $JOOMLA_ROOT/index.php
86+
sed -i '2i require_once __DIR__ . "/../fix.php";' $JOOMLA_ROOT/administrator/index.php
87+
88+
echo "--> Ignoring local changes..."
89+
# For TRACKED files, tell Git to stop watching them for changes
90+
git update-index --assume-unchanged "index.php"
91+
git update-index --assume-unchanged "administrator/index.php"
92+
git update-index --assume-unchanged "package-lock.json"
93+
git update-index --assume-unchanged "tests/System/integration/install/Installation.cy.js"
94+
git update-index --assume-unchanged "tests/System/support/commands/config.mjs"
95+
96+
# For NEW UNTRACKED files, add them to the local exclude file
97+
echo "cypress.config.js" >> ".git/info/exclude"
98+
echo "fix.php" >> ".git/info/exclude"
99+
echo "phpmyadmin" >> ".git/info/exclude"
100+
echo "codespace-details.txt" >> ".git/info/exclude"
101+
102+
# --- 7. Finalize Permissions and Testing Tools ---
103+
echo "--> Setting up file permissions and Cypress..."
104+
sed -i \
105+
-e "/\/\/ If exists, delete PHP configuration file to force a new installation/d" \
106+
-e "/cy.task('deleteRelativePath', 'configuration.php');/d" \
107+
-e "/cy.installJoomla(config);/d" \
108+
tests/System/integration/install/Installation.cy.js
109+
sed -i "s/return cy.task('writeRelativeFile', { path: 'configuration.php', content });/return cy.task('writeRelativeFile', { path: 'configuration.php', content, mode: 0o775 });/" tests/System/support/commands/config.mjs
110+
111+
# Ensure Cypress is executable and owned by the web server user
112+
chmod +x ./node_modules/.bin/cypress
113+
cp cypress.config.dist.mjs cypress.config.js
114+
npx cypress install
115+
sed -i -e "s|baseUrl:.*|baseUrl: 'https://localhost',|" -e "s/db_host: 'localhost'/db_host: 'mysql'/g" -e "s/db_user: 'root'/db_user: 'joomla_ut'/g" -e "s/db_password: ''/db_password: 'joomla_ut'/g" cypress.config.js
116+
117+
# Restart Apache to apply all changes
118+
echo '<Directory /workspaces/joomla-cms>
119+
AllowOverride All
120+
Require all granted
121+
</Directory>' | sudo tee -a /etc/apache2/apache2.conf
122+
service apache2 restart
123+
124+
# Set the group to www-data and enforce group permissions
125+
echo "--> Applying final group ownership and permissions..."
126+
chgrp -R www-data $JOOMLA_ROOT
127+
chmod -R g+rws $JOOMLA_ROOT
128+
129+
echo "✅ Environment finalized."
130+
131+
# --- 8. Display Setup Details ---
132+
# Save the details to a file for easy reference.
133+
DETAILS_FILE="${JOOMLA_ROOT}/codespace-details.txt"
134+
{
135+
echo ""
136+
echo "---"
137+
echo "🚀 Joomla Core development environment is ready! 🚀"
138+
echo ""
139+
echo "This information has been saved to codespace-details.txt"
140+
echo ""
141+
echo "Joomla Admin Login:"
142+
echo " URL: Open the 'Ports' tab, find the 'Web Server' (443), and click the Globe icon. Then add /administrator"
143+
echo " Username: $ADMIN_USER"
144+
echo " Password: $ADMIN_PASS"
145+
echo ""
146+
echo "phpMyAdmin Login:"
147+
echo " URL: Open the 'Web Server' port and add /phpmyadmin"
148+
echo " Username: $DB_USER"
149+
echo " Password: $DB_PASS"
150+
echo ""
151+
echo "Cypress E2E Testing:"
152+
echo " Run interactive tests: npx cypress open"
153+
echo " Run headless tests: npx cypress run"
154+
echo ""
155+
echo "Xdebug for PHP Debugging:"
156+
echo " Xdebug is pre-configured on port 9003. Use the 'Run and Debug' panel in VS Code and select 'Listen for Xdebug'."
157+
echo "---"
158+
} | tee "$DETAILS_FILE"

.devcontainer/xdebug.ini

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[xdebug]
2+
zend_extension=xdebug
3+
xdebug.mode=debug
4+
xdebug.log_level = 0
5+
xdebug.start_with_request=yes
6+
xdebug.client_port=9003
7+
xdebug.client_host=localhost

0 commit comments

Comments
 (0)