From c7bdb60d8579d75b1c4840fe792f17facc4c7b10 Mon Sep 17 00:00:00 2001 From: iceiix <43691553+iceiix@users.noreply.github.com> Date: Mon, 18 Jan 2021 19:05:29 -0800 Subject: [PATCH] CI enhancements: .app bundling, build .wasm (#486) Updates to enhance GitHub Actions continuous integration: * ci: add macOS app bundle packaging using cargo-bundle, closes #352 based on https://github.com/EndlessSkyCommunity/ESLauncher2/blob/master/Cargo.toml * ci: add web target, building using wasm-pack (for #446) * ci: refactor and cleanup targets, split out instead of using matrix * main: save config in consistent OS-specific dirs::config_dir() Instead of storing and loading in the current working directory, change to a consistent dedicated configuration directory. This is necessary for .app launching since cwd is set to /. To preserve compatibility with existing installations, if conf.cfg exists in cwd then it will be used instead, but otherwise we will use the operating system specific config dirs: // Lin: Some(/home/alice/.config) // Win: Some(C:\Users\Alice\AppData\Roaming) // Mac: Some(/Users/Alice/Library/Application Support) * macos: add icons based on screenshotted logo * macos: add Cmd-Q to quit --- .github/workflows/build.yaml | 145 +++++++++++++++++++++++++++++------ Cargo.lock | 73 ++++++++++++++++++ Cargo.toml | 8 ++ resources/icon128x128.png | Bin 0 -> 28093 bytes resources/icon32x32.png | Bin 0 -> 3686 bytes src/main.rs | 31 +++++--- 6 files changed, 224 insertions(+), 33 deletions(-) create mode 100644 resources/icon128x128.png create mode 100644 resources/icon32x32.png diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0a01eef..67818f2 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -3,15 +3,47 @@ on: push: jobs: - build: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: - - windows-latest - - ubuntu-latest - - macos-latest - fail-fast: true + linux: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + # TODO: refactor toolchain version + toolchain: 1.49.0 + components: clippy, rustfmt + default: true + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y libxcb-composite0-dev + - name: Build binary + run: | + cargo build --verbose --release + - name: Run clippy + uses: actions-rs/clippy-check@v1.0.7 + with: + token: ${{ secrets.GITHUB_TOKEN }} + args: --all-targets -- -D warnings + - name: Check formatting + run: cargo fmt --all -- --check + - name: Upload binary + uses: actions/upload-artifact@v2 + with: + name: stevenarella-linux + path: target/release/stevenarella + - name: Release binary + if: startsWith(github.ref, 'refs/tags/') + uses: softprops/action-gh-release@v1 + with: + files: | + stevenarella* + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + windows: + runs-on: windows-latest steps: - uses: actions/checkout@v2 - name: Install Rust @@ -20,14 +52,44 @@ jobs: toolchain: 1.49.0 components: clippy, rustfmt default: true - - name: Install dependencies - if: matrix.os == 'ubuntu-latest' - run: | - sudo apt-get update - sudo apt-get install -y libxcb-composite0-dev - name: Build binary run: | cargo build --verbose --release + - name: Run clippy + uses: actions-rs/clippy-check@v1.0.7 + with: + token: ${{ secrets.GITHUB_TOKEN }} + args: --all-targets -- -D warnings + - name: Check formatting + run: cargo fmt --all -- --check + - name: Upload binary + uses: actions/upload-artifact@v2 + with: + name: stevenarella.exe + path: target/release/stevenarella.exe + - name: Release binary + if: startsWith(github.ref, 'refs/tags/') + uses: softprops/action-gh-release@v1 + with: + files: | + target/release/stevenarella.exe + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + macos: + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: 1.49.0 + components: clippy, rustfmt + default: true + - name: Build binary + run: | + cargo build --verbose --release + chmod a+x target/release/stevenarella env: MACOSX_DEPLOYMENT_TARGET: 10.14 - name: Run clippy @@ -37,24 +99,59 @@ jobs: args: --all-targets -- -D warnings - name: Check formatting run: cargo fmt --all -- --check - - name: Move binary + - name: Package binary run: | - if [[ ${{ matrix.os }} == windows ]]; then - mv target/release/stevenarella.exe stevenarella-${{ matrix.os }}.exe - else - mv target/release/stevenarella stevenarella-${{ matrix.os }} - fi - shell: bash + cargo install cargo-bundle + cargo bundle --release + chmod a+x target/release/bundle/osx/Stevenarella.app/Contents/MacOS/stevenarella + cd target/release/bundle/osx + zip -r Stevenarella.app.zip Stevenarella.app - name: Upload binary uses: actions/upload-artifact@v2 with: - name: stevenarella-${{ matrix.os }} - path: stevenarella* + name: Stevenarella.app.zip + path: target/release/bundle/osx/Stevenarella.app.zip - name: Release binary if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v1 with: files: | - stevenarella* + target/release/bundle/osx/Stevenarella.app.zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + web: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + # TODO: refactor toolchain version + toolchain: 1.49.0 + components: clippy, rustfmt + default: true + - name: Install wasm-pack + uses: jetli/wasm-pack-action@v0.3.0 + with: + version: 'latest' + - name: Build binary + run: | + rustup target add wasm32-unknown-unknown + cargo install wasm-bindgen-cli + wasm-pack build --dev + - name: Upload binary + uses: actions/upload-artifact@v2 + with: + name: stevenarella.wasm + path: target/wasm32-unknown-unknown/debug/stevenarella.wasm + # TODO: npm bundle? or only the .wasm + - name: Release binary + if: startsWith(github.ref, 'refs/tags/') + uses: softprops/action-gh-release@v1 + with: + files: | + target/wasm32-unknown-unknown/debug/stevenarella.wasm + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + diff --git a/Cargo.lock b/Cargo.lock index 5c2c6e1..f279f8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -87,6 +87,18 @@ dependencies = [ "num-traits", ] +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + [[package]] name = "atty" version = "0.2.14" @@ -137,6 +149,17 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +[[package]] +name = "blake2b_simd" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + [[package]] name = "block" version = "0.1.6" @@ -389,6 +412,12 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + [[package]] name = "core-foundation" version = "0.7.0" @@ -597,6 +626,26 @@ dependencies = [ "generic-array", ] +[[package]] +name = "dirs" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142995ed02755914747cc6ca76fc7e4583cd18578746716d0508ea6ed558b9ff" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a" +dependencies = [ + "libc", + "redox_users", + "winapi 0.3.9", +] + [[package]] name = "dispatch" version = "0.2.0" @@ -2080,6 +2129,17 @@ version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +[[package]] +name = "redox_users" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +dependencies = [ + "getrandom 0.1.15", + "redox_syscall", + "rust-argon2", +] + [[package]] name = "remove_dir_all" version = "0.5.3" @@ -2134,6 +2194,18 @@ dependencies = [ "simple_asn1", ] +[[package]] +name = "rust-argon2" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" +dependencies = [ + "base64", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils", +] + [[package]] name = "rusttype" version = "0.9.2" @@ -2401,6 +2473,7 @@ dependencies = [ "clipboard", "collision", "console_error_panic_hook", + "dirs", "flate2", "getrandom 0.2.1", "glow", diff --git a/Cargo.toml b/Cargo.toml index 950e431..0ec33cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,13 @@ description = "Multi-protocol multi-platform Minecraft-compatible client" repository = "https://github.com/iceiix/stevenarella" license = "MIT/Apache-2.0" +[package.metadata.bundle] +name = "Stevenarella" +identifier = "io.github.iceiix.stevenarella" +icon = ["resources/icon*.png"] +category = "Game" +osx_minimum_system_version = "10.14" + [lib] crate-type = ["cdylib", "rlib"] path = "src/main.rs" @@ -40,6 +47,7 @@ rsa_public_encrypt_pkcs1 = "0.3.0" structopt = "0.3.21" clipboard = "0.5.0" instant = "0.1.9" +dirs = "3.0.1" # clippy = "*" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] diff --git a/resources/icon128x128.png b/resources/icon128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..30f8f219e5c36c2071452e707c9395f4534ca348 GIT binary patch literal 28093 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 literal 0 HcmV?d00001 diff --git a/resources/icon32x32.png b/resources/icon32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b4d8b4f89c2d7ae5a902273e86667bf63845baea GIT binary patch literal 3686 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 literal 0 HcmV?d00001 diff --git a/src/main.rs b/src/main.rs index 2615820..9a37304 100644 --- a/src/main.rs +++ b/src/main.rs @@ -209,14 +209,7 @@ cfg_if! { use glow::HasRenderLoop; extern crate console_error_panic_hook; pub use console_error_panic_hook::set_once as set_panic_hook; - } else { - #[inline] - pub fn set_panic_hook() {} - } -} -cfg_if! { - if #[cfg(target_arch = "wasm32")] { use wasm_bindgen::prelude::*; #[wasm_bindgen] @@ -227,11 +220,26 @@ cfg_if! { } } -fn main2() { - let opt = Opt::from_args(); +fn init_config_dir() { + if std::path::Path::new("conf.cfg").exists() { + return; + } + if let Some(mut path) = dirs::config_dir() { + path.push("Stevenarella"); + if !path.exists() { + std::fs::create_dir_all(path.clone()).unwrap(); + } + std::env::set_current_dir(path).unwrap(); + } +} + +fn main2() { + #[cfg(target_arch = "wasm32")] set_panic_hook(); + init_config_dir(); + let opt = Opt::from_args(); let con = Arc::new(Mutex::new(console::Console::new())); let proxy = console::ConsoleProxy::new(con.clone()); @@ -641,6 +649,11 @@ fn handle_window_event( if !game.focused && !game.is_ctrl_pressed && !game.is_logo_pressed { ui_container.key_type(game, codepoint); } + + #[cfg(target_os = "macos")] + if game.is_logo_pressed && codepoint == 'q' { + game.should_close = true; + } } WindowEvent::MouseInput { state, button, .. } => match (state, button) {