Created github deploy functions

This commit is contained in:
Barunes Padhy 2024-06-13 16:35:40 +03:00
parent 043769014d
commit 40ec488249
7 changed files with 150 additions and 19 deletions

View File

@ -1,6 +1,9 @@
from django.conf import settings
import os
import shutil
import subprocess
import tkinter as tk
from tkinter import simpledialog
deployment_methods = {
"server_deploy": {
@ -11,20 +14,116 @@ deployment_methods = {
}
}
def server_deploy():
data_location = f'{settings.BASE_DIR}/deploy/'
deploy_location = settings.DEPLOY_CONFIG["DEPLOY_LOCATION"]
def invokeDialogueBox(title, message, type):
root = tk.Tk()
root.withdraw()
input_data = None
if type == 'text':
input_data = simpledialog.askstring(title, message)
if type == 'password':
input_data = simpledialog.askstring(title, message, show='*')
root.destroy()
return input_data
def copyData(data_location, deploy_location):
if not os.path.exists(data_location):
print("The source directory does not exist.")
else:
try:
shutil.rmtree(f'{deploy_location}/data')
if os.path.exists(f'{deploy_location}/data'):
shutil.rmtree(f'{deploy_location}/data')
else:
pass
shutil.copytree(data_location, deploy_location, dirs_exist_ok=True)
print(f"Data successfully deployed")
except Exception as e:
print(f"Error occurred: {e}")
def server_deploy():
data_location = f'{settings.BASE_DIR}/deploy/'
deploy_location = settings.DEPLOY_CONFIG["DEPLOY_LOCATION"]+'/server'
copyData(data_location, deploy_location)
def github_deploy():
server_deploy()
print("Deploying via github")
git_commands = {}
git_commands["git_init"] = ['git', 'init']
git_commands["git_add"] = ['git', 'add', '.']
git_commands["git_commit"] = ['git', 'commit', '-m', '"Update website"']
git_commands["git_branch"] = ['git', 'branch', '-m', 'main']
git_commands["git_push"] = ['git', 'push', '-u', 'origin', 'main']
data_location = f'{settings.BASE_DIR}/deploy/'
deploy_location = settings.DEPLOY_CONFIG["DEPLOY_LOCATION"]+'/ghpages'
run_gh_build = ['npm', 'run', 'build:ghpages']
subprocess.run(run_gh_build, cwd=settings.DEPLOY_CONFIG["DEPLOY_LOCATION"].replace('/dist', ''), check=True, text=True, capture_output=True)
create_404_page(deploy_location)
copyData(data_location, deploy_location)
if not os.path.exists(f'{deploy_location}/.git'):
github_init(deploy_location, git_commands)
gh_pages_deploy(deploy_location, git_commands)
else:
gh_pages_deploy(deploy_location, git_commands)
def github_init(deploy_location, git_commands):
username = invokeDialogueBox('Github Deploy', 'Enter your username', 'text')
password = invokeDialogueBox('Github Deploy', 'Enter your password', 'password')
remote_url = f'https://{username}:{password}@github.com/{username}/{username}.github.io.git'
git_add_url = ['git', 'remote', 'add', 'origin', remote_url]
try:
subprocess.run(git_commands["git_init"], cwd=deploy_location, check=True, text=True, capture_output=True)
subprocess.run(git_commands["git_add"], cwd=deploy_location, check=True, text=True, capture_output=True)
subprocess.run(git_commands["git_commit"], cwd=deploy_location, check=True, text=True, capture_output=True)
subprocess.run(git_commands["git_branch"], cwd=deploy_location, check=True, text=True, capture_output=True)
subprocess.run(git_add_url, cwd=deploy_location, check=True, text=True, capture_output=True)
subprocess.run(git_commands["git_push"], cwd=deploy_location, check=True, text=True, capture_output=True)
except subprocess.CalledProcessError as e:
print (f"Failed to add remote: {e.stderr}")
except Exception as e:
print (f"An error occurred: {str(e)}")
def gh_pages_deploy(deploy_location, git_commands):
try:
subprocess.run(git_commands["git_add"], cwd=deploy_location, check=True, text=True, capture_output=True)
subprocess.run(git_commands["git_commit"], cwd=deploy_location, check=True, text=True, capture_output=True)
subprocess.run(git_commands["git_push"], cwd=deploy_location, check=True, text=True, capture_output=True)
except subprocess.CalledProcessError as e:
return f"Failed to add remote: {e.stderr}"
except Exception as e:
return f"An error occurred: {str(e)}"
def create_404_page(deploy_location):
html_content = """
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Single Page Apps for GitHub Pages</title>
<script type="text/javascript">
var pathSegmentsToKeep = 0;
var l = window.location;
l.replace(
l.protocol + '//' + l.hostname + (l.port ? ':' + l.port : '') +
l.pathname.split('/').slice(0, 1 + pathSegmentsToKeep).join('/') + '/?/' +
l.pathname.slice(1).split('/').slice(pathSegmentsToKeep).join('/').replace(/&/g, '~and~') +
(l.search ? '&' + l.search.slice(1).replace(/&/g, '~and~') : '') +
l.hash
);
</script>
</head>
<body>
</body>
</html>
"""
with open(f'{deploy_location}/404.html', 'w') as file:
file.write(html_content)
print("404 page created successfully.")

View File

@ -42,7 +42,7 @@ INSTALLED_APPS = [
]
DEPLOY_CONFIG = {
"DEPLOY_LOCATION": os.path.join(BASE_DIR, '../frontend-deploy/')
"DEPLOY_LOCATION": os.path.join(BASE_DIR, '../frontend/viewable-ui/dist')
}
REST_FRAMEWORK = {

View File

@ -40,6 +40,7 @@
"@types/react": "^18.2.66",
"@types/react-dom": "^18.2.22",
"@vitejs/plugin-react": "^4.2.1",
"cross-env": "^7.0.3",
"eslint": "^8.57.0",
"eslint-plugin-react": "^7.34.1",
"eslint-plugin-react-hooks": "^4.6.0",
@ -2318,6 +2319,24 @@
"integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==",
"peer": true
},
"node_modules/cross-env": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
"integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
"dev": true,
"dependencies": {
"cross-spawn": "^7.0.1"
},
"bin": {
"cross-env": "src/bin/cross-env.js",
"cross-env-shell": "src/bin/cross-env-shell.js"
},
"engines": {
"node": ">=10.14",
"npm": ">=6",
"yarn": ">=1"
}
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",

View File

@ -3,14 +3,13 @@
"private": true,
"version": "0.0.0",
"type": "module",
"proxy": "http://127.0.0.1:8000",
"homepage": "/",
"scripts": {
"dev": "vite --host 0.0.0.0 --port 3000",
"build": "vite build",
"build:server": "cross-env BUILD_ENV=server vite build",
"build:ghpages": "cross-env BUILD_ENV=ghpages cross-env vite build",
"lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview",
"deploy": "gh-pages -d dist"
"ghdeploy": "gh-pages -d dist/ghpages -r"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.5.2",
@ -45,6 +44,7 @@
"@types/react": "^18.2.66",
"@types/react-dom": "^18.2.22",
"@vitejs/plugin-react": "^4.2.1",
"cross-env": "^7.0.3",
"eslint": "^8.57.0",
"eslint-plugin-react": "^7.34.1",
"eslint-plugin-react-hooks": "^4.6.0",

View File

@ -61,7 +61,7 @@ function Blog(props) {
if (GlobalTheme && ThemeConfig) {
return (
<Container fluid className={`${ThemeConfig[GlobalTheme].background}`}>
<Col xs="3" className="d-none d-md-block"><Button color={ThemeConfig[GlobalTheme].buttonColor} onClick={() => navigate(`/categories/${blogData.parentCategory}`)} className="ms-5 mt-5" outline><FontAwesomeIcon icon={faLeftLong}/></Button></Col>
<Col xs="3" className="d-md-block"><Button color={ThemeConfig[GlobalTheme].buttonColor} onClick={() => navigate(`/categories/${blogData.parentCategory}`)} className="ms-5 mt-5" outline><FontAwesomeIcon icon={faLeftLong}/></Button></Col>
<CategoryBar currentPage={blogData.parentCategory} GlobalTheme={GlobalTheme} ThemeConfig={ThemeConfig}/>
<Row className="mb-4">
<Col className="p-0">

View File

@ -44,7 +44,7 @@ function HomePage(props) {
</Row>
<Row className={`mb-5 mt-2 ${ThemeConfig[GlobalTheme].textColor}`}>
<Col xs="3" className="d-none d-md-block"></Col>
<Col className="p-4 blogContent">
<Col className="blogContent">
<div className={`blogContent ${ThemeConfig[GlobalTheme].textColor}`}>{introContent}</div>
</Col>
<Col xs="3" className="d-none d-md-block"></Col>

View File

@ -1,10 +1,23 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
console.log(process.env.BUILD_ENV)
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
server: {
historyApiFallback: true
},
plugins: [
react(),
process.env.BUILD_ENV === 'ghpages' ? {
name: 'inject-ghpages-fix',
transformIndexHtml(html) {
return html.replace(
'<div id="root"></div>',
"<div id='root'></div><script type='text/javascript'>(function(l) {if (l.search[1] === '/' ) {var decoded = l.search.slice(1).split('&').map(function(s) {return s.replace(/~and~/g, '&')}).join('?');window.history.replaceState(null, null,l.pathname.slice(0, -1) + decoded + l.hash);}}(window.location))</script>"
);
}
} : ''
],
server: {},
build: {
outDir: 'dist/' + process.env.BUILD_ENV
}
})