From 57df5e0c55afd33da1e3e9697aa0e230a19fc8de Mon Sep 17 00:00:00 2001 From: dorayx Date: Tue, 12 Sep 2023 03:28:12 +0800 Subject: [PATCH] feat(day06): bazel + vite + github action to deploy a static page --- .../npm_translate_lock_LTE4Nzc1MDcwNjU= | 5 +- .bazelignore | 1 + .github/workflows/github-pages.yml | 80 +++++++++++++++++++ README.md | 15 ++-- WORKSPACE.bazel | 1 + challenges/day-06/BUILD.bazel | 71 ++++++++++++++++ challenges/day-06/README.md | 36 +++++++++ challenges/day-06/index.html | 13 +++ challenges/day-06/package.json | 17 ++++ challenges/day-06/public/vite.svg | 1 + challenges/day-06/src/App.css | 45 +++++++++++ challenges/day-06/src/App.tsx | 35 ++++++++ challenges/day-06/src/assets/bazel.svg | 11 +++ challenges/day-06/src/assets/react.svg | 1 + challenges/day-06/src/index.css | 69 ++++++++++++++++ challenges/day-06/src/main.tsx | 10 +++ challenges/day-06/src/utils/add.ts | 12 +++ challenges/day-06/src/vite-env.d.ts | 1 + challenges/day-06/tests/setup.ts | 0 challenges/day-06/tests/tsconfig.json | 4 + challenges/day-06/tests/units/.gitkeep | 0 challenges/day-06/tsconfig.json | 25 ++++++ challenges/day-06/tsconfig.node.json | 10 +++ challenges/day-06/vite.config.ts | 21 +++++ pages/BUILD.bazel | 13 +++ pages/README.md | 12 +++ pnpm-lock.yaml | 16 ++++ pnpm-workspace.yaml | 3 +- tools/BUILD.bazel | 2 + 29 files changed, 520 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/github-pages.yml create mode 100644 challenges/day-06/BUILD.bazel create mode 100644 challenges/day-06/README.md create mode 100644 challenges/day-06/index.html create mode 100644 challenges/day-06/package.json create mode 100644 challenges/day-06/public/vite.svg create mode 100644 challenges/day-06/src/App.css create mode 100644 challenges/day-06/src/App.tsx create mode 100644 challenges/day-06/src/assets/bazel.svg create mode 100644 challenges/day-06/src/assets/react.svg create mode 100644 challenges/day-06/src/index.css create mode 100644 challenges/day-06/src/main.tsx create mode 100644 challenges/day-06/src/utils/add.ts create mode 100644 challenges/day-06/src/vite-env.d.ts create mode 100644 challenges/day-06/tests/setup.ts create mode 100644 challenges/day-06/tests/tsconfig.json create mode 100644 challenges/day-06/tests/units/.gitkeep create mode 100644 challenges/day-06/tsconfig.json create mode 100644 challenges/day-06/tsconfig.node.json create mode 100644 challenges/day-06/vite.config.ts create mode 100644 pages/BUILD.bazel create mode 100644 pages/README.md diff --git a/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU= b/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU= index 2f0205b..39f59ca 100644 --- a/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU= +++ b/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTE4Nzc1MDcwNjU= @@ -2,8 +2,9 @@ # Input hashes for repository rule npm_translate_lock(name = "npm", pnpm_lock = "//:pnpm-lock.yaml"). # This file should be checked into version control along with the pnpm-lock.yaml file. .npmrc=-2103660156 -pnpm-lock.yaml=-128733183 +pnpm-lock.yaml=-853535587 challenges/day-02/package.json=1560744658 challenges/day-04/package.json=1436213359 +challenges/day-06/package.json=189209422 package.json=-950038973 -pnpm-workspace.yaml=683860905 +pnpm-workspace.yaml=840565732 diff --git a/.bazelignore b/.bazelignore index f01882d..5eb0cf7 100644 --- a/.bazelignore +++ b/.bazelignore @@ -1,3 +1,4 @@ node_modules challenges/day-02/node_modules challenges/day-04/node_modules +challenges/day-06/node_modules diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml new file mode 100644 index 0000000..75350c1 --- /dev/null +++ b/.github/workflows/github-pages.yml @@ -0,0 +1,80 @@ +# Simple workflow for deploying static content to GitHub Pages +name: Deploy static content to Pages + +on: + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Single deploy job since we're just deploying + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install NodeJS + uses: actions/setup-node@v3 + with: + node-version-file: .nvmrc + + - name: Install pnpm + uses: pnpm/action-setup@v2 + with: + run_install: false + + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - name: Setup pnpm cache + uses: actions/cache@v3 + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install Bazelisk + uses: bazelbuild/setup-bazelisk@v2 + + - name: Setup bazel cache + uses: actions/cache@v3 + with: + path: "~/.cache/bazel" + key: bazel-linux + + - name: Install NodeJS dependencies + run: pnpm install + + - name: Build with Bazel + run: bazel build //tools:build_packages --runs_on=linux + + - name: Setup Pages + uses: actions/configure-pages@v3 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v2 + with: + # Upload entire repository + path: 'bazel-bin/pages/artifacts' + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 diff --git a/README.md b/README.md index 7b3812c..1c90689 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,14 @@ and the projects here are all experimental, not always complete and not producti I've tracked my practices in the table below: -| Day | Date | State | Challenge | Keywords | Demo | Source Code | -|:-----:|:-------------:|:-----:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:------------------------------|:----:|:----------------------------------------:| -| 01 | 3 Sep, 2023 | ✅ | ⚙️ Initialize this repository as a monorepo using Bazel for multi-language development, include a Rust program example and add a GitHub Action to test all the projects | Bazel, Rust | - | [challenges/day-01](./challenges/day-01) | -| 02 | 4 Sep, 2023 | ✅ | ⚙️ Integrate NodeJS + PNPM Workspace + React + TypeScript + Vite + Vitest with Bazel | Bazel, NodeJS, PNPM Workspace | - | [challenges/day-02](./challenges/day-02) | -| 03 | 6 Sep, 2023 | ✅ | 🍎 Create a macOS menu bar app with several menu items | Bazel, macOS App, Tray App | - | [challenges/day-03](./challenges/day-03) | -| 04 | 8 Sep, 2023 | ⚠️ | ⏰ Use CSS Scroll Snap to create a clock | CSS Scroll Snap | 🚧 | [challenges/day-04](./challenges/day-04) | -| 05 | 10 Sep, 2023 | ✅ | ⚙️ Integrate Go Workspace with Bazel | Bazel, Go Workspace | - | [challenges/day-05](./challenges/day-05) | +| Day | Date | State | Challenge | Keywords | Demo | Source Code | +|:-----:|:-------------:|:-----:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------|:------------:|:----------------------------------------:| +| 01 | 3 Sep, 2023 | ✅ | ⚙️ Initialize this repository as a monorepo using Bazel for multi-language development, include a Rust program example and add a GitHub Action to test all the projects | Bazel, Rust | - | [challenges/day-01](./challenges/day-01) | +| 02 | 4 Sep, 2023 | ✅ | ⚙️ Integrate NodeJS + PNPM Workspace + React + TypeScript + Vite + Vitest with Bazel | Bazel, NodeJS, PNPM Workspace | - | [challenges/day-02](./challenges/day-02) | +| 03 | 6 Sep, 2023 | ✅ | 🍎 Create a macOS menu bar app with several menu items | Bazel, macOS App, Tray App | - | [challenges/day-03](./challenges/day-03) | +| 04 | 8 Sep, 2023 | ⚠️ | ⏰ Use CSS Scroll Snap to create a clock | CSS Scroll Snap | 🚧 | [challenges/day-04](./challenges/day-04) | +| 05 | 10 Sep, 2023 | ✅ | ⚙️ Integrate Go Workspace with Bazel | Bazel, Go Workspace | - | [challenges/day-05](./challenges/day-05) | +| 06 | 11 Sep, 2023 | 🚧 | ⚙️ Deploy static HTML to GitHub Pages with Bazel + GitHub Action | Bazel, GitHub Pages, Static HTML | GitHub Pages | [challenges/day-06](./challenges/day-06) | - ✅: Completed - ⚠️: Need improvements diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index 65ae7a9..c7e363b 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -103,6 +103,7 @@ npm_translate_lock( data = [ "@//:challenges/day-02/package.json", "@//:challenges/day-04/package.json", + "@//:challenges/day-06/package.json", "@//:package.json", "@//:pnpm-workspace.yaml", ], diff --git a/challenges/day-06/BUILD.bazel b/challenges/day-06/BUILD.bazel new file mode 100644 index 0000000..ef4fae1 --- /dev/null +++ b/challenges/day-06/BUILD.bazel @@ -0,0 +1,71 @@ +load("@npm//:defs.bzl", "npm_link_all_packages") +load("@npm//:vite/package_json.bzl", vite_bin = "bin") +load("@npm//:vitest/package_json.bzl", vitest_bin = "bin") + +# This macro expands to a link_npm_package for each third-party package in package.json +# See https://docs.aspect.build/rules/aspect_rules_js/docs/pnpm +npm_link_all_packages(name = "node_modules") + +package(default_visibility = ["//visibility:public"]) + +filegroup( + name = "config", + srcs = [ + "index.html", + "package.json", + "tsconfig.json", + "tsconfig.node.json", + "vite.config.ts", + ], +) + +filegroup( + name = "vite_srcs_export", + srcs = glob(["src/**/*"]), + visibility = ["//visibility:public"], +) + +filegroup( + name = "vite_public_export", + srcs = glob(["public/**/*"]), + visibility = ["//visibility:public"], +) + +filegroup( + name = "vite_srcs_tests", + srcs = glob([ + "src/**/*.spec.ts", + "tests/**/*", + ]), + visibility = ["//visibility:public"], +) + +vite_bin.vite( + name = "build", + srcs = [ + ":config", + ":node_modules", + ":vite_public_export", + ":vite_srcs_export", + ], + args = ["build"], + chdir = package_name(), + out_dirs = ["canary"], + visibility = ["//visibility:public"], +) + +vitest_bin.vitest_test( + name = "ut_test", + args = [ + "run", + ], + chdir = package_name(), + data = [ + ":config", + ":node_modules", + ":vite_public_export", + ":vite_srcs_export", + ":vite_srcs_tests", + ], + visibility = ["//visibility:public"], +) diff --git a/challenges/day-06/README.md b/challenges/day-06/README.md new file mode 100644 index 0000000..8b47a1d --- /dev/null +++ b/challenges/day-06/README.md @@ -0,0 +1,36 @@ +# Day 06 + +## Challenge description + +Deploy static HTML to GitHub Pages with Bazel + GitHub Action. + +## Getting Started + +### Use PNPM to install dependencies + +```bash +pnpm install +``` + +### Use PNPM to develop + +```bash +pnpm --filter day-06 dev +``` + +### Use Bazel to build and test + +```bash +bazel build //challenges/day-06:build +bazel test //challenges/day-06:ut_test +``` + +## Build Assets + +- The output directory is `/canary` +- The public assets path is `/canary` + +## References + +- Doc: [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact) +- Doc: [aspect-build/bazel-lib - copy_to_directory](https://github.com/aspect-build/bazel-lib/blob/main/docs/copy_to_directory.md) diff --git a/challenges/day-06/index.html b/challenges/day-06/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/challenges/day-06/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/challenges/day-06/package.json b/challenges/day-06/package.json new file mode 100644 index 0000000..4fbe1e6 --- /dev/null +++ b/challenges/day-06/package.json @@ -0,0 +1,17 @@ +{ + "name": "day-06", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7" + } +} diff --git a/challenges/day-06/public/vite.svg b/challenges/day-06/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/challenges/day-06/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/challenges/day-06/src/App.css b/challenges/day-06/src/App.css new file mode 100644 index 0000000..858241b --- /dev/null +++ b/challenges/day-06/src/App.css @@ -0,0 +1,45 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo.bazel:hover { + filter: drop-shadow(0 0 2em #72ca71); +} +.logo.vite:hover { + filter: drop-shadow(0 0 2em rgba(100, 108, 255, 0.67)); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a .logo.react { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/challenges/day-06/src/App.tsx b/challenges/day-06/src/App.tsx new file mode 100644 index 0000000..e7f36cf --- /dev/null +++ b/challenges/day-06/src/App.tsx @@ -0,0 +1,35 @@ +import { useState } from 'react'; +import reactLogo from './assets/react.svg'; +import viteLogo from '/vite.svg'; +import bazelLogo from './assets/bazel.svg'; +import './App.css'; + +function App() { + const [count, setCount] = useState(0); + + return ( + <> +
+ + Bazel logo + + + Vite logo + + + React logo + +
+

Bazel + Vite + React

+
+ +

+ Edit src/App.tsx and save to test HMR +

+
+

Click on the Bazel, Vite and React logos to learn more

+ + ); +} + +export default App; diff --git a/challenges/day-06/src/assets/bazel.svg b/challenges/day-06/src/assets/bazel.svg new file mode 100644 index 0000000..ed5910e --- /dev/null +++ b/challenges/day-06/src/assets/bazel.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/challenges/day-06/src/assets/react.svg b/challenges/day-06/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/challenges/day-06/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/challenges/day-06/src/index.css b/challenges/day-06/src/index.css new file mode 100644 index 0000000..2c3fac6 --- /dev/null +++ b/challenges/day-06/src/index.css @@ -0,0 +1,69 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/challenges/day-06/src/main.tsx b/challenges/day-06/src/main.tsx new file mode 100644 index 0000000..3d7150d --- /dev/null +++ b/challenges/day-06/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/challenges/day-06/src/utils/add.ts b/challenges/day-06/src/utils/add.ts new file mode 100644 index 0000000..fa9020e --- /dev/null +++ b/challenges/day-06/src/utils/add.ts @@ -0,0 +1,12 @@ +export function add(...args: number[]) { + return args.reduce((a, b) => a + b, 0); +} + +if (import.meta.vitest) { + const { it, expect } = import.meta.vitest; + it('add', () => { + expect(add()).toBe(0); + expect(add(1)).toBe(1); + expect(add(1, 2, 3)).toBe(6); + }); +} diff --git a/challenges/day-06/src/vite-env.d.ts b/challenges/day-06/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/challenges/day-06/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/challenges/day-06/tests/setup.ts b/challenges/day-06/tests/setup.ts new file mode 100644 index 0000000..e69de29 diff --git a/challenges/day-06/tests/tsconfig.json b/challenges/day-06/tests/tsconfig.json new file mode 100644 index 0000000..84fa7fe --- /dev/null +++ b/challenges/day-06/tests/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.json", + "include": ["units"] +} diff --git a/challenges/day-06/tests/units/.gitkeep b/challenges/day-06/tests/units/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/challenges/day-06/tsconfig.json b/challenges/day-06/tsconfig.json new file mode 100644 index 0000000..a7fc6fb --- /dev/null +++ b/challenges/day-06/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/challenges/day-06/tsconfig.node.json b/challenges/day-06/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/challenges/day-06/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/challenges/day-06/vite.config.ts b/challenges/day-06/vite.config.ts new file mode 100644 index 0000000..1eb7cfc --- /dev/null +++ b/challenges/day-06/vite.config.ts @@ -0,0 +1,21 @@ +/// +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +// https://vitejs.dev/config/ +export default defineConfig({ + base: '/canary/', + plugins: [react()], + define: { + 'import.meta.vitest': 'undefined', + }, + build: { + outDir: 'canary', + }, + test: { + setupFiles: ['tests/setup.ts'], + // enable in-source testing to bring a closer feedback loop for development + // @see https://vitest.dev/guide/in-source.html + includeSource: ['src/**/*.{ts,tsx}'], + }, +}); diff --git a/pages/BUILD.bazel b/pages/BUILD.bazel new file mode 100644 index 0000000..682513b --- /dev/null +++ b/pages/BUILD.bazel @@ -0,0 +1,13 @@ +load("@aspect_bazel_lib//lib:copy_to_directory.bzl", "copy_to_directory") + +copy_to_directory( + name = "github-pages", + srcs = [ + "//challenges/day-06:build", + ], + out = "artifacts", + allow_overwrites = True, + root_paths = [ + "challenges/day-06", + ], +) diff --git a/pages/README.md b/pages/README.md new file mode 100644 index 0000000..782d3f1 --- /dev/null +++ b/pages/README.md @@ -0,0 +1,12 @@ +# pages + +This directory contains the pages of the website and serves as the entry point for GitHub Pages. + +## Getting Started + +```bash +bazel build //... +bazel build //pages:github-pages +``` + +It requires to update `pages/BUILD.bazel` to add new pages. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 05e371a..0b2189a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,6 +93,22 @@ importers: specifier: ^18.2.7 version: 18.2.7 + challenges/day-06: + dependencies: + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + devDependencies: + '@types/react': + specifier: ^18.2.15 + version: 18.2.15 + '@types/react-dom': + specifier: ^18.2.7 + version: 18.2.7 + packages: /@aashutoshrathi/word-wrap@1.2.6: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 35f5b30..7806d3b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,4 @@ packages: - 'challenges/day-02' - - 'challenges/day-04' \ No newline at end of file + - 'challenges/day-04' + - 'challenges/day-06' \ No newline at end of file diff --git a/tools/BUILD.bazel b/tools/BUILD.bazel index c61f4f3..02f4d46 100644 --- a/tools/BUILD.bazel +++ b/tools/BUILD.bazel @@ -34,6 +34,7 @@ filegroup( "//challenges/day-02:build", "//challenges/day-04:build", "//challenges/day-05/main:build", + "//challenges/day-06:build", ], }), ) @@ -47,6 +48,7 @@ test_suite( "//challenges/day-02:ut_test", "//challenges/day-04:ut_test", "//challenges/day-05/hello:ut_test", + "//challenges/day-06:ut_test", ], )