Fix #314: Make Setback Temperature and Setback hours per day truly optional #1125
This file contains hidden or 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: Test, build, & deploy | |
| on: | |
| push: | |
| branches: | |
| - main | |
| - gha-deployment | |
| - dev | |
| pull_request: {} | |
| workflow_dispatch: | |
| env: | |
| rules-engine-working-directory: python | |
| heat-stack-working-directory: heat-stack | |
| defaults: | |
| run: | |
| working-directory: env.heat-stack-working-directory | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| permissions: | |
| actions: write | |
| contents: read | |
| jobs: | |
| lint_rules_engine: | |
| name: Rules Engine - Lint | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| python-version: ["3.13"] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up environment | |
| uses: "./.github/actions/setup-rules-engine" | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| working-directory: ${{ env.rules-engine-working-directory }} | |
| - name: Check style | |
| run: | | |
| make lint | |
| working-directory: ${{ env.rules-engine-working-directory }} | |
| make-rules-engine-package: | |
| name: Rules Engine - Mypy | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| python-version: ["3.13"] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up environment | |
| uses: "./.github/actions/setup-rules-engine" | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| working-directory: ${{ env.rules-engine-working-directory }} | |
| - name: Check typing | |
| run: | | |
| make mypy | |
| working-directory: ${{ env.rules-engine-working-directory }} | |
| pytest-rules-engine: | |
| name: Rules Engine - Pytest | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| python-version: ["3.13"] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up environment | |
| uses: "./.github/actions/setup-rules-engine" | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| working-directory: ${{ env.rules-engine-working-directory }} | |
| - name: Run tests | |
| run: | | |
| make test | |
| working-directory: ${{ env.rules-engine-working-directory }} | |
| # Make the wheel | |
| build-rules-engine: | |
| name: Rules Engine - Build | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| python-version: ["3.13"] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up environment | |
| uses: "./.github/actions/setup-rules-engine" | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| working-directory: ${{ env.rules-engine-working-directory }} | |
| - name: Install uv | |
| run: | | |
| pip install uv | |
| working-directory: ${{ env.rules-engine-working-directory }} | |
| - name: Build wheel | |
| run: | | |
| uv build | |
| working-directory: ${{ env.rules-engine-working-directory }} | |
| - name: Store wheel as artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: python-rules-engine-wheel | |
| path: ${{ env.rules-engine-working-directory }}/dist/ | |
| - name: Pull Built Wheel Artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: python-rules-engine-wheel | |
| path: ${{ env.heat-stack-working-directory }}/public/pyodide-env/ | |
| # Heat-Stack Jobs | |
| lint-js: | |
| name: ⬣ Heat-Stack - ESLint | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: ⎔ Setup node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| - name: 📥 Download deps | |
| uses: bahmutov/npm-install@v1 | |
| with: | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| - name: 🔬 Lint | |
| run: npm run lint | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| format-js: | |
| name: ⬣ Heat-Stack - Prettier | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: ⎔ Setup node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| - name: 📥 Download deps | |
| uses: bahmutov/npm-install@v1 | |
| with: | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| - name: 🔬 Format | |
| run: npm run format:check | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| typecheck-js: | |
| name: ʦ Heat-Stack - TypeScript | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: ⎔ Setup node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| - name: 📥 Download deps | |
| uses: bahmutov/npm-install@v1 | |
| with: | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| - name: 🏄 Copy test env vars | |
| run: cp .env.example .env | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| - name: 🖼 Build icons | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| run: npm run build:icons | |
| - name: 🛠 Setup Database | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| run: npx prisma migrate deploy && npx prisma generate --sql | |
| - name: 🔎 Type check | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| run: npm run typecheck --if-present | |
| vitest-pyodide-js: | |
| name: ⚡ Heat-Stack - Vitest pyodide.test.ts | |
| runs-on: ubuntu-22.04 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: ⎔ Setup node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| - name: 📥 Download deps | |
| uses: bahmutov/npm-install@v1 | |
| with: | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| - name: 🏄 Copy test env vars | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| run: cp .env.example .env | |
| - name: 🖼 Build icons | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| run: npm run build:icons | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v6 | |
| with: | |
| # Optional: specify uv version | |
| version: "latest" | |
| # Optional: enable caching (default is true) | |
| enable-cache: true | |
| - name: ⚡ Run vitest (restore to run test after epic-web v7 upgrade) | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| run: npm run test-pyodide | |
| # --coverage | |
| playwright: | |
| name: 🎭 Playwright | |
| runs-on: ubuntu-22.04 | |
| timeout-minutes: 60 | |
| # CORS proxy settings for geocoding API calls | |
| env: | |
| VITE_CORS_PROXY_URL: ${{ secrets.VITE_CORS_PROXY_URL }} | |
| VITE_CORS_ORIGIN: ${{ secrets.VITE_CORS_ORIGIN }} | |
| steps: | |
| - name: ⬇️ Checkout repo | |
| uses: actions/checkout@v4 | |
| - name: 🏄 Copy test env vars | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| run: cp .env.example .env | |
| - name: ⎔ Setup node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| - name: 📥 Download deps | |
| uses: bahmutov/npm-install@v1 | |
| with: | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| - name: 📥 Install Playwright Browsers | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| run: npm run test:e2e:install | |
| - name: 🛠 Setup Database | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| run: npx prisma migrate deploy && npx prisma generate --sql | |
| - name: 🏦 Cache Database | |
| id: db-cache | |
| uses: actions/cache@v4 | |
| with: | |
| path: prisma/data.db | |
| key: | |
| db-cache-schema_${{ hashFiles('./prisma/schema.prisma') | |
| }}-migrations_${{ hashFiles('./prisma/migrations/*/migration.sql') | |
| }} | |
| - name: 🌱 Seed Database | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| if: steps.db-cache.outputs.cache-hit != 'true' | |
| run: npx prisma migrate reset --force | |
| - name: Pull Built Wheel Artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: python-rules-engine-wheel | |
| path: ${{ env.heat-stack-working-directory }}/public/pyodide-env/ | |
| - name: 🏗 Build | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| run: npm run build | |
| - name: 🎭 Playwright tests | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| run: npx playwright test | |
| - name: 📊 Upload report | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: playwright-report | |
| path: ${{ env.heat-stack-working-directory }}/playwright-report/ | |
| retention-days: 30 | |
| deploy-to-servers: | |
| name: 🚀 Heat-Stack - Deploy | |
| runs-on: ubuntu-22.04 | |
| needs: [lint-js, format-js, typecheck-js, vitest-pyodide-js , playwright] | |
| # only build/deploy main branch on pushes | |
| if: | |
| ${{ (github.ref == 'refs/heads/gha-deployment' || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev') && | |
| github.event_name == 'push' }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: '50' | |
| - name: 👀 Read app name | |
| uses: SebRollen/toml-action@v1.2.0 | |
| id: app_name | |
| with: | |
| file: '${{ env.heat-stack-working-directory }}/fly.toml' | |
| field: 'app' | |
| # move Dockerfile to root | |
| - name: 🚚 Move Dockerfile | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| run: | | |
| mv ./other/Dockerfile ./Dockerfile | |
| mv ./other/.dockerignore ./.dockerignore | |
| - name: Pull Built Wheel Artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: python-rules-engine-wheel | |
| path: ${{ env.heat-stack-working-directory }}/public/pyodide-env/ | |
| - name: 🎈 Setup Fly | |
| uses: superfly/flyctl-actions/setup-flyctl@1.5 | |
| - name: 🚀 Deploy Staging | |
| if: ${{ github.ref == 'refs/heads/dev' }} | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| run: | |
| flyctl deploy --remote-only --build-arg COMMIT_SHA=${{ github.sha }} | |
| --app ${{ steps.app_name.outputs.value }}-staging | |
| env: | |
| FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} | |
| - name: 🚀 Deploy Production | |
| if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/gha-deployment' }} | |
| working-directory: ${{ env.heat-stack-working-directory }} | |
| run: | |
| flyctl deploy --remote-only --build-arg COMMIT_SHA=${{ github.sha }} | |
| env: | |
| FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} |