Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add frontend build #24

Merged
merged 6 commits into from
Oct 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 37 additions & 2 deletions .github/workflows/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ jobs:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain stable -y
echo "$HOME/.cargo/bin" >> $GITHUB_PATH

- name: Install build dependencies - Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.1.22

- name: Check style
run: cargo fmt --check

Expand All @@ -42,8 +47,31 @@ jobs:
- name: Build
run: cargo build --verbose

build-frontend:
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.1.22

- name: Install dependencies and build Bun project
run: |
cd ping-viewer-next-frontend
bun install --frozen-lockfile
bun run build

- name: Upload dist folder
uses: actions/[email protected]
with:
name: dist
path: ./ping-viewer-next-frontend/dist

build:
needs: quick-tests
needs: [quick-tests, build-frontend]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
Expand Down Expand Up @@ -73,11 +101,18 @@ jobs:
run: echo "${{ matrix.TARGET }}"

- uses: actions/checkout@master

- name: Download frontend build
uses: actions/[email protected]
with:
name: dist
path: ./ping-viewer-next-frontend/dist
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure if I follow, we are already building it with build.rs

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

currently we don't, only if the feature flag is enabled, so users only need to set npm/bun/front-end stuff if they want it.

The frontend is built only a single time and shared to the next actions to embeed it.

We have the flags:
build-frontend [embed-frontend]
and
embed-frontend itself

if this features isn't requested, it will only embed the simple .html on src/server/rest/

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not following. Why are we building this in a different step ?
And why are we not building it with build.rs on the step that we are downloading it ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not following. Why are we building this in a different step ? And why are we not building it with build.rs on the step that we are downloading it ?

To users choose if they want to setup the frontend related features on computer or not.
Also had issues to build the frontend on specific targets such armv7/aarch64 using Vue/Bun , and even we'll need to set an special container to cross compiling it inside.

So the built frontend is just embeded on the build steps.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just tested here, and a simple curl -fsSL https://bun.sh/install | bash should work.
Btw, we use bun in cockpit.


- name: Build
uses: houseabsolute/[email protected]
with:
target: ${{ matrix.TARGET }}
args: "--release"
args: "--release --features embed-frontend"

- name: Rename
run: cp target/${{ matrix.TARGET }}/release/${{ github.event.repository.name }}${{ matrix.EXTENSION }} ${{ github.event.repository.name }}-${{ matrix.TARGET }}${{ matrix.EXTENSION }}
Expand Down
2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,5 @@ path = "src/main.rs"
[features]
default = []
desktop-app = ["tauri"]
build-frontend = ["embed-frontend"]
embed-frontend =[]
39 changes: 39 additions & 0 deletions build.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
use vergen_gix::{BuildBuilder, CargoBuilder, DependencyKind, GixBuilder};

fn main() -> Result<(), Box<dyn std::error::Error>> {
generate_build_details()?;

#[cfg(feature = "build-frontend")]
build_web();

Ok(())
}

fn generate_build_details() -> Result<(), Box<dyn std::error::Error>> {
vergen_gix::Emitter::default()
.add_instructions(&BuildBuilder::all_build()?)?
.add_instructions(&GixBuilder::all_git()?)?
Expand All @@ -10,3 +19,33 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
.emit()?;
Ok(())
}

#[cfg(feature = "build-frontend")]
fn build_web() {
use std::{path::Path, process::Command};

// Note that as we are not watching all files, sometimes we'd need to force this build
println!("cargo:rerun-if-changed=./ping-viewer-next-frontend/dist");

let frontend_dir = Path::new("./ping-viewer-next-frontend/");
frontend_dir
.try_exists()
.expect("Frontend directory does not exist");

Command::new("bun")
.args(["--version"])
.status()
.expect("Failed to build frontend, `bun` appears to be not installed.");

Command::new("bun")
.args(["install", "--frozen-lockfile"])
.current_dir(frontend_dir)
.status()
.expect("Bun install failed!");

Command::new("bun")
.args(["run", "build"])
.current_dir(frontend_dir)
.status()
.expect("Bun build failed!");
}
4 changes: 4 additions & 0 deletions ping-viewer-next-frontend/.browserslistrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
> 1%
last 2 versions
not dead
not ie 11
76 changes: 76 additions & 0 deletions ping-viewer-next-frontend/.eslintrc-auto-import.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
{
"globals": {
"Component": true,
"ComponentPublicInstance": true,
"ComputedRef": true,
"EffectScope": true,
"ExtractDefaultPropTypes": true,
"ExtractPropTypes": true,
"ExtractPublicPropTypes": true,
"InjectionKey": true,
"PropType": true,
"Ref": true,
"VNode": true,
"WritableComputedRef": true,
"computed": true,
"createApp": true,
"customRef": true,
"defineAsyncComponent": true,
"defineComponent": true,
"effectScope": true,
"getCurrentInstance": true,
"getCurrentScope": true,
"h": true,
"inject": true,
"isProxy": true,
"isReactive": true,
"isReadonly": true,
"isRef": true,
"markRaw": true,
"nextTick": true,
"onActivated": true,
"onBeforeMount": true,
"onBeforeRouteLeave": true,
"onBeforeRouteUpdate": true,
"onBeforeUnmount": true,
"onBeforeUpdate": true,
"onDeactivated": true,
"onErrorCaptured": true,
"onMounted": true,
"onRenderTracked": true,
"onRenderTriggered": true,
"onScopeDispose": true,
"onServerPrefetch": true,
"onUnmounted": true,
"onUpdated": true,
"onWatcherCleanup": true,
"provide": true,
"reactive": true,
"readonly": true,
"ref": true,
"resolveComponent": true,
"shallowReactive": true,
"shallowReadonly": true,
"shallowRef": true,
"toRaw": true,
"toRef": true,
"toRefs": true,
"toValue": true,
"triggerRef": true,
"unref": true,
"useAttrs": true,
"useCssModule": true,
"useCssVars": true,
"useId": true,
"useLink": true,
"useModel": true,
"useRoute": true,
"useRouter": true,
"useSlots": true,
"useTemplateRef": true,
"watch": true,
"watchEffect": true,
"watchPostEffect": true,
"watchSyncEffect": true
}
}
16 changes: 16 additions & 0 deletions ping-viewer-next-frontend/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/**
* .eslint.js
*
* ESLint configuration file.
*/

module.exports = {
root: true,
env: {
node: true,
},
extends: ["vuetify", "./.eslintrc-auto-import.json"],
rules: {
"vue/multi-word-component-names": "off",
},
};
5 changes: 5 additions & 0 deletions ping-viewer-next-frontend/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
node_modules
/dist

# Editor directories and files
.vscode
8 changes: 8 additions & 0 deletions ping-viewer-next-frontend/.vite/deps/_metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"hash": "f30e6af8",
"configHash": "616d5c86",
"lockfileHash": "e3b0c442",
"browserHash": "b5f1b234",
"optimized": {},
"chunks": {}
}
3 changes: 3 additions & 0 deletions ping-viewer-next-frontend/.vite/deps/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"type": "module"
}
30 changes: 30 additions & 0 deletions ping-viewer-next-frontend/biome.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"$schema": "https://biomejs.dev/schemas/1.9.2/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"ignoreUnknown": false,
"ignore": []
},
"formatter": {
"enabled": true,
"indentStyle": "tab"
},
"organizeImports": {
"enabled": true
},
"linter": {
"enabled": true,
"rules": {
"recommended": true
}
},
"javascript": {
"formatter": {
"quoteStyle": "double"
}
}
}
Binary file added ping-viewer-next-frontend/bun.lockb
Binary file not shown.
14 changes: 14 additions & 0 deletions ping-viewer-next-frontend/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Ping Viewer Next</title>
</head>

<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
14 changes: 14 additions & 0 deletions ping-viewer-next-frontend/jsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"compilerOptions": {
"allowJs": true,
"target": "es5",
"module": "esnext",
"baseUrl": "./",
"moduleResolution": "bundler",
"paths": {
"@/*": ["src/*"],
"@components/*": ["src/components/*"]
},
"lib": ["esnext", "dom", "dom.iterable", "scripthost"]
}
}
Loading