Skip to content

Music Analytics Project CI/CD #2536

Music Analytics Project CI/CD

Music Analytics Project CI/CD #2536

Workflow file for this run

---
name: Music Analytics Project CI/CD
# CI_ENVIRONMENT_CONTENT - Environment file content for the ci environment
# STAGE_ENVIRONMENT_CONTENT - Environment file content for the ci environment
# STAGE_VERCEL_CONFIG - Identify the Vercel Project and Organization
# PRODUCTION_ENVIRONMENT_CONTENT - Environment file content for the ci environment
# PRODUCTION_VERCEL_CONFIG - Identify the Vercel Project and Organization
# VERCEL_TOKEN - The authentication token used by Vercel
on:
push:
schedule:
- cron: "0 6 * * 1"
workflow_dispatch:
jobs:
configuration:
uses: cicd-tools-org/cicd-tools/.github/workflows/job-00-generic-read_json_file.yml@main
with:
JSON_FILE_PATH: ".github/config/workflows/workflow-push.json"
architecture:
needs: [configuration]
runs-on: ubuntu-latest
steps:
- name: Architecture Enforcement -- Checkout Repository
uses: actions/checkout@v3
- name: Architecture Enforcement -- Setup Environment
run: |
bash .github/scripts/step-setup-environment.sh
env:
WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
- name: Architecture Enforcement -- Install Toolbox
uses: ./.github/actions/action-00-toolbox
- name: Architecture Enforcement -- Run Global Enforcement Script
run: |
bash .github/scripts/architecture.sh
- name: Architecture Enforcement -- Report Job Status on Success
if: fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications == true
uses: ./.cicd-tools/boxes/active/ci/github/actions/action-00-generic-notification
with:
NOTIFICATION_EMOJI: ":heavy_check_mark:"
NOTIFICATION_MESSAGE: "Architecture enforcement checks have completed successfully!"
NOTIFICATION_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
- name: Architecture Enforcement -- Report Job Status
if: failure()
uses: ./.cicd-tools/boxes/active/ci/github/actions/action-00-generic-notification
with:
NOTIFICATION_EMOJI: ":x:"
NOTIFICATION_MESSAGE: "Achitecture enforcement checks have failed!"
NOTIFICATION_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
markdown_links:
needs: [configuration]
secrets:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-30-generic-markdown_links.yml@main
with:
CONFIG_FILE: ".github/config/actions/gaurav-nelson-github-action-markdown-link-check.json"
DOCUMENTATION_PATH: "."
VERBOSE_NOTIFICATIONS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications }}
build:
needs: [configuration]
secrets:
FILE_CONTENT: ${{ secrets.CI_ENVIRONMENT_CONTENT }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
ENV_SECRET_1: ${{ secrets.INTEGRATION_TEST_LAST_FM_KEY }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-40-npm-run_cached_command.yml@main
with:
ADDITIONAL_CACHE_PATHS: "~/.cache/Cypress"
COMMAND: coverage
COMMAND_NAME: Build Validation
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
PRE_COMMAND: echo "INTEGRATION_TEST_LAST_FM_KEY=${ENV_SECRET_1}" >> "${GITHUB_ENV}"
SECRET_CONTENT_FILENAME: .env.test
VERBOSE_NOTIFICATIONS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications }}
commit_lint:
needs: [configuration]
secrets:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-80-poetry-rev_range_command.yml@main
with:
COMMAND: |
poetry run cz check --rev-range "${PUSHED_COMMIT_REV_RANGE}"
COMMAND_NAME: "Commit Message Lint"
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
PYTHON_VERSIONS: ${{ toJSON(fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_python_versions) }}
REV_RANGE: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_commitizen_rev_range }}
VERBOSE_NOTIFICATIONS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications }}
commit_spell_check:
needs: [configuration]
secrets:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-80-poetry-rev_range_command.yml@main
with:
COMMAND: |
CICD_COMMIT_MESSAGES_FILE="$(mktemp XXXXXXXX.git_history_file)"
git log --pretty=format:%s "${PUSHED_COMMIT_REV_RANGE}" > "${CICD_COMMIT_MESSAGES_FILE}"
poetry run pre-commit run --hook-stage commit-msg spelling-commit-message --commit-msg-filename "${CICD_COMMIT_MESSAGES_FILE}"
COMMAND_NAME: "Commit Message Spelling"
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
PYTHON_VERSIONS: ${{ toJSON(fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_python_versions) }}
REV_RANGE: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_commit_spelling_rev_range }}
VERBOSE_NOTIFICATIONS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications }}
compilation:
needs: [configuration]
secrets:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-40-npm-run_cached_command.yml@main
with:
ADDITIONAL_CACHE_PATHS: "~/.cache/Cypress"
COMMAND: build:validators
COMMAND_NAME: Validator Build
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
POST_COMMAND: git diff --exit-code
VERBOSE_NOTIFICATIONS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications }}
deploy_stage:
if: github.ref == 'refs/heads/main'
needs: [configuration, success_notification]
secrets:
FILE_CONTENT: ${{ secrets.STAGE_ENVIRONMENT_CONTENT }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
ENV_SECRET_1: ${{ secrets.VERCEL_TOKEN }}
ENV_SECRET_2: ${{ secrets.STAGE_VERCEL_CONFIG }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-40-npm-run_cached_command.yml@main
with:
ADDITIONAL_CACHE_PATHS: "~/.cache/Cypress"
COMMAND: ci:vercel; vercel pull --yes --environment=production --token="${ENV_SECRET_1}"
COMMAND_NAME: Deploy to Stage
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
POST_COMMAND: vercel build --prod --token="${ENV_SECRET_1}" && vercel deploy --prebuilt --prod --token="${ENV_SECRET_1}"
PRE_COMMAND: mkdir -p .vercel && echo "${ENV_SECRET_2}" > .vercel/project.json
SECRET_CONTENT_FILENAME: .env.local
VERBOSE_NOTIFICATIONS: true
deploy_production:
if: github.ref == 'refs/heads/production'
needs: [configuration, success_notification]
secrets:
FILE_CONTENT: ${{ secrets.PRODUCTION_ENVIRONMENT_CONTENT }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
ENV_SECRET_1: ${{ secrets.VERCEL_TOKEN }}
ENV_SECRET_2: ${{ secrets.PRODUCTION_VERCEL_CONFIG }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-40-npm-run_cached_command.yml@main
with:
ADDITIONAL_CACHE_PATHS: "~/.cache/Cypress"
COMMAND: ci:vercel; vercel pull --yes --environment=production --token="${ENV_SECRET_1}"
COMMAND_NAME: Deploy to Production
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
POST_COMMAND: vercel build --prod --token="${ENV_SECRET_1}" && vercel deploy --prebuilt --prod --token="${ENV_SECRET_1}"
PRE_COMMAND: mkdir -p .vercel && echo "${ENV_SECRET_2}" > .vercel/project.json
SECRET_CONTENT_FILENAME: .env.local
VERBOSE_NOTIFICATIONS: true
json_schema_lint:
needs: [configuration]
secrets:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-80-poetry-precommit_commit_stage_hook.yml@master
with:
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
PRECOMMIT_HOOK_ID: "check-jsonschema"
PRECOMMIT_HOOK_NAME: "Workflow Config JSON Schema Linting"
PYTHON_VERSIONS: ${{ toJSON(fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_python_versions) }}
VERBOSE_NOTIFICATIONS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications }}
lint:
needs: [configuration]
secrets:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-40-npm-run_cached_command.yml@main
with:
ADDITIONAL_CACHE_PATHS: "~/.cache/Cypress"
COMMAND: lint
COMMAND_NAME: Linting
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
VERBOSE_NOTIFICATIONS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications }}
security_scan:
needs: [configuration]
secrets:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-10-generic-security_scan_credentials.yml@main
with:
EXTRA_BINARY_ARGS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_trufflehog_extra_scan_args }}
VERBOSE_NOTIFICATIONS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications }}
security_test:
needs: [configuration]
secrets:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-40-npm-run_cached_command.yml@main
with:
ADDITIONAL_CACHE_PATHS: "~/.cache/Cypress"
COMMAND: security
COMMAND_NAME: Dependency Scan
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
VERBOSE_NOTIFICATIONS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications }}
shellcheck_test:
needs: [configuration]
secrets:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
strategy:
fail-fast: true
matrix:
hook:
- id: "format-shell"
name: "Shell Formatting"
- id: "lint-shell"
name: "Shell Linting"
max-parallel: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-80-poetry-precommit_commit_stage_hook.yml@main
with:
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
PRECOMMIT_HOOK_ID: ${{ matrix.hook.id }}
PRECOMMIT_HOOK_NAME: ${{ matrix.hook.name }}
PYTHON_VERSIONS: ${{ toJSON(fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_python_versions) }}
VERBOSE_NOTIFICATIONS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications }}
smoke_tests_development:
needs: [configuration]
secrets:
FILE_CONTENT: ${{ secrets.CI_ENVIRONMENT_CONTENT }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-40-npm-run_cached_command.yml@main
with:
ADDITIONAL_CACHE_PATHS: "~/.cache/Cypress"
COMMAND: smoke:ci
COMMAND_NAME: Smoke Tests (Development)
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
PRE_COMMAND: |
npm run build
npm run start > development.server.log 2>&1 &
ERROR_COMMAND: cat development.server.log
SECRET_CONTENT_FILENAME: .env.local
VERBOSE_NOTIFICATIONS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications }}
smoke_tests_stage:
if: github.ref == 'refs/heads/main'
needs: [configuration, deploy_stage]
secrets:
FILE_CONTENT: ${{ secrets.STAGE_ENVIRONMENT_CONTENT }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-40-npm-run_cached_command.yml@main
with:
ADDITIONAL_CACHE_PATHS: "~/.cache/Cypress"
COMMAND: smoke:ci
COMMAND_NAME: Smoke Tests (Stage)
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
SECRET_CONTENT_FILENAME: .env.local
VERBOSE_NOTIFICATIONS: true
smoke_tests_production:
if: github.ref == 'refs/heads/production'
needs: [configuration, deploy_production]
secrets:
FILE_CONTENT: ${{ secrets.PRODUCTION_ENVIRONMENT_CONTENT }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-40-npm-run_cached_command.yml@main
with:
ADDITIONAL_CACHE_PATHS: "~/.cache/Cypress"
COMMAND: smoke:ci
COMMAND_NAME: Smoke Tests (Production)
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
SECRET_CONTENT_FILENAME: .env.local
VERBOSE_NOTIFICATIONS: true
start_notification:
secrets:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-00-generic-notification.yml@main
with:
NOTIFICATION_EMOJI: ":vertical_traffic_light:"
NOTIFICATION_MESSAGE: "Workflow has started!"
success_notification:
needs:
[
architecture,
build,
commit_lint,
commit_spell_check,
compilation,
json_schema_lint,
lint,
markdown_links,
security_scan,
security_test,
shellcheck_test,
smoke_tests_development,
start_notification,
toml_lint,
type_validation,
workflow_lint_test,
]
secrets:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-00-generic-notification.yml@main
with:
NOTIFICATION_EMOJI: ":checkered_flag:"
NOTIFICATION_MESSAGE: "All checks have completed successfully!"
toml_lint:
needs: [configuration]
secrets:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-80-poetry-precommit_commit_stage_hook.yml@main
with:
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
PRECOMMIT_HOOK_ID: "format-toml"
PRECOMMIT_HOOK_NAME: "TOML Formatting"
PYTHON_VERSIONS: ${{ toJSON(fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_python_versions) }}
VERBOSE_NOTIFICATIONS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications }}
type_validation:
needs: [configuration]
secrets:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-40-npm-run_cached_command.yml@main
with:
ADDITIONAL_CACHE_PATHS: "~/.cache/Cypress"
COMMAND: compile
COMMAND_NAME: Type Validation
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
VERBOSE_NOTIFICATIONS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications }}
workflow_lint_test:
needs: [configuration]
secrets:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
uses: cicd-tools-org/cicd-tools/.github/workflows/job-80-poetry-precommit_commit_stage_hook.yml@main
with:
CONCURRENCY: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_concurrency_limit }}
PRECOMMIT_HOOK_ID: "lint-github-workflow"
PRECOMMIT_HOOK_NAME: "Workflow Linting"
PYTHON_VERSIONS: ${{ toJSON(fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_python_versions) }}
VERBOSE_NOTIFICATIONS: ${{ fromJSON(needs.configuration.outputs.JSON_FILE_DATA).ci_verbose_notifications }}