├── .gitignore ├── LICENSE.txt ├── README.md ├── SUPPORT.md ├── demo-files ├── build-test-deploy.yml └── hello-world.yml ├── hello_world.txt ├── jsconfig.json ├── next.config.js ├── package-lock.json ├── package.json ├── pages ├── _app.js ├── _document.js ├── api │ └── hello.js └── index.js ├── public ├── favicon.ico ├── next.svg └── vercel.svg └── styles ├── Home.module.css └── globals.css /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env*.local 29 | 30 | # vercel 31 | .vercel 32 | 33 | # typescript 34 | *.tsbuildinfo 35 | next-env.d.ts 36 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright GitHub 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Essentials of GitHub Actions learning pathway demo repository 2 | 3 | This repository contains the core web application files and configuration you'll need to follow along through the [Essentials of automated application deployment with GitHub Actions & GitHub Pages](https://resources.github.com/learn/pathways/automation/essentials/automated-application-deployment-with-github-actions-and-pages/) module. 4 | 5 | To follow along with the step-by-step instructions in the Essentials module, you will need to create a copy of this repository by doing the following: 6 | 1. Click **Use this template** above the file list and select **Create a new repository**. 7 | 2. Use the **Owner** dropdown menu to select the account you want to own the repository. 8 | 3. Name your repository `actions-learning-pathway` and add a simple description to make it easier to identify later. 9 | 4. Set the default visibility for the repo to public, as private repositories use Actions minutes, while public repositories can use GitHub-hosted runners for free. 10 | 11 | Click Create repository from template and we’re ready to build our first Actions workflow! 12 | 13 | 14 | 15 | If you have arrived here from the [Intermediate automation strategies with GitHub Actions](https://resources.github.com/learn/pathways/automation/intermediate/workflow-automation-with-github-actions/) module without following the first module, copy the contents of the `/demo-files` folder into the `.github/workflows` folder to follow along. 16 | -------------------------------------------------------------------------------- /SUPPORT.md: -------------------------------------------------------------------------------- 1 | # Support 2 | 3 | This repo contains supplemental content for the [GitHub Actions learning pathway](https://resources.github.com/learn/pathways). 4 | 5 | **actions-learning-pathway** is not an open source project, but rather supplemental demo content maintained by GitHub staff. We encourage users to direct questions to the [Community of Discussions](https://github.com/orgs/community/discussions/) or reference [GitHub Docs](https://docs.github.com/en). 6 | 7 | ## GitHub Support Policy 8 | 9 | Support for this project is limited to the resources listed above. 10 | -------------------------------------------------------------------------------- /demo-files/build-test-deploy.yml: -------------------------------------------------------------------------------- 1 | name: build-test-deploy 2 | 3 | on: push 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - name: checkout repo 11 | uses: actions/checkout@v3 12 | - name: use node.js 13 | uses: actions/setup-node@v3 14 | with: 15 | node-version: '18.x' 16 | - run: npm install 17 | - run: npm run build 18 | 19 | test: 20 | needs: build 21 | 22 | runs-on: ubuntu-latest 23 | 24 | steps: 25 | - name: checkout repo 26 | uses: actions/checkout@v3 27 | - name: use node.js 28 | uses: actions/setup-node@v3 29 | with: 30 | node-version: '18.x' 31 | - run: npm install 32 | - run: npm test 33 | 34 | deploy: 35 | needs: test 36 | 37 | permissions: 38 | contents: write 39 | pages: write 40 | id-token: write 41 | 42 | environment: 43 | name: production 44 | url: ${{ steps.deployment.outputs.page_url }} 45 | 46 | runs-on: ubuntu-latest 47 | 48 | steps: 49 | - name: checkout repo 50 | uses: actions/checkout@v3 51 | with: 52 | token: ${{ secrets.GITHUB_TOKEN }} 53 | - name: use node.js 54 | uses: actions/setup-node@v3 55 | with: 56 | node-version: '18.x' 57 | - name: configure github pages 58 | uses: actions/configure-pages@v3 59 | with: 60 | static_site_generator: next 61 | - run: npm install 62 | - run: npm run build 63 | - name: upload artifacts 64 | uses: actions/upload-pages-artifact@v1 65 | with: 66 | path: './out' 67 | - name: deploy 68 | id: deployment 69 | uses: actions/deploy-pages@v1 70 | -------------------------------------------------------------------------------- /demo-files/hello-world.yml: -------------------------------------------------------------------------------- 1 | name: hello-world 2 | 3 | on: push 4 | 5 | jobs: 6 | hello-world-job: 7 | 8 | runs-on: ubuntu-latest 9 | 10 | steps: 11 | - name: Check out repository code 12 | uses: actions/checkout@v3 13 | - run: echo "$(cat hello_world.txt)" 14 | -------------------------------------------------------------------------------- /hello_world.txt: -------------------------------------------------------------------------------- 1 | Hello! And congrats, you've succesfully built and run your first GitHub Actions workflow file! 2 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "paths": { 4 | "@/*": ["./*"] 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | output: 'export', 4 | 5 | images: { 6 | unoptimized: true, 7 | }, 8 | 9 | reactStrictMode: true, 10 | } 11 | 12 | module.exports = nextConfig 13 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "actions-learning-pathway", 3 | "version": "0.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "actions-learning-100", 9 | "version": "0.1.0", 10 | "dependencies": { 11 | "next": "14.2.21", 12 | "react": "18.2.0", 13 | "react-dom": "18.2.0" 14 | } 15 | }, 16 | "node_modules/@next/env": { 17 | "version": "14.2.21", 18 | "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.21.tgz", 19 | "integrity": "sha512-lXcwcJd5oR01tggjWJ6SrNNYFGuOOMB9c251wUNkjCpkoXOPkDeF/15c3mnVlBqrW4JJXb2kVxDFhC4GduJt2A==", 20 | "license": "MIT" 21 | }, 22 | "node_modules/@next/swc-darwin-arm64": { 23 | "version": "14.2.21", 24 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.21.tgz", 25 | "integrity": "sha512-HwEjcKsXtvszXz5q5Z7wCtrHeTTDSTgAbocz45PHMUjU3fBYInfvhR+ZhavDRUYLonm53aHZbB09QtJVJj8T7g==", 26 | "cpu": [ 27 | "arm64" 28 | ], 29 | "license": "MIT", 30 | "optional": true, 31 | "os": [ 32 | "darwin" 33 | ], 34 | "engines": { 35 | "node": ">= 10" 36 | } 37 | }, 38 | "node_modules/@next/swc-darwin-x64": { 39 | "version": "14.2.21", 40 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.21.tgz", 41 | "integrity": "sha512-TSAA2ROgNzm4FhKbTbyJOBrsREOMVdDIltZ6aZiKvCi/v0UwFmwigBGeqXDA97TFMpR3LNNpw52CbVelkoQBxA==", 42 | "cpu": [ 43 | "x64" 44 | ], 45 | "license": "MIT", 46 | "optional": true, 47 | "os": [ 48 | "darwin" 49 | ], 50 | "engines": { 51 | "node": ">= 10" 52 | } 53 | }, 54 | "node_modules/@next/swc-linux-arm64-gnu": { 55 | "version": "14.2.21", 56 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.21.tgz", 57 | "integrity": "sha512-0Dqjn0pEUz3JG+AImpnMMW/m8hRtl1GQCNbO66V1yp6RswSTiKmnHf3pTX6xMdJYSemf3O4Q9ykiL0jymu0TuA==", 58 | "cpu": [ 59 | "arm64" 60 | ], 61 | "license": "MIT", 62 | "optional": true, 63 | "os": [ 64 | "linux" 65 | ], 66 | "engines": { 67 | "node": ">= 10" 68 | } 69 | }, 70 | "node_modules/@next/swc-linux-arm64-musl": { 71 | "version": "14.2.21", 72 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.21.tgz", 73 | "integrity": "sha512-Ggfw5qnMXldscVntwnjfaQs5GbBbjioV4B4loP+bjqNEb42fzZlAaK+ldL0jm2CTJga9LynBMhekNfV8W4+HBw==", 74 | "cpu": [ 75 | "arm64" 76 | ], 77 | "license": "MIT", 78 | "optional": true, 79 | "os": [ 80 | "linux" 81 | ], 82 | "engines": { 83 | "node": ">= 10" 84 | } 85 | }, 86 | "node_modules/@next/swc-linux-x64-gnu": { 87 | "version": "14.2.21", 88 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.21.tgz", 89 | "integrity": "sha512-uokj0lubN1WoSa5KKdThVPRffGyiWlm/vCc/cMkWOQHw69Qt0X1o3b2PyLLx8ANqlefILZh1EdfLRz9gVpG6tg==", 90 | "cpu": [ 91 | "x64" 92 | ], 93 | "license": "MIT", 94 | "optional": true, 95 | "os": [ 96 | "linux" 97 | ], 98 | "engines": { 99 | "node": ">= 10" 100 | } 101 | }, 102 | "node_modules/@next/swc-linux-x64-musl": { 103 | "version": "14.2.21", 104 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.21.tgz", 105 | "integrity": "sha512-iAEBPzWNbciah4+0yI4s7Pce6BIoxTQ0AGCkxn/UBuzJFkYyJt71MadYQkjPqCQCJAFQ26sYh7MOKdU+VQFgPg==", 106 | "cpu": [ 107 | "x64" 108 | ], 109 | "license": "MIT", 110 | "optional": true, 111 | "os": [ 112 | "linux" 113 | ], 114 | "engines": { 115 | "node": ">= 10" 116 | } 117 | }, 118 | "node_modules/@next/swc-win32-arm64-msvc": { 119 | "version": "14.2.21", 120 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.21.tgz", 121 | "integrity": "sha512-plykgB3vL2hB4Z32W3ktsfqyuyGAPxqwiyrAi2Mr8LlEUhNn9VgkiAl5hODSBpzIfWweX3er1f5uNpGDygfQVQ==", 122 | "cpu": [ 123 | "arm64" 124 | ], 125 | "license": "MIT", 126 | "optional": true, 127 | "os": [ 128 | "win32" 129 | ], 130 | "engines": { 131 | "node": ">= 10" 132 | } 133 | }, 134 | "node_modules/@next/swc-win32-ia32-msvc": { 135 | "version": "14.2.21", 136 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.21.tgz", 137 | "integrity": "sha512-w5bacz4Vxqrh06BjWgua3Yf7EMDb8iMcVhNrNx8KnJXt8t+Uu0Zg4JHLDL/T7DkTCEEfKXO/Er1fcfWxn2xfPA==", 138 | "cpu": [ 139 | "ia32" 140 | ], 141 | "license": "MIT", 142 | "optional": true, 143 | "os": [ 144 | "win32" 145 | ], 146 | "engines": { 147 | "node": ">= 10" 148 | } 149 | }, 150 | "node_modules/@next/swc-win32-x64-msvc": { 151 | "version": "14.2.21", 152 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.21.tgz", 153 | "integrity": "sha512-sT6+llIkzpsexGYZq8cjjthRyRGe5cJVhqh12FmlbxHqna6zsDDK8UNaV7g41T6atFHCJUPeLb3uyAwrBwy0NA==", 154 | "cpu": [ 155 | "x64" 156 | ], 157 | "license": "MIT", 158 | "optional": true, 159 | "os": [ 160 | "win32" 161 | ], 162 | "engines": { 163 | "node": ">= 10" 164 | } 165 | }, 166 | "node_modules/@swc/counter": { 167 | "version": "0.1.3", 168 | "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", 169 | "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" 170 | }, 171 | "node_modules/@swc/helpers": { 172 | "version": "0.5.5", 173 | "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", 174 | "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", 175 | "dependencies": { 176 | "@swc/counter": "^0.1.3", 177 | "tslib": "^2.4.0" 178 | } 179 | }, 180 | "node_modules/busboy": { 181 | "version": "1.6.0", 182 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 183 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 184 | "dependencies": { 185 | "streamsearch": "^1.1.0" 186 | }, 187 | "engines": { 188 | "node": ">=10.16.0" 189 | } 190 | }, 191 | "node_modules/caniuse-lite": { 192 | "version": "1.0.30001617", 193 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", 194 | "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==", 195 | "funding": [ 196 | { 197 | "type": "opencollective", 198 | "url": "https://opencollective.com/browserslist" 199 | }, 200 | { 201 | "type": "tidelift", 202 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 203 | }, 204 | { 205 | "type": "github", 206 | "url": "https://github.com/sponsors/ai" 207 | } 208 | ] 209 | }, 210 | "node_modules/client-only": { 211 | "version": "0.0.1", 212 | "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", 213 | "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" 214 | }, 215 | "node_modules/graceful-fs": { 216 | "version": "4.2.11", 217 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 218 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 219 | }, 220 | "node_modules/js-tokens": { 221 | "version": "4.0.0", 222 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 223 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 224 | }, 225 | "node_modules/loose-envify": { 226 | "version": "1.4.0", 227 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 228 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 229 | "dependencies": { 230 | "js-tokens": "^3.0.0 || ^4.0.0" 231 | }, 232 | "bin": { 233 | "loose-envify": "cli.js" 234 | } 235 | }, 236 | "node_modules/nanoid": { 237 | "version": "3.3.8", 238 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 239 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 240 | "funding": [ 241 | { 242 | "type": "github", 243 | "url": "https://github.com/sponsors/ai" 244 | } 245 | ], 246 | "license": "MIT", 247 | "bin": { 248 | "nanoid": "bin/nanoid.cjs" 249 | }, 250 | "engines": { 251 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 252 | } 253 | }, 254 | "node_modules/next": { 255 | "version": "14.2.21", 256 | "resolved": "https://registry.npmjs.org/next/-/next-14.2.21.tgz", 257 | "integrity": "sha512-rZmLwucLHr3/zfDMYbJXbw0ZeoBpirxkXuvsJbk7UPorvPYZhP7vq7aHbKnU7dQNCYIimRrbB2pp3xmf+wsYUg==", 258 | "license": "MIT", 259 | "dependencies": { 260 | "@next/env": "14.2.21", 261 | "@swc/helpers": "0.5.5", 262 | "busboy": "1.6.0", 263 | "caniuse-lite": "^1.0.30001579", 264 | "graceful-fs": "^4.2.11", 265 | "postcss": "8.4.31", 266 | "styled-jsx": "5.1.1" 267 | }, 268 | "bin": { 269 | "next": "dist/bin/next" 270 | }, 271 | "engines": { 272 | "node": ">=18.17.0" 273 | }, 274 | "optionalDependencies": { 275 | "@next/swc-darwin-arm64": "14.2.21", 276 | "@next/swc-darwin-x64": "14.2.21", 277 | "@next/swc-linux-arm64-gnu": "14.2.21", 278 | "@next/swc-linux-arm64-musl": "14.2.21", 279 | "@next/swc-linux-x64-gnu": "14.2.21", 280 | "@next/swc-linux-x64-musl": "14.2.21", 281 | "@next/swc-win32-arm64-msvc": "14.2.21", 282 | "@next/swc-win32-ia32-msvc": "14.2.21", 283 | "@next/swc-win32-x64-msvc": "14.2.21" 284 | }, 285 | "peerDependencies": { 286 | "@opentelemetry/api": "^1.1.0", 287 | "@playwright/test": "^1.41.2", 288 | "react": "^18.2.0", 289 | "react-dom": "^18.2.0", 290 | "sass": "^1.3.0" 291 | }, 292 | "peerDependenciesMeta": { 293 | "@opentelemetry/api": { 294 | "optional": true 295 | }, 296 | "@playwright/test": { 297 | "optional": true 298 | }, 299 | "sass": { 300 | "optional": true 301 | } 302 | } 303 | }, 304 | "node_modules/picocolors": { 305 | "version": "1.0.0", 306 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 307 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 308 | }, 309 | "node_modules/postcss": { 310 | "version": "8.4.31", 311 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", 312 | "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", 313 | "funding": [ 314 | { 315 | "type": "opencollective", 316 | "url": "https://opencollective.com/postcss/" 317 | }, 318 | { 319 | "type": "tidelift", 320 | "url": "https://tidelift.com/funding/github/npm/postcss" 321 | }, 322 | { 323 | "type": "github", 324 | "url": "https://github.com/sponsors/ai" 325 | } 326 | ], 327 | "dependencies": { 328 | "nanoid": "^3.3.6", 329 | "picocolors": "^1.0.0", 330 | "source-map-js": "^1.0.2" 331 | }, 332 | "engines": { 333 | "node": "^10 || ^12 || >=14" 334 | } 335 | }, 336 | "node_modules/react": { 337 | "version": "18.2.0", 338 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 339 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 340 | "dependencies": { 341 | "loose-envify": "^1.1.0" 342 | }, 343 | "engines": { 344 | "node": ">=0.10.0" 345 | } 346 | }, 347 | "node_modules/react-dom": { 348 | "version": "18.2.0", 349 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 350 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 351 | "dependencies": { 352 | "loose-envify": "^1.1.0", 353 | "scheduler": "^0.23.0" 354 | }, 355 | "peerDependencies": { 356 | "react": "^18.2.0" 357 | } 358 | }, 359 | "node_modules/scheduler": { 360 | "version": "0.23.0", 361 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 362 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 363 | "dependencies": { 364 | "loose-envify": "^1.1.0" 365 | } 366 | }, 367 | "node_modules/source-map-js": { 368 | "version": "1.0.2", 369 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 370 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 371 | "engines": { 372 | "node": ">=0.10.0" 373 | } 374 | }, 375 | "node_modules/streamsearch": { 376 | "version": "1.1.0", 377 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 378 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 379 | "engines": { 380 | "node": ">=10.0.0" 381 | } 382 | }, 383 | "node_modules/styled-jsx": { 384 | "version": "5.1.1", 385 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", 386 | "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", 387 | "dependencies": { 388 | "client-only": "0.0.1" 389 | }, 390 | "engines": { 391 | "node": ">= 12.0.0" 392 | }, 393 | "peerDependencies": { 394 | "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" 395 | }, 396 | "peerDependenciesMeta": { 397 | "@babel/core": { 398 | "optional": true 399 | }, 400 | "babel-plugin-macros": { 401 | "optional": true 402 | } 403 | } 404 | }, 405 | "node_modules/tslib": { 406 | "version": "2.7.0", 407 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", 408 | "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" 409 | } 410 | } 411 | } 412 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "actions-learning-pathway", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "test": "next lint" 10 | }, 11 | "dependencies": { 12 | "next": "14.2.21", 13 | "react": "18.2.0", 14 | "react-dom": "18.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /pages/_app.js: -------------------------------------------------------------------------------- 1 | import '@/styles/globals.css' 2 | 3 | export default function App({ Component, pageProps }) { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /pages/_document.js: -------------------------------------------------------------------------------- 1 | import { Html, Head, Main, NextScript } from 'next/document' 2 | 3 | export default function Document() { 4 | return ( 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /pages/api/hello.js: -------------------------------------------------------------------------------- 1 | // Next.js API route support: https://nextjs.org/docs/api-routes/introduction 2 | 3 | export default function handler(req, res) { 4 | res.status(200).json({ name: 'John Doe' }) 5 | } 6 | -------------------------------------------------------------------------------- /pages/index.js: -------------------------------------------------------------------------------- 1 | import Head from 'next/head' 2 | import Image from 'next/image' 3 | import { Inter } from 'next/font/google' 4 | import styles from '@/styles/Home.module.css' 5 | 6 | const inter = Inter({ subsets: ['latin'] }) 7 | 8 | export default function Home() { 9 | return ( 10 | <> 11 | 12 | Success! 13 | 14 | 15 | 16 | 17 |
18 | 19 |

Congratulations!

20 |

You've completed the essentials of automated application deployment with GitHub Actions! 🥳

21 | 22 |
23 | 24 | ) 25 | } 26 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/github/actions-learning-pathway/b8d7066166b1307b17fc8f2b18aed35087a0d463/public/favicon.ico -------------------------------------------------------------------------------- /public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /styles/Home.module.css: -------------------------------------------------------------------------------- 1 | .main { 2 | display: flex; 3 | flex-direction: column; 4 | justify-content: space-between; 5 | align-items: center; 6 | padding: 6rem; 7 | min-height: 100vh; 8 | } 9 | 10 | .description { 11 | display: inherit; 12 | justify-content: inherit; 13 | align-items: inherit; 14 | font-size: 0.85rem; 15 | max-width: var(--max-width); 16 | width: 100%; 17 | z-index: 2; 18 | font-family: var(--font-mono); 19 | } 20 | 21 | .description a { 22 | display: flex; 23 | justify-content: center; 24 | align-items: center; 25 | gap: 0.5rem; 26 | } 27 | 28 | .description p { 29 | position: relative; 30 | margin: 0; 31 | padding: 1rem; 32 | background-color: rgba(var(--callout-rgb), 0.5); 33 | border: 1px solid rgba(var(--callout-border-rgb), 0.3); 34 | border-radius: var(--border-radius); 35 | } 36 | 37 | .code { 38 | font-weight: 700; 39 | font-family: var(--font-mono); 40 | } 41 | 42 | .grid { 43 | display: grid; 44 | grid-template-columns: repeat(4, minmax(25%, auto)); 45 | width: var(--max-width); 46 | max-width: 100%; 47 | } 48 | 49 | .card { 50 | padding: 1rem 1.2rem; 51 | border-radius: var(--border-radius); 52 | background: rgba(var(--card-rgb), 0); 53 | border: 1px solid rgba(var(--card-border-rgb), 0); 54 | transition: background 200ms, border 200ms; 55 | } 56 | 57 | .card span { 58 | display: inline-block; 59 | transition: transform 200ms; 60 | } 61 | 62 | .card h2 { 63 | font-weight: 600; 64 | margin-bottom: 0.7rem; 65 | } 66 | 67 | .card p { 68 | margin: 0; 69 | opacity: 0.6; 70 | font-size: 0.9rem; 71 | line-height: 1.5; 72 | max-width: 30ch; 73 | } 74 | 75 | .center { 76 | display: flex; 77 | justify-content: center; 78 | align-items: center; 79 | position: relative; 80 | padding: 4rem 0; 81 | } 82 | 83 | .center::before { 84 | background: var(--secondary-glow); 85 | border-radius: 50%; 86 | width: 480px; 87 | height: 360px; 88 | margin-left: -400px; 89 | } 90 | 91 | .center::after { 92 | background: var(--primary-glow); 93 | width: 240px; 94 | height: 180px; 95 | z-index: -1; 96 | } 97 | 98 | .center::before, 99 | .center::after { 100 | content: ''; 101 | left: 50%; 102 | position: absolute; 103 | filter: blur(45px); 104 | transform: translateZ(0); 105 | } 106 | 107 | .logo { 108 | position: relative; 109 | } 110 | /* Enable hover only on non-touch devices */ 111 | @media (hover: hover) and (pointer: fine) { 112 | .card:hover { 113 | background: rgba(var(--card-rgb), 0.1); 114 | border: 1px solid rgba(var(--card-border-rgb), 0.15); 115 | } 116 | 117 | .card:hover span { 118 | transform: translateX(4px); 119 | } 120 | } 121 | 122 | @media (prefers-reduced-motion) { 123 | .card:hover span { 124 | transform: none; 125 | } 126 | } 127 | 128 | /* Mobile */ 129 | @media (max-width: 700px) { 130 | .content { 131 | padding: 4rem; 132 | } 133 | 134 | .grid { 135 | grid-template-columns: 1fr; 136 | margin-bottom: 120px; 137 | max-width: 320px; 138 | text-align: center; 139 | } 140 | 141 | .card { 142 | padding: 1rem 2.5rem; 143 | } 144 | 145 | .card h2 { 146 | margin-bottom: 0.5rem; 147 | } 148 | 149 | .center { 150 | padding: 8rem 0 6rem; 151 | } 152 | 153 | .center::before { 154 | transform: none; 155 | height: 300px; 156 | } 157 | 158 | .description { 159 | font-size: 0.8rem; 160 | } 161 | 162 | .description a { 163 | padding: 1rem; 164 | } 165 | 166 | .description p, 167 | .description div { 168 | display: flex; 169 | justify-content: center; 170 | position: fixed; 171 | width: 100%; 172 | } 173 | 174 | .description p { 175 | align-items: center; 176 | inset: 0 0 auto; 177 | padding: 2rem 1rem 1.4rem; 178 | border-radius: 0; 179 | border: none; 180 | border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); 181 | background: linear-gradient( 182 | to bottom, 183 | rgba(var(--background-start-rgb), 1), 184 | rgba(var(--callout-rgb), 0.5) 185 | ); 186 | background-clip: padding-box; 187 | backdrop-filter: blur(24px); 188 | } 189 | 190 | .description div { 191 | align-items: flex-end; 192 | pointer-events: none; 193 | inset: auto 0 0; 194 | padding: 2rem; 195 | height: 200px; 196 | background: linear-gradient( 197 | to bottom, 198 | transparent 0%, 199 | rgb(var(--background-end-rgb)) 40% 200 | ); 201 | z-index: 1; 202 | } 203 | } 204 | 205 | /* Tablet and Smaller Desktop */ 206 | @media (min-width: 701px) and (max-width: 1120px) { 207 | .grid { 208 | grid-template-columns: repeat(2, 50%); 209 | } 210 | } 211 | 212 | @media (prefers-color-scheme: dark) { 213 | .vercelLogo { 214 | filter: invert(1); 215 | } 216 | 217 | .logo { 218 | filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70); 219 | } 220 | } 221 | 222 | @keyframes rotate { 223 | from { 224 | transform: rotate(360deg); 225 | } 226 | to { 227 | transform: rotate(0deg); 228 | } 229 | } 230 | -------------------------------------------------------------------------------- /styles/globals.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --max-width: 1100px; 3 | --border-radius: 12px; 4 | --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', 5 | 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', 6 | 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace; 7 | 8 | --foreground-rgb: 0, 0, 0; 9 | --background-start-rgb: 214, 219, 220; 10 | --background-end-rgb: 255, 255, 255; 11 | 12 | --primary-glow: conic-gradient( 13 | from 180deg at 50% 50%, 14 | #16abff33 0deg, 15 | #0885ff33 55deg, 16 | #54d6ff33 120deg, 17 | #0071ff33 160deg, 18 | transparent 360deg 19 | ); 20 | --secondary-glow: radial-gradient( 21 | rgba(255, 255, 255, 1), 22 | rgba(255, 255, 255, 0) 23 | ); 24 | 25 | --tile-start-rgb: 239, 245, 249; 26 | --tile-end-rgb: 228, 232, 233; 27 | --tile-border: conic-gradient( 28 | #00000080, 29 | #00000040, 30 | #00000030, 31 | #00000020, 32 | #00000010, 33 | #00000010, 34 | #00000080 35 | ); 36 | 37 | --callout-rgb: 238, 240, 241; 38 | --callout-border-rgb: 172, 175, 176; 39 | --card-rgb: 180, 185, 188; 40 | --card-border-rgb: 131, 134, 135; 41 | } 42 | 43 | @media (prefers-color-scheme: dark) { 44 | :root { 45 | --foreground-rgb: 255, 255, 255; 46 | --background-start-rgb: 0, 0, 0; 47 | --background-end-rgb: 0, 0, 0; 48 | 49 | --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); 50 | --secondary-glow: linear-gradient( 51 | to bottom right, 52 | rgba(1, 65, 255, 0), 53 | rgba(1, 65, 255, 0), 54 | rgba(1, 65, 255, 0.3) 55 | ); 56 | 57 | --tile-start-rgb: 2, 13, 46; 58 | --tile-end-rgb: 2, 5, 19; 59 | --tile-border: conic-gradient( 60 | #ffffff80, 61 | #ffffff40, 62 | #ffffff30, 63 | #ffffff20, 64 | #ffffff10, 65 | #ffffff10, 66 | #ffffff80 67 | ); 68 | 69 | --callout-rgb: 20, 20, 20; 70 | --callout-border-rgb: 108, 108, 108; 71 | --card-rgb: 100, 100, 100; 72 | --card-border-rgb: 200, 200, 200; 73 | } 74 | } 75 | 76 | * { 77 | box-sizing: border-box; 78 | padding: 0; 79 | margin: 0; 80 | } 81 | 82 | html, 83 | body { 84 | max-width: 100vw; 85 | overflow-x: hidden; 86 | } 87 | 88 | body { 89 | color: rgb(var(--foreground-rgb)); 90 | background: linear-gradient( 91 | to bottom, 92 | transparent, 93 | rgb(var(--background-end-rgb)) 94 | ) 95 | rgb(var(--background-start-rgb)); 96 | } 97 | 98 | a { 99 | color: inherit; 100 | text-decoration: none; 101 | } 102 | 103 | @media (prefers-color-scheme: dark) { 104 | html { 105 | color-scheme: dark; 106 | } 107 | } 108 | --------------------------------------------------------------------------------