ACMS-4373: Acquia Starter Kit Tour fix failing tests. #181
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: "Code Deployment (Acquia)" | |
on: | |
push: | |
branches: [ develop, main, ACMS-*, feature/* ] | |
workflow_dispatch: | |
inputs: | |
environment: | |
description: 'Choose environment' | |
type: choice | |
options: | |
- dev | |
- stage | |
- prod | |
- next | |
- ode1 | |
- ode2 | |
- ode3 | |
- ode4 | |
- ode5 | |
- ode6 | |
- ode7 | |
- ode8 | |
required: true | |
default: 'dev' | |
php-version: | |
description: 'Choose PHP Version' | |
type: choice | |
options: | |
- "8.1" | |
- "8.2" | |
- "8.3" | |
- "8.4" | |
required: true | |
default: '8.3' | |
drupal-core: | |
description: 'Choose Drupal Core Version.' | |
required: false | |
default: '^11' | |
download-latest-dependencies: | |
description: 'Download latest dependencies' | |
type: boolean | |
default: false | |
concurrency: | |
group: "ci-${{ github.ref }}" | |
cancel-in-progress: true | |
env: | |
GIT_AUTHOR_NAME: "CD" | |
GIT_COMMITTER_NAME: "CD" | |
GIT_COMMITTER_EMAIL: "no-reply@acquia.com" | |
GIT_AUTHOR_EMAIL: "no-reply@acquia.com" | |
PHP_VERSION: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.php-version || '8.3' }} | |
CORE_VERSION: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.drupal-core || '' }} | |
ACQUIA_CLOUD_ENVIRONMENT: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.environment || 'dev' }} | |
DOWNLOAD_LATEST_DEPENDENCIES: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.download-latest-dependencies || 'false' }} | |
jobs: | |
acquia_code_deployment: | |
if: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' }} | |
name: "Code Deployment" | |
runs-on: ubuntu-latest | |
environment: acquia_code_deployment | |
env: | |
ACQUIA_CLOUD_API_KEY: ${{ secrets.ACQUIA_CLOUD_API_KEY }} | |
ACQUIA_CLOUD_API_SECRET: ${{ secrets.ACQUIA_CLOUD_API_SECRET }} | |
ACQUIA_CLOUD_APPLICATION: ${{ secrets.ACQUIA_CLOUD_APPLICATION }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: shivammathur/setup-php@v2 | |
with: | |
php-version: ${{ env.PHP_VERSION }} | |
- name: Setup Drupal Project | |
run: | | |
# Download specific version of Drupal Core, if requested. | |
[ -n "${CORE_VERSION}" ] && echo composer require drupal/core:${CORE_VERSION} drupal/core-composer-scaffold:${CORE_VERSION} drupal/core-recommended:${CORE_VERSION} --no-install --no-update -n || true | |
# Move some of development dependencies to production dependencies or else acli push:artifact will fail. | |
composer require oomphinc/composer-installers-extender --no-install --no-update -n | |
if [ "${DOWNLOAD_LATEST_DEPENDENCIES}" == "true" ]; then | |
rm composer.lock | |
composer install | |
else | |
# Update specific version of Drupal Core, if requested or else simply install all dependencies. | |
if [ -n "${CORE_VERSION}" ]; then | |
composer update "drupal/core-*" drush/drush "drupal/*" -W --with=drupal/core:${CORE_VERSION} --minimal-changes | |
else | |
# In CI, we don't need to run composer install again, as it's already will be done by below command. | |
composer update oomphinc/composer-installers-extender | |
fi | |
fi | |
# Include MySQL 5.7 connection settings, before DRS require line is added. | |
echo "require DRUPAL_ROOT . '/modules/contrib/mysql57/settings.inc';" >> docroot/sites/default/settings.php | |
# Download acquia/drupal-recommended-settings plugin & drupal/mysql57 library. | |
composer require acquia/drupal-recommended-settings:^1.1 drupal/mysql57 | |
# Update .gitignore file, otherwise acli won't push any settings file. | |
sed -i 's/docroot\//docroot\/core/' .gitignore | |
cat .github/cd.gitignore >> .gitignore 2>/dev/null | |
# Create symlink directory for multisite headless and community. | |
cd docroot/sites | |
ln -s default headless | |
ln -s default community | |
cd - | |
git add . && git commit -m "Update drupal core and it's dependencies." 2>/dev/null | |
- name: Setup Acquia CLI | |
run: | | |
curl -OL https://github.com/acquia/cli/releases/latest/download/acli.phar | |
chmod +x acli.phar | |
mv acli.phar /usr/local/bin/acli | |
acli --version | |
acli auth:login --key=${ACQUIA_CLOUD_API_KEY} --secret=${ACQUIA_CLOUD_API_SECRET} -n | |
ACQUIA_APPLICATION_UUID=$(acli api:applications:find ${ACQUIA_CLOUD_APPLICATION} -n | jq -r '.uuid') | |
acli link ${ACQUIA_APPLICATION_UUID} -n | |
acli remote:aliases:download -n | |
git add . && git commit -m "Added acli & drush alias configurations." 2>/dev/null | |
- name: Find & Switch PHP Version | |
run: | | |
# Find the PHP version. | |
ENV_PHP_VERSION=$(acli api:environments:find ${ACQUIA_CLOUD_APPLICATION}.${ACQUIA_CLOUD_ENVIRONMENT} -n | jq -r '.configuration.php.version') | |
echo "The CI php-version: ${PHP_VERSION}" | |
echo "The Acquia Cloud environment php-version: $ENV_PHP_VERSION" | |
# If PHP_VERSION is NOT the same as the one we want to switch to. Then switch PHP version. | |
if [ "${ENV_PHP_VERSION}" != "${PHP_VERSION}" ]; then | |
echo "Switching PHP version to ${PHP_VERSION}" | |
acli api:environments:update ${ACQUIA_CLOUD_APPLICATION}.${ACQUIA_CLOUD_ENVIRONMENT} --lang_version=${PHP_VERSION} -n | |
sleep 10 | |
fi | |
- name: Configure SSH keys | |
run: | | |
mkdir -p ~/.ssh | |
echo "${ACQUIA_CLOUD_SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa | |
chmod 600 ~/.ssh/id_rsa | |
eval `ssh-agent -s` | |
ssh-add ~/.ssh/id_rsa | |
SSH_URL=$(acli api:environments:find ${ACQUIA_CLOUD_APPLICATION}.${ACQUIA_CLOUD_ENVIRONMENT} -n | jq -r '.ssh_url' | awk -F'[@:]' '{print $2}') | |
GIT_URL=$(acli api:environments:find ${ACQUIA_CLOUD_APPLICATION}.${ACQUIA_CLOUD_ENVIRONMENT} -n | jq -r '.vcs.url' | awk -F'[@:]' '{print $2}') | |
ssh-keyscan "${SSH_URL}" >> ~/.ssh/known_hosts && ssh-keyscan "${GIT_URL}" >> ~/.ssh/known_hosts | |
shell: bash | |
env: | |
ACQUIA_CLOUD_SSH_PRIVATE_KEY: ${{ secrets.ACQUIA_CLOUD_SSH_PRIVATE_KEY }} | |
- name: Deploy & Switch Code | |
shell: bash | |
run: | | |
BRANCH_TO_DEPLOY=acli-${GITHUB_REF_NAME} | |
# Push changes on Acuia Cloud. | |
acli push:artifact ${ACQUIA_CLOUD_APPLICATION}.${ACQUIA_CLOUD_ENVIRONMENT} --destination-git-branch=${BRANCH_TO_DEPLOY} -n | |
# If the event is push and branch is develop or if CI is triggered manually, then only switch code. | |
if [[ "${GITHUB_EVENT_NAME}" == "push" && "${GITHUB_REF_NAME}" == "develop" ]] || [[ "${GITHUB_EVENT_NAME}" == "workflow_dispatch" ]]; then | |
DEPLOYED_BRANCH=$(acli api:environments:find ${ACQUIA_CLOUD_APPLICATION}.${ACQUIA_CLOUD_ENVIRONMENT} -n | jq -r '.vcs.path') | |
# If BRANCH_TO_DEPLOY is NOT the same as DEPLOYED_BRANCH. Then switch code. | |
if [ "${BRANCH_TO_DEPLOY}" != "${DEPLOYED_BRANCH}" ]; then | |
# Step 1: Run the code:switch command and capture its output. | |
response=$(acli api:environments:code-switch ${ACQUIA_CLOUD_APPLICATION}.${ACQUIA_CLOUD_ENVIRONMENT} ${BRANCH_TO_DEPLOY} -n) | |
# Step 2: Extract the notification ID from the JSON response | |
notification_id=$(echo "$response" | jq -r '.notification') | |
# Step 3: Check if the notification ID was successfully extracted. | |
if [[ -z "$notification_id" ]]; then | |
echo "Error: Notification ID not found in the response." | |
exit 1 | |
fi | |
progress=0 | |
timeout=1800 # Timeout in seconds (30 minutes). | |
start_time=$(date +%s) # Get the current time in seconds | |
echo "Please wait while code is being switched..." | |
# Step 4: Poll the notification status until progress reaches 100. | |
while [[ "$progress" -lt 100 ]]; do | |
# Run the notification find command. | |
notification_response=$(acli api:notifications:find "$notification_id" -n) | |
# Extract the progress value. | |
progress=$(echo "$notification_response" | jq -r '.progress') | |
# Display current progress. | |
#echo "Current progress: $progress%" | |
# Check if we've exceeded the timeout (5 minutes). | |
current_time=$(date +%s) | |
elapsed_time=$((current_time - start_time)) | |
if [[ "$elapsed_time" -ge "$timeout" ]]; then | |
# Calculate minutes and seconds. | |
minutes=$((elapsed_time / 60)) | |
seconds=$((elapsed_time % 60)) | |
echo "Error: Timeout reached after $minutes minute(s) and $seconds second(s). Progress did not reach 100%." | |
exit 1 | |
fi | |
# Wait for 5 seconds before polling again. | |
sleep 5 | |
done | |
fi | |
fi |