mirror of
https://github.com/cloudflare/pages-action
synced 2024-11-27 13:29:57 +00:00
Initial commit
This commit is contained in:
commit
752c4fc911
23
.github/workflows/example.yml
vendored
Normal file
23
.github/workflows/example.yml
vendored
Normal file
|
@ -0,0 +1,23 @@
|
|||
on: [push]
|
||||
|
||||
jobs:
|
||||
example:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
deployments: write
|
||||
name: Example
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
- name: Publish to Cloudflare Pages
|
||||
uses: ./
|
||||
with:
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
accountId: 468cce80dfb431f3a4058e6dc6031a44
|
||||
projectName: github-actions-example
|
||||
directory: example
|
||||
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
|
||||
id: publish
|
||||
- name: Deployment URL
|
||||
run: echo "${{ steps.publish.outputs.url }}"
|
178
.gitignore
vendored
Normal file
178
.gitignore
vendored
Normal file
|
@ -0,0 +1,178 @@
|
|||
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/node,macos
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=node,macos
|
||||
|
||||
### macOS ###
|
||||
# General
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
### macOS Patch ###
|
||||
# iCloud generated files
|
||||
*.icloud
|
||||
|
||||
### Node ###
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Snowpack dependency directory (https://snowpack.dev/)
|
||||
web_modules/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional stylelint cache
|
||||
.stylelintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variable files
|
||||
.env
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.env.local
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
.parcel-cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
out
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Gatsby files
|
||||
.cache/
|
||||
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
# public
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# vuepress v2.x temp and cache directory
|
||||
.temp
|
||||
|
||||
# Docusaurus cache and generated files
|
||||
.docusaurus
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
|
||||
# Stores VSCode versions used for testing VSCode extensions
|
||||
.vscode-test
|
||||
|
||||
# yarn v2
|
||||
.yarn/cache
|
||||
.yarn/unplugged
|
||||
.yarn/build-state.yml
|
||||
.yarn/install-state.gz
|
||||
.pnp.*
|
||||
|
||||
### Node Patch ###
|
||||
# Serverless Webpack directories
|
||||
.webpack/
|
||||
|
||||
# Optional stylelint cache
|
||||
|
||||
# SvelteKit build / generate output
|
||||
.svelte-kit
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/node,macos
|
4
.husky/pre-commit
Executable file
4
.husky/pre-commit
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
npm run build && git add index.js
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2022 Cloudflare
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
39
README.md
Normal file
39
README.md
Normal file
|
@ -0,0 +1,39 @@
|
|||
# Cloudflare Pages GitHub Action
|
||||
|
||||
GitHub Action for creating Cloudflare Pages deployments, using the new [Direct Upload](https://developers.cloudflare.com/pages/platform/direct-upload/) feature and [Wrangler](https://developers.cloudflare.com/pages/platform/direct-upload/#wrangler-cli) integration.
|
||||
|
||||
## Usage
|
||||
|
||||
1. Create an API token in the Cloudflare dashboard with the "Cloudflare Pages — Edit" permission.
|
||||
1. Add that API token as a secret to your GitHub repository, `CLOUDFLARE_API_TOKEN`.
|
||||
1. Create a `.github/workflows/publish.yml` file in your repository:
|
||||
|
||||
```yml
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
deployments: write
|
||||
name: Publish to Cloudflare Pages
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# Run a build step here if your project requires
|
||||
|
||||
- name: Publish to Cloudflare Pages
|
||||
uses: cloudflare/pages-action@1
|
||||
with:
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
accountId: YOUR_ACCOUNT_ID
|
||||
projectName: YOUR_PROJECT_NAME
|
||||
directory: YOUR_ASSET_DIRECTORY
|
||||
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
|
||||
```
|
||||
|
||||
1. Replace `YOUR_ACCOUNT_ID`, `YOUR_PROJECT_NAME` and `YOUR_ASSET_DIRECTORY` with the appropriate values to your Pages project.
|
||||
|
||||
More information can be found on [our guide for making Direct Upload deployments with continous integration](https://developers.cloudflare.com/pages/how-to/use-direct-upload-with-continuous-integration/#use-github-actions).
|
24
action.yml
Normal file
24
action.yml
Normal file
|
@ -0,0 +1,24 @@
|
|||
name: "Cloudflare Pages GitHub Action"
|
||||
description: "Publish to Cloudflare Pages"
|
||||
branding:
|
||||
icon: "upload-cloud"
|
||||
color: "orange"
|
||||
inputs:
|
||||
apiToken:
|
||||
description: "Cloudflare API Token"
|
||||
required: true
|
||||
accountId:
|
||||
description: "Cloudflare Account ID"
|
||||
required: true
|
||||
projectName:
|
||||
description: "The name of the Pages project to upload to"
|
||||
required: true
|
||||
directory:
|
||||
description: "The directory of static assets to upload"
|
||||
required: true
|
||||
gitHubToken:
|
||||
description: "GitHub Token"
|
||||
required: true
|
||||
runs:
|
||||
using: "node16"
|
||||
main: "index.js"
|
1
example/assets/cloud-upload.svg
Normal file
1
example/assets/cloud-upload.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg width="25" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path d="M22.95 10.817a4.366 4.366 0 0 0-3-1.02A7.234 7.234 0 0 0 6.085 8.075 5.116 5.116 0 0 0 2.45 9.272 5.475 5.475 0 0 0 .5 13.408a5.344 5.344 0 0 0 5.332 5.331h4.418v-1.5H5.82A3.838 3.838 0 0 1 2 13.408a3.959 3.959 0 0 1 1.414-2.988 3.62 3.62 0 0 1 3.049-.792l.651.113.195-.632a5.732 5.732 0 0 1 11.207 1.523l.024.855.845-.136a3.105 3.105 0 0 1 2.593.606A3.044 3.044 0 0 1 23 14.262a2.981 2.981 0 0 1-2.977 2.977h-.049c-.091.002-.641.01-3.724.01v1.5c2.895 0 3.588-.007 3.773-.01a4.517 4.517 0 0 0 2.927-7.923v.001Z" fill="#fff"/><path d="M22.95 10.817a4.366 4.366 0 0 0-3-1.02A7.234 7.234 0 0 0 6.085 8.075 5.116 5.116 0 0 0 2.45 9.272 5.475 5.475 0 0 0 .5 13.408a5.344 5.344 0 0 0 5.332 5.331h4.418v-1.5H5.82A3.838 3.838 0 0 1 2 13.408a3.959 3.959 0 0 1 1.414-2.988 3.62 3.62 0 0 1 3.049-.792l.651.113.195-.632a5.732 5.732 0 0 1 11.207 1.523l.024.855.845-.136a3.105 3.105 0 0 1 2.593.606A3.044 3.044 0 0 1 23 14.262a2.981 2.981 0 0 1-2.977 2.977h-.049c-.091.002-.641.01-3.724.01v1.5c2.895 0 3.588-.007 3.773-.01a4.517 4.517 0 0 0 2.927-7.923v.001Z" fill="url(#b)"/><path d="M22.95 10.817a4.366 4.366 0 0 0-3-1.02A7.234 7.234 0 0 0 6.085 8.075 5.116 5.116 0 0 0 2.45 9.272 5.475 5.475 0 0 0 .5 13.408a5.344 5.344 0 0 0 5.332 5.331h4.418v-1.5H5.82A3.838 3.838 0 0 1 2 13.408a3.959 3.959 0 0 1 1.414-2.988 3.62 3.62 0 0 1 3.049-.792l.651.113.195-.632a5.732 5.732 0 0 1 11.207 1.523l.024.855.845-.136a3.105 3.105 0 0 1 2.593.606A3.044 3.044 0 0 1 23 14.262a2.981 2.981 0 0 1-2.977 2.977h-.049c-.091.002-.641.01-3.724.01v1.5c2.895 0 3.588-.007 3.773-.01a4.517 4.517 0 0 0 2.927-7.923v.001Z" fill="url(#c)"/><path d="m16.926 14.184-3.691-3.75-3.69 3.75 1.069 1.052 1.871-1.902v5.429h1.5v-5.429l1.872 1.902 1.07-1.052Z" fill="#fff"/><path d="m16.926 14.184-3.691-3.75-3.69 3.75 1.069 1.052 1.871-1.902v5.429h1.5v-5.429l1.872 1.902 1.07-1.052Z" fill="url(#d)"/><path d="m16.926 14.184-3.691-3.75-3.69 3.75 1.069 1.052 1.871-1.902v5.429h1.5v-5.429l1.872 1.902 1.07-1.052Z" fill="url(#e)"/></g><defs><linearGradient id="b" x1="12.5" y1="3.565" x2="12.5" y2="18.763" gradientUnits="userSpaceOnUse"><stop stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><linearGradient id="c" x1="12.5" y1="3.565" x2="12.5" y2="18.763" gradientUnits="userSpaceOnUse"><stop stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><linearGradient id="d" x1="12.5" y1="3.565" x2="12.5" y2="18.763" gradientUnits="userSpaceOnUse"><stop stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><linearGradient id="e" x1="12.5" y1="3.565" x2="12.5" y2="18.763" gradientUnits="userSpaceOnUse"><stop stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><clipPath id="a"><path fill="#fff" transform="translate(.5)" d="M0 0h24v24H0z"/></clipPath></defs></svg>
|
After Width: | Height: | Size: 2.9 KiB |
1
example/assets/cloudflare-pages.svg
Normal file
1
example/assets/cloudflare-pages.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 14 KiB |
1
example/assets/terminal.svg
Normal file
1
example/assets/terminal.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg width="21" height="22" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M20.125.5H.875L0 1.375v19.25l.875.875h19.25l.875-.875V1.375L20.125.5Zm-.875 19.25H1.75V2.25h17.5v17.5ZM10.062 8.908 3.939 5.313v2.066l3.927 2.307-3.928 2.302v2.075l6.126-3.6V8.909Zm6.563 6.03h-6.563v1.75h6.563v-1.75Z" fill="#fff"/><path fill-rule="evenodd" clip-rule="evenodd" d="M20.125.5H.875L0 1.375v19.25l.875.875h19.25l.875-.875V1.375L20.125.5Zm-.875 19.25H1.75V2.25h17.5v17.5ZM10.062 8.908 3.939 5.313v2.066l3.927 2.307-3.928 2.302v2.075l6.126-3.6V8.909Zm6.563 6.03h-6.563v1.75h6.563v-1.75Z" fill="url(#a)"/><path fill-rule="evenodd" clip-rule="evenodd" d="M20.125.5H.875L0 1.375v19.25l.875.875h19.25l.875-.875V1.375L20.125.5Zm-.875 19.25H1.75V2.25h17.5v17.5ZM10.062 8.908 3.939 5.313v2.066l3.927 2.307-3.928 2.302v2.075l6.126-3.6V8.909Zm6.563 6.03h-6.563v1.75h6.563v-1.75Z" fill="url(#b)"/><defs><linearGradient id="a" x1="10.5" y1=".5" x2="10.5" y2="21.5" gradientUnits="userSpaceOnUse"><stop stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><linearGradient id="b" x1="10.5" y1=".5" x2="10.5" y2="21.5" gradientUnits="userSpaceOnUse"><stop stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient></defs></svg>
|
After Width: | Height: | Size: 1.3 KiB |
1
example/assets/world.svg
Normal file
1
example/assets/world.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 52 KiB |
50
example/index.html
Normal file
50
example/index.html
Normal file
|
@ -0,0 +1,50 @@
|
|||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Direct Upload Demo | Cloudflare Pages</title>
|
||||
<link href="style.css" rel="stylesheet" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<h3>Example project</h3>
|
||||
<h1>Welcome to Cloudflare Pages</h1>
|
||||
<p>
|
||||
Upload your prebuilt assets directly to Pages and deploy <br />
|
||||
your project to the Cloudflare edge within seconds.
|
||||
</p>
|
||||
<p>Create new deployments using:</p>
|
||||
<section class="options">
|
||||
<img src="assets/terminal.svg" />
|
||||
<a
|
||||
href="https://dash.cloudflare.com/?to=/:account/pages/new/wrangler-guide"
|
||||
target="_blank"
|
||||
> Wrangler CLI</a
|
||||
>
|
||||
<img src="assets/cloud-upload.svg" />
|
||||
<a
|
||||
href="https://dash.cloudflare.com/?to=/:account/pages/new/upload"
|
||||
target="_blank"
|
||||
> Dashboard</a
|
||||
>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<section class="learn-more">
|
||||
<a
|
||||
href="https://developers.cloudflare.com/pages/platform/direct-uploads"
|
||||
>
|
||||
<button>Learn more</button>
|
||||
</a>
|
||||
</section>
|
||||
<div class="logo">
|
||||
<a href="https://pages.cloudflare.com/" target="_blank">
|
||||
<img src="assets/cloudflare-pages.svg"
|
||||
/></a>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
159
example/style.css
Normal file
159
example/style.css
Normal file
|
@ -0,0 +1,159 @@
|
|||
* {
|
||||
box-sizing: border-box;
|
||||
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, "Helvetica Neue", Arial, sans-serif;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.bg-image {
|
||||
position: absolute;
|
||||
bottom: -88%;
|
||||
}
|
||||
|
||||
.container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 165px 0 124px;
|
||||
width: 100%;
|
||||
margin: auto;
|
||||
border: #fbab40;
|
||||
height: 100vh;
|
||||
background-color: #242628;
|
||||
background-image: url(./assets/world.svg);
|
||||
background-repeat: no-repeat;
|
||||
background-position-x: center;
|
||||
background-position-y: 70px;
|
||||
background-origin: padding-box;
|
||||
}
|
||||
|
||||
.header h3 {
|
||||
text-align: center;
|
||||
color: #ff9e40;
|
||||
font-size: 24px;
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
margin: 0;
|
||||
line-height: 36px;
|
||||
}
|
||||
|
||||
.header {
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 0px;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.header > h1 {
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
font-size: 48px;
|
||||
line-height: 150%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.header > p {
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-size: 24px;
|
||||
line-height: 150%;
|
||||
text-align: center;
|
||||
color: #ffffff;
|
||||
flex-grow: 0;
|
||||
margin: 16px 0px;
|
||||
}
|
||||
|
||||
.options {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.options > a {
|
||||
color: #ffffff;
|
||||
text-decoration: underline;
|
||||
margin: 0px 8px;
|
||||
font-weight: 400;
|
||||
font-size: 24px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.options > a:first-of-type {
|
||||
margin-right: 30px;
|
||||
}
|
||||
|
||||
.logo {
|
||||
margin-top: 75px;
|
||||
}
|
||||
|
||||
.logo > img {
|
||||
width: 160px;
|
||||
height: 64px;
|
||||
}
|
||||
|
||||
.learn-more > a > button {
|
||||
background: #f6821f;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
width: 180px;
|
||||
margin-top: 78px;
|
||||
height: 55px;
|
||||
color: #ffffff;
|
||||
text-align: center;
|
||||
font-weight: 600;
|
||||
font-size: 16px;
|
||||
line-height: 19px;
|
||||
background: rgba(246, 130, 31, 1);
|
||||
box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.25);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1024px) {
|
||||
.container {
|
||||
background-size: contain;
|
||||
background-position-y: center;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 600px) {
|
||||
|
||||
.container{
|
||||
background-size: contain;
|
||||
background-position-y: center;
|
||||
}
|
||||
pre {
|
||||
font-size: 0.8rem;
|
||||
padding: 8px 12px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
width: 100vw;
|
||||
}
|
||||
|
||||
.header img {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.installation-steps {
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 1.6rem;
|
||||
}
|
||||
|
||||
ol {
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
}
|
1047
package-lock.json
generated
Normal file
1047
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
35
package.json
Normal file
35
package.json
Normal file
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
"name": "pages-action",
|
||||
"version": "1.0.0",
|
||||
"description": "Publish to Cloudflare Pages",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"build": "npx esbuild src/index.ts --bundle --platform=node --target=es2021 --outfile=index.js",
|
||||
"prepare": "husky install"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/cloudflare/pages-action.git"
|
||||
},
|
||||
"keywords": [
|
||||
"Cloudflare Pages",
|
||||
"GitHub Actions"
|
||||
],
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/cloudflare/pages-action/issues"
|
||||
},
|
||||
"homepage": "https://github.com/cloudflare/pages-action#readme",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.8.0",
|
||||
"@actions/github": "^5.0.1",
|
||||
"shellac": "^0.7.0",
|
||||
"undici": "^5.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"esbuild": "^0.14.38",
|
||||
"husky": "^8.0.1",
|
||||
"prettier": "^2.6.2",
|
||||
"typescript": "^4.6.4"
|
||||
}
|
||||
}
|
147
src/index.ts
Normal file
147
src/index.ts
Normal file
|
@ -0,0 +1,147 @@
|
|||
import { getInput, setOutput, setFailed } from "@actions/core";
|
||||
import { context, getOctokit } from "@actions/github";
|
||||
import shellac from "shellac";
|
||||
import { fetch } from "undici";
|
||||
|
||||
// TODO: Confirm types
|
||||
|
||||
interface Stage {
|
||||
name: string;
|
||||
started_on: null | string;
|
||||
ended_on: null | string;
|
||||
status: string;
|
||||
}
|
||||
|
||||
interface Deployment {
|
||||
id: string;
|
||||
short_id: string;
|
||||
project_id: string;
|
||||
project_name: string;
|
||||
environment: string;
|
||||
url: string;
|
||||
created_on: string;
|
||||
modified_on: string;
|
||||
latest_stage: Stage;
|
||||
deployment_trigger: {
|
||||
type: string;
|
||||
metadata: {
|
||||
branch: string;
|
||||
commit_hash: string;
|
||||
commit_message: string;
|
||||
commit_dirty: boolean;
|
||||
};
|
||||
};
|
||||
stages: Stage[];
|
||||
build_config: {
|
||||
build_command: null | string;
|
||||
destination_dir: null | string;
|
||||
root_dir: null | string;
|
||||
web_analytics_tag: null | string;
|
||||
web_analytics_token: null | string;
|
||||
fast_builds: boolean;
|
||||
};
|
||||
env_vars: unknown;
|
||||
kv_namespaces: Record<string, { namespace_id: string }>;
|
||||
aliases: null | string[];
|
||||
is_skipped: boolean;
|
||||
production_branch: string;
|
||||
}
|
||||
|
||||
try {
|
||||
const apiToken = getInput("apiToken", { required: true });
|
||||
const accountId = getInput("accountId", { required: true });
|
||||
const projectName = getInput("projectName", { required: true });
|
||||
const directory = getInput("directory", { required: true });
|
||||
const gitHubToken = getInput("gitHubToken", { required: true });
|
||||
|
||||
const octokit = getOctokit(gitHubToken);
|
||||
|
||||
const createPagesDeployment = async () => {
|
||||
// TODO: Replace this with an API call to wrangler so we can get back a full deployment response object
|
||||
await shellac`
|
||||
$ export CLOUDFLARE_API_TOKEN="${apiToken}"
|
||||
if ${accountId} {
|
||||
$ export CLOUDFLARE_ACCOUNT_ID="${accountId}"
|
||||
}
|
||||
|
||||
$$ npx wrangler@2 pages publish "${directory}" --project-name="${projectName}"
|
||||
`;
|
||||
|
||||
const response = await fetch(
|
||||
`https://api.cloudflare.com/client/v4/accounts/${accountId}/pages/projects/${projectName}/deployments`,
|
||||
{ headers: { Authorization: `Bearer ${apiToken}` } }
|
||||
);
|
||||
const {
|
||||
result: [deployment],
|
||||
} = (await response.json()) as { result: Deployment[] };
|
||||
|
||||
return deployment;
|
||||
};
|
||||
|
||||
const createGitHubDeployment = async () => {
|
||||
const deployment = await octokit.rest.repos.createDeployment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
ref: context.ref,
|
||||
auto_merge: false,
|
||||
description: "Cloudflare Pages",
|
||||
required_contexts: [],
|
||||
});
|
||||
|
||||
if (deployment.status === 201) {
|
||||
return deployment.data;
|
||||
}
|
||||
};
|
||||
|
||||
const createGitHubDeploymentStatus = async ({
|
||||
id,
|
||||
url,
|
||||
environmentName,
|
||||
productionEnvironment,
|
||||
}: {
|
||||
id: number;
|
||||
url: string;
|
||||
environmentName: string;
|
||||
productionEnvironment: boolean;
|
||||
}) => {
|
||||
await octokit.rest.repos.createDeploymentStatus({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
deployment_id: id,
|
||||
// @ts-ignore
|
||||
environment: environmentName,
|
||||
environment_url: url,
|
||||
production_environment: productionEnvironment,
|
||||
log_url: `https://dash.cloudflare.com/${accountId}/pages/view/${projectName}/${id}`,
|
||||
description: "Cloudflare Pages",
|
||||
state: "success",
|
||||
});
|
||||
};
|
||||
|
||||
(async () => {
|
||||
const gitHubDeployment = await createGitHubDeployment();
|
||||
|
||||
const pagesDeployment = await createPagesDeployment();
|
||||
|
||||
setOutput("id", pagesDeployment.id);
|
||||
setOutput("url", pagesDeployment.url);
|
||||
setOutput("environment", pagesDeployment.environment);
|
||||
|
||||
const url = new URL(pagesDeployment.url);
|
||||
const productionEnvironment = pagesDeployment.environment === "production";
|
||||
const environmentName = productionEnvironment
|
||||
? "Production"
|
||||
: `Preview (${url.host.split(".")[0]})`;
|
||||
|
||||
if (gitHubDeployment) {
|
||||
await createGitHubDeploymentStatus({
|
||||
id: gitHubDeployment.id,
|
||||
url: pagesDeployment.url,
|
||||
environmentName,
|
||||
productionEnvironment,
|
||||
});
|
||||
}
|
||||
})();
|
||||
} catch (thrown) {
|
||||
setFailed(thrown.message);
|
||||
}
|
Loading…
Reference in a new issue