-
Notifications
You must be signed in to change notification settings - Fork 3
191 lines (165 loc) · 7.5 KB
/
visual.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
on:
pull_request:
types: [opened, reopened, synchronize, ready_for_review]
paths-ignore:
- '**.md'
branches-ignore:
- 'renovate/**'
push:
branches:
- main
name: Visual regression tests
# The concurrency group is used to make sure only one visual regression test
# can be run at a time. Running multiple tests in parallel can cause a race
# condition with GitHub Pages deployments.
# Due to GitHub's limitation, only one test suite can be queued and run at
# a time; any additional run will be canceled automatically and must be
# re-started manually.
concurrency:
group: visual-regression
jobs:
tests:
# Don't run tests against Draft pull requests.
if: github.event.pull_request.draft == false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set variables
run: echo "DRUPAL_ROOT=$HOME/drupal" >> $GITHUB_ENV
- name: Parse $THEME_NAME from composer.json
run: echo "THEME_NAME=$(cat composer.json | jq -r .name | awk -F/ '{print $NF}')" >> $GITHUB_ENV
- name: Set theme folder
run: echo "THEME_FOLDER=$DRUPAL_ROOT/public/themes/contrib/$THEME_NAME" >> $GITHUB_ENV
- name: Update
run: sudo apt update
- name: Clone platform
run: |
git clone --depth=1 https://github.com/City-of-Helsinki/drupal-helfi-platform.git $DRUPAL_ROOT
rm -rf $DRUPAL_ROOT/.git
- name: Install and start Stonehenge
run: |
git clone -b 4.x https://github.com/druidfi/stonehenge.git ~/stonehenge
cd ~/stonehenge && make up
- name: Build project
working-directory: ${{ env.DRUPAL_ROOT }}
env:
COMPOSER_MIRROR_PATH_REPOS: 1
run: |
composer config repositories.5 path $GITHUB_WORKSPACE
composer require drupal/redis drupal/$THEME_NAME -W
# We use COMPOSER_MIRROR_PATH_REPOS=1 to mirror local repository
# instead of symlinking it to make sure the code is available inside
# the app container.
cp -r $GITHUB_WORKSPACE/.git $THEME_FOLDER/
# Store the files folder in cache, so we don't have to install Drupal from
# scratch every time.
# You can force new re-installation by manually deleting the Actions cache.
- name: Restore files folder
id: drupal-cache
uses: actions/cache@v4
with:
path: ${{ env.DRUPAL_ROOT }}/public/sites/default/files
key: drupal-cache
- name: Prepare Drupal setup
working-directory: ${{ env.DRUPAL_ROOT }}
run: |
mkdir public/sites/default/files/styles -p && \
chmod 777 public/sites/default -R
# Start the project using Docker compose and wait until the database server
# is up.
- name: Start the project
working-directory: ${{ env.DRUPAL_ROOT }}
run: |
docker compose up -d --wait
for i in {1..5}; do docker compose exec app bash \
-c "drush sqlq 'SHOW TABLES;' -q" && break || sleep 5; done
# Install the site from existing dump if the cache restoration was successful.
- name: Install Drupal from existing dump
working-directory: ${{ env.DRUPAL_ROOT }}
if: steps.drupal-cache.outputs.cache-hit == 'true'
run: |
docker compose exec app bash -c "mysql --user=drupal --password=drupal --database=drupal --host=db --port=3306 -A < /app/public/sites/default/files/latest.sql"
docker compose exec app bash -c "drush updb -y && drush cr"
# Install the site from scratch if we failed to restore the cache.
# Dump the database into the files folder, so we can speed up the
# installation process and install Drupal using that dump from now on.
- name: Install Drupal from scratch
working-directory: ${{ env.DRUPAL_ROOT }}
if: steps.drupal-cache.outputs.cache-hit != 'true'
run: |
docker compose exec app bash -c "drush si minimal -y"
docker compose exec app bash -c "drush en redis -y"
docker compose exec app bash -c "drush en helfi_test_content -y"
docker compose exec app bash -c "drush sql-dump --result-file=/app/public/sites/default/files/latest.sql"
- uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
- name: NPM Install
working-directory: ${{ env.THEME_FOLDER }}
run: |
npm install
# Reference images are stored as Actions artifact, attempt to restore
# the images.
- name: Restore bitmaps
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
working-directory: ${{ env.THEME_FOLDER }}
run: gh run download -n bitmaps -D backstop/full/bitmaps_reference || true
# Generate new reference images if:
# - Something is merged into the main branch.
# - Reference images do not exist yet
# - Pull request has 'recreate-reference-images' label.
- name: Evaluate if we should re-create reference images
id: evaluate-reference-images
if: |
contains( github.event.pull_request.labels.*.name, 'recreate-reference-images') ||
hashFiles('backstop/full/bitmaps_reference/') != '' ||
github.ref == 'refs/heads/main'
run: echo "generate-references=true" >> $GITHUB_OUTPUT
- name: Generate new reference images
working-directory: ${{ env.THEME_FOLDER }}
if: steps.evaluate-reference-images.outputs.generate-references == 'true'
run: npm run full-reference
- uses: actions/upload-artifact@v4
if: steps.evaluate-reference-images.outputs.generate-references == 'true'
with:
name: bitmaps
path: ${{ env.THEME_FOLDER }}/backstop/full/bitmaps_reference
overwrite: true
compression-level: 0
- name: Run tests
working-directory: ${{ env.THEME_FOLDER }}
id: run-tests
# Skip tests if we generated reference images since the tests should never fail.
if: steps.evaluate-reference-images.outputs.generate-references != 'true'
run: |
if ! npm run full-test; then
echo "result=:warning: Visual regression found! Please check if this change is wanted or accidental. " >> $GITHUB_OUTPUT
else
echo "result=✅ Tests passed!" >> $GITHUB_OUTPUT
fi
echo "report_url=You can check the output here: https://city-of-helsinki.github.io/drupal-hdbt/pull/${{ github.event.pull_request.number }}/html_report/" >> $GITHUB_OUTPUT
- name: Deploy to PR preview
uses: peaceiris/actions-gh-pages@v4
if: steps.evaluate-reference-images.outputs.generate-references != 'true'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ${{ env.THEME_FOLDER }}/backstop/full
destination_dir: pull/${{github.event.number}}
- name: Update comment
if: steps.evaluate-reference-images.outputs.generate-references != 'true'
uses: thollander/actions-comment-pull-request@v3
with:
comment_tag: status
pr_number: ${{ github.event.number }}
message: "${{join(steps.run-tests.outputs.*, ' ')}}"
- name: Export container logs
working-directory: ${{ env.DRUPAL_ROOT }}
run: docker compose logs app > /tmp/container.log
- name: Upload container logs
uses: actions/upload-artifact@v4
if: always()
with:
name: container-log
path: /tmp/container.log
retention-days: 1