Use do-spaces-action to deploy a file or directory to your DigitalOcean Space with GitHub Actions. This can be used to host your static site, or as an self-hosted alternative to something like JSDelivr for serving your JS files/library via a CDN. do-spaces-action can also automatically grab the version number from the package.json and use it to host multiple versions at once (more info below).
- Upload a single file or whole directories
- Specify output directory on your Space
- Automatic versioning of your uploads
- Use your CDN endpoint (custom domain)
- Integrates with GitHub deployments
Create a .yml file in your .github/workflows folder (you can find more info about the structure in the GitHub Docs):
.github/workflows/upload.yml
name: Upload to DO Spaces
on:
push:
branches:
- main
jobs:
upload:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@master
- uses: BetaHuhn/do-spaces-action@v2
with:
access_key: ${{ secrets.ACCESS_KEY}}
secret_key: ${{ secrets.SECRET_KEY }}
space_name: ${{ secrets.SPACE_NAME }}
space_region: ${{ secrets.SPACE_REGION }}
source: srcMore info on how to specify what files to upload where below.
To always use the latest version of the action add the latest tag to the action name like this:
uses: BetaHuhn/do-spaces-action@latestIf you want to make sure that your workflow doesn't suddenly break when a new major version is released, use the v2 tag instead (recommended usage):
uses: BetaHuhn/do-spaces-action@v2With the v2 tag you will always get the latest non-breaking version which will include potential bug fixes in the future. If you use a specific version, make sure to regularly check if a new version is available, or enable Dependabot.
Here are all the inputs do-spaces-action takes:
| Key | Value | Required | Default |
|---|---|---|---|
access_key |
Your DigitalOcean access key - more info | Yes | N/A |
secret_key |
Your DigitalOcean secret key - more info | Yes | N/A |
space_name |
The name of your DigitalOcean Space | Yes | N/A |
space_region |
The region of your DigitalOcean Space | Yes | N/A |
source |
Path to the source file or folder (what you want to upload) - more info | Yes | N/A |
out_dir |
Path to the output directory in your Space (where you want to upload to) - more info | No | / |
versioning |
Enable versioning (either set it to true or specify path to package.json) - more info | No | false |
cdn_domain |
Custom domain pointing to your CDN endpoint - more info | No | N/A |
permission |
Access permissions of the uploaded files - more info | No | public-read |
In order to access your DigitalOcean Space, you have to specify a few required values. The access_key and secret_key can be generated on your DigitalOcean Account Page. The space_name and space_region are different based on your created Space.
It is recommended to set them as Repository Secrets.
The source input can either point to a single file or to a whole directory which should be uploaded. The path is relative to the root of your repository.
By default do-spaces-action will upload all files to the root of your Space. You can specify a different output directory with the out_dir input.
do-spaces-action also supports versioning and can detect the current version from your package.json and then upload the file/s to a folder with the version as the name. Let's suppose you bump the version of your project from v2.3.0 to v2.4.0. Both versions would remain on your Space, under different paths:
v2.3.0->https://SPACE.fra1.digitaloceanspaces.com/js/v2.3.0/index.min.jsv2.4.0->https://SPACE.fra1.digitaloceanspaces.com/js/v2.4.0/index.min.js
The most recent version will be available with the latest tag:
latest->https://SPACE.fra1.digitaloceanspaces.com/js/latest/index.min.js
The versioning parameter can be set to true/false, or a string representing the path to the package.json file.
Instead of outputting the normal DigitalOcean domain https://SPACE.fra1.digitaloceanspaces.com/, you can also specify your custom CDN domain with cdn_domain.
Note: https://SPACE.REGION.digitaloceanspaces.com/ is still used to connect to your Space, do-spaces-action will just use it when logging it and assigning it to the action output variable output_url.
By default all uploaded files have their access permission set to public-read. This means that anyone can access them via their own Space URL. If you want to block public access, you can set permission to private.
Here are a few examples to help you get started!
This example will run everytime you create a new release and then upload all files and directories in the src folder to the root of your Space.
name: Upload to DO Spaces
on:
release:
types: [created]
jobs:
upload:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- uses: BetaHuhn/do-spaces-action@v2
with:
access_key: ${{ secrets.ACCESS_KEY}}
secret_key: ${{ secrets.SECRET_KEY }}
space_name: ${{ secrets.SPACE_NAME }}
space_region: ${{ secrets.SPACE_REGION }}
source: srcThis example will run everytime you create a new release and then upload the src directory to the dist folder on your Space.
name: Upload to DO Spaces
on:
release:
types: [created]
jobs:
upload:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- uses: BetaHuhn/do-spaces-action@v2
with:
access_key: ${{ secrets.ACCESS_KEY}}
secret_key: ${{ secrets.SECRET_KEY }}
space_name: ${{ secrets.SPACE_NAME }}
space_region: ${{ secrets.SPACE_REGION }}
source: src
out_dir: distThis example will run everytime you create a new release and then upload the file path/to/file.js to the root of your Space.
name: Upload to DO Spaces
on:
release:
types: [created]
jobs:
upload:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- uses: BetaHuhn/do-spaces-action@v2
with:
access_key: ${{ secrets.ACCESS_KEY}}
secret_key: ${{ secrets.SECRET_KEY }}
space_name: ${{ secrets.SPACE_NAME }}
space_region: ${{ secrets.SPACE_REGION }}
source: path/to/file.jsThis example will run everytime you create a new release and then upload the file dist/index.min.js to both the latest and vX.X.X folder in the js directory in your Space.
name: Upload to DO Spaces
on:
release:
types: [created]
jobs:
upload:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- uses: BetaHuhn/do-spaces-action@v2
with:
access_key: ${{ secrets.ACCESS_KEY}}
secret_key: ${{ secrets.SECRET_KEY }}
space_name: ${{ secrets.SPACE_NAME }}
space_region: ${{ secrets.SPACE_REGION }}
source: dist/index.min.js
out_dir: js
versioning: trueThe versioning parameter can be set to true/false, or a string representing the path to the package.json file.
name: Upload to DO Spaces
on:
release:
types: [created]
jobs:
upload:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- uses: BetaHuhn/do-spaces-action@v2
with:
access_key: ${{ secrets.ACCESS_KEY}}
secret_key: ${{ secrets.SECRET_KEY }}
space_name: ${{ secrets.SPACE_NAME }}
space_region: ${{ secrets.SPACE_REGION }}
source: src
cdn_domain: cdn.example.comdo-spaces-action can be perfectly intergrated with Actions like Create Deployment Status Update to create a deployment once all files are uploaded:
name: Upload to DO Spaces
on:
release:
types: [created]
jobs:
upload:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- uses: altinukshini/deployment-action@releases/v1
name: start deployment
id: deployment
with:
token: ${{ secrets.GITHUB_TOKEN}}
description: Uploading files to DO Spaces
environment: production
- uses: BetaHuhn/do-spaces-action@v2
name: upload to spaces
id: spaces
with:
access_key: ${{ secrets.ACCESS_KEY}}
secret_key: ${{ secrets.SECRET_KEY }}
space_name: ${{ secrets.SPACE_NAME }}
space_region: ${{ secrets.SPACE_REGION }}
source: src
out_dir: dist
versioning: true
- name: update deployment status
if: always()
uses: altinukshini/deployment-status@releases/v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
state: ${{ job.status }}
deployment_id: ${{ steps.deployment.outputs.deployment_id }}
environment_url: ${{steps.spaces.outputs.output_url}}
description: "Successfully uploaded files to DO Spaces"Here's how that will look on your Repo:
Here is what's currently planned for do-spaces-action:
- Different environments: add the option to change the upload path pased on the environment (staging/production)
If you have an idea, feel free to open an issue!
Issues and PRs are very welcome!
The actual source code of this library is in the src folder.
- run
yarn lintornpm run lintto run eslint. - run
yarn startornpm run startto run the Action locally. - run
yarn buildornpm run buildto produce a production version in thedistfolder.
This project was developed by me (@betahuhn) in my free time. If you want to support me:
Copyright 2021 Maximilian Schiller
This project is licensed under the MIT License - see the LICENSE file for details.