|
11 | 11 | required: true |
12 | 12 | type: string |
13 | 13 | description: 'Playwright project name to run' |
14 | | - multisite: |
15 | | - required: false |
16 | | - type: boolean |
17 | | - default: false |
18 | | - description: 'If true, convert the site to multisite and create a subsite.' |
19 | 14 |
|
20 | 15 | jobs: |
21 | 16 | playwright-test: |
22 | 17 | name: Playwright tests (${{ inputs.test-mode == 'default' && 'Default Mode' || 'File-based Execution' }}) |
23 | 18 | runs-on: ubuntu-22.04 |
24 | | - services: |
25 | | - mysql: |
26 | | - image: mysql:8.0 |
27 | | - env: |
28 | | - MYSQL_DATABASE: wordpress |
29 | | - MYSQL_USER: wordpress |
30 | | - MYSQL_PASSWORD: wordpress |
31 | | - MYSQL_ROOT_PASSWORD: root |
32 | | - options: >- |
33 | | - --health-cmd="mysqladmin ping -h localhost -proot" |
34 | | - --health-interval=10s |
35 | | - --health-timeout=5s |
36 | | - --health-retries=10 |
37 | | -
|
38 | | - wordpress: |
39 | | - image: wordpress:php8.1-apache |
40 | | - env: |
41 | | - WORDPRESS_DB_HOST: mysql:3306 |
42 | | - WORDPRESS_DB_USER: wordpress |
43 | | - WORDPRESS_DB_PASSWORD: wordpress |
44 | | - WORDPRESS_DB_NAME: wordpress |
45 | | - WORDPRESS_DEBUG: 1 |
46 | | - WORDPRESS_CONFIG_EXTRA: | |
47 | | - define( 'FS_METHOD', 'direct' ); |
48 | | - define( 'WP_DEBUG_LOG', true ); |
49 | | - define( 'WP_DEBUG_DISPLAY', false ); |
50 | | - define( 'SCRIPT_DEBUG', true ); |
51 | | - define( 'WP_ENVIRONMENT_TYPE', 'local' ); |
52 | | - ports: |
53 | | - - 8888:80 |
54 | 19 | steps: |
55 | 20 | - name: Checkout source code |
56 | 21 | uses: actions/checkout@v4 |
@@ -90,153 +55,45 @@ jobs: |
90 | 55 | path: | |
91 | 56 | node_modules |
92 | 57 | src/vendor |
93 | | - key: ${{ runner.os }}-${{ inputs.test-mode }}-deps-${{ steps.deps-hash.outputs.deps_hash }}-${{ github.run_id }}-${{ github.job }} |
| 58 | + key: ${{ runner.os }}-deps-${{ steps.deps-hash.outputs.deps_hash }} |
94 | 59 | restore-keys: | |
95 | | - ${{ runner.os }}-${{ inputs.test-mode }}-deps-${{ steps.deps-hash.outputs.deps_hash }}- |
| 60 | + ${{ runner.os }}-deps- |
96 | 61 |
|
97 | | - - name: Install workflow dependencies |
98 | | - if: steps.deps-cache.outputs.cache-matched-key == '' |
| 62 | + - name: Install workflow dependencies (wp-env, playwright) |
| 63 | + if: steps.deps-cache.outputs.cache-hit != 'true' |
99 | 64 | run: npm run prepare-environment:ci && npm run bundle |
100 | 65 |
|
101 | 66 | - name: Save vendor and node_modules cache |
102 | | - if: steps.deps-cache.outputs.cache-matched-key == '' |
| 67 | + if: steps.deps-cache.outputs.cache-hit != 'true' |
103 | 68 | uses: actions/cache/save@v4 |
104 | 69 | with: |
105 | 70 | path: | |
106 | 71 | src/vendor |
107 | 72 | node_modules |
108 | | - key: ${{ steps.deps-cache.outputs.cache-primary-key }} |
| 73 | + key: ${{ runner.os }}-deps-${{ steps.deps-hash.outputs.deps_hash }} |
109 | 74 |
|
110 | | - - name: Wait for WordPress to be reachable |
111 | | - run: | |
112 | | - for i in $(seq 1 60); do |
113 | | - if curl -fsS http://localhost:8888/wp-login.php >/dev/null; then |
114 | | - echo "WordPress is reachable." |
115 | | - exit 0 |
116 | | - fi |
117 | | - echo "Waiting for WordPress... ($i/60)" |
118 | | - sleep 2 |
119 | | - done |
120 | | -
|
121 | | - echo "WordPress did not start in time." |
122 | | - echo "::group::WordPress container logs" |
123 | | - docker logs "${{ job.services.wordpress.id }}" || true |
124 | | - echo "::endgroup::" |
125 | | - exit 1 |
126 | | -
|
127 | | - - name: Download WP-CLI |
128 | | - run: | |
129 | | - curl -fsSL -o "${RUNNER_TEMP}/wp-cli.phar" https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar |
130 | | -
|
131 | | - - name: "Install WordPress: ${{ inputs.multisite && 'Multisite' || 'Single Site' }}" |
132 | | - env: |
133 | | - WP_CONTAINER: ${{ job.services.wordpress.id }} |
134 | | - WP_URL: http://localhost:8888 |
135 | | - WP_ADMIN_USER: admin |
136 | | - WP_ADMIN_PASSWORD: password |
137 | | - WP_ADMIN_EMAIL: admin@example.org |
| 75 | + - name: Start WordPress environment |
138 | 76 | run: | |
139 | | - set -euo pipefail |
140 | | -
|
141 | | - docker cp "${RUNNER_TEMP}/wp-cli.phar" "$WP_CONTAINER:/tmp/wp-cli.phar" |
142 | | -
|
143 | | - # Install WordPress if it isn't already installed. |
144 | | - if ! docker exec -u root -w /var/www/html "$WP_CONTAINER" php /tmp/wp-cli.phar core is-installed --allow-root >/dev/null 2>&1; then |
145 | | - docker exec -u root -w /var/www/html "$WP_CONTAINER" php /tmp/wp-cli.phar core install \ |
146 | | - --url="$WP_URL" \ |
147 | | - --title="Test Blog" \ |
148 | | - --admin_user="$WP_ADMIN_USER" \ |
149 | | - --admin_password="$WP_ADMIN_PASSWORD" \ |
150 | | - --admin_email="$WP_ADMIN_EMAIL" \ |
151 | | - --skip-email \ |
152 | | - --allow-root |
153 | | - fi |
154 | | -
|
155 | | - if [ "${{ inputs.multisite }}" = "true" ]; then |
156 | | - # Convert single site -> multisite (subdirectory). Subdomains don't work with localhost. |
157 | | - if ! docker exec -u root -w /var/www/html "$WP_CONTAINER" php /tmp/wp-cli.phar core is-installed --network --allow-root >/dev/null 2>&1; then |
158 | | - docker exec -u root -w /var/www/html "$WP_CONTAINER" php /tmp/wp-cli.phar core multisite-convert \ |
159 | | - --title="Test Network" \ |
160 | | - --base=/ \ |
161 | | - --allow-root |
162 | | - fi |
163 | | -
|
164 | | - # Create a subsite for future multisite test coverage. |
165 | | - if ! docker exec -u root -w /var/www/html "$WP_CONTAINER" php /tmp/wp-cli.phar site list --field=path --allow-root | grep -qx "/subsite/"; then |
166 | | - docker exec -u root -w /var/www/html "$WP_CONTAINER" php /tmp/wp-cli.phar site create \ |
167 | | - --slug=subsite \ |
168 | | - --title="Subsite" \ |
169 | | - --email="$WP_ADMIN_EMAIL" \ |
170 | | - --allow-root |
171 | | - fi |
172 | | - fi |
173 | | -
|
174 | | - - name: Install plugin into WordPress container |
175 | | - env: |
176 | | - WP_CONTAINER: ${{ job.services.wordpress.id }} |
177 | | - run: | |
178 | | - set -euo pipefail |
179 | | -
|
180 | | - docker exec -u root -w /var/www/html "$WP_CONTAINER" rm -rf wp-content/plugins/code-snippets |
181 | | - docker cp src "$WP_CONTAINER:/var/www/html/wp-content/plugins/code-snippets" |
182 | | - docker exec -u root -w /var/www/html "$WP_CONTAINER" chown -R www-data:www-data wp-content/plugins/code-snippets |
| 77 | + npx wp-env start |
183 | 78 |
|
184 | 79 | - name: Activate code-snippets plugin |
185 | | - env: |
186 | | - WP_CONTAINER: ${{ job.services.wordpress.id }} |
187 | | - run: | |
188 | | - set -euo pipefail |
189 | | - if [ "${{ inputs.multisite }}" = "true" ]; then |
190 | | - docker exec -u root -w /var/www/html "$WP_CONTAINER" php /tmp/wp-cli.phar plugin activate code-snippets --network --allow-root |
191 | | - else |
192 | | - docker exec -u root -w /var/www/html "$WP_CONTAINER" php /tmp/wp-cli.phar plugin activate code-snippets --allow-root |
193 | | - fi |
| 80 | + run: npx wp-env run cli wp plugin activate code-snippets |
194 | 81 |
|
195 | 82 | - name: WordPress debug information |
196 | | - env: |
197 | | - WP_CONTAINER: ${{ job.services.wordpress.id }} |
198 | 83 | run: | |
199 | | - docker exec -u root -w /var/www/html "$WP_CONTAINER" php /tmp/wp-cli.phar core version --allow-root |
200 | | - docker exec -u root -w /var/www/html "$WP_CONTAINER" php /tmp/wp-cli.phar --allow-root --info |
201 | | -
|
202 | | - - name: Restore Playwright browsers cache |
203 | | - id: playwright-browsers-cache |
204 | | - uses: actions/cache/restore@v4 |
205 | | - with: |
206 | | - path: | |
207 | | - ~/.cache/ms-playwright |
208 | | - key: ${{ runner.os }}-playwright-browsers-${{ hashFiles('package-lock.json') }}-${{ github.run_id }}-${{ github.job }} |
209 | | - restore-keys: | |
210 | | - ${{ runner.os }}-playwright-browsers-${{ hashFiles('package-lock.json') }}- |
| 84 | + npx wp-env run cli wp core version |
| 85 | + npx wp-env run cli wp --info |
211 | 86 |
|
212 | 87 | - name: Install playwright/test |
213 | | - if: steps.playwright-browsers-cache.outputs.cache-matched-key == '' |
214 | 88 | run: | |
215 | 89 | npx playwright install chromium |
216 | 90 |
|
217 | | - - name: Save Playwright browsers cache |
218 | | - if: steps.playwright-browsers-cache.outputs.cache-matched-key == '' |
219 | | - uses: actions/cache/save@v4 |
220 | | - with: |
221 | | - path: | |
222 | | - ~/.cache/ms-playwright |
223 | | - key: ${{ steps.playwright-browsers-cache.outputs.cache-primary-key }} |
224 | | - |
225 | 91 | - name: Run Playwright tests |
226 | | - env: |
227 | | - WP_E2E_WPCLI_MODE: gh-actions-ci |
228 | | - WP_E2E_WPCLI_PHAR: /tmp/wp-cli.phar |
229 | | - WP_E2E_WPCLI_URL: http://localhost:8888 |
230 | | - WP_E2E_WP_CONTAINER: ${{ job.services.wordpress.id }} |
231 | | - WP_E2E_MULTISITE_MODE: ${{ inputs.multisite }} |
232 | 92 | run: npm run test:playwright -- --project=${{ inputs.project-name }} |
233 | | - |
234 | | - - name: Print WordPress logs on failure |
235 | | - if: failure() |
236 | | - run: | |
237 | | - echo "::group::WordPress container logs" |
238 | | - docker logs "${{ job.services.wordpress.id }}" || true |
239 | | - echo "::endgroup::" |
| 93 | + |
| 94 | + - name: Stop WordPress environment |
| 95 | + if: always() |
| 96 | + run: npx wp-env stop |
240 | 97 |
|
241 | 98 | - uses: actions/upload-artifact@v4 |
242 | 99 | if: always() |
|
0 commit comments