mirror of
https://github.com/outbackdingo/firezone.git
synced 2026-01-27 18:18:55 +00:00
refactor: Make published artifact names consistent and use permalinks (#4746)
```[tasklist] - [x] Update website - [x] Update blog entry with old link - [ ] ~~Replace Github URL in GUI Client updater with our own links~~ - [ ] Wait for CI to go green ``` Refs #4531 This proposes a unified scheme for deb and MSI packages, and moves Windows to that scheme. This breaks compatibility. Existing Clients won't recognize the new asset names once this is merged, so they won't show the "Firezone 1.0.0 is available" pop-up. --------- Co-authored-by: Jamil Bou Kheir <jamilbk@users.noreply.github.com>
This commit is contained in:
15
.github/workflows/_build_artifacts.yml
vendored
15
.github/workflows/_build_artifacts.yml
vendored
@@ -149,23 +149,23 @@ jobs:
|
||||
|
||||
arch:
|
||||
- target: x86_64-unknown-linux-musl
|
||||
shortname: x64
|
||||
shortname: x86_64
|
||||
platform: linux/amd64
|
||||
- target: aarch64-unknown-linux-musl # E.g. AWS Graviton
|
||||
shortname: arm64
|
||||
shortname: aarch64
|
||||
platform: linux/arm64
|
||||
- target: armv7-unknown-linux-musleabihf # E.g. Raspberry Pi
|
||||
platform: linux/arm/v7
|
||||
shortname: arm
|
||||
shortname: armv7
|
||||
name:
|
||||
- package: firezone-linux-client
|
||||
artifact: linux-client
|
||||
artifact: firezone-client-headless-linux
|
||||
image_name: client
|
||||
- package: firezone-relay
|
||||
artifact: relay
|
||||
artifact: firezone-relay
|
||||
image_name: relay
|
||||
- package: firezone-gateway
|
||||
artifact: gateway
|
||||
artifact: firezone-gateway
|
||||
image_name: gateway
|
||||
- package: snownet-tests
|
||||
artifact: snownet-tests
|
||||
@@ -174,7 +174,8 @@ jobs:
|
||||
artifact: http-test-server
|
||||
image_name: http-test-server
|
||||
env:
|
||||
BINARY_DEST_PATH: ${{ matrix.name.artifact }}-${{ matrix.arch.shortname }}
|
||||
# mark:automatic-version
|
||||
BINARY_DEST_PATH: ${{ matrix.name.artifact }}_1.0.0_${{ matrix.arch.shortname }}
|
||||
outputs:
|
||||
client_image: ${{ steps.image-name.outputs.client_image }}
|
||||
relay_image: ${{ steps.image-name.outputs.relay_image }}
|
||||
|
||||
14
.github/workflows/_tauri.yml
vendored
14
.github/workflows/_tauri.yml
vendored
@@ -36,12 +36,12 @@ jobs:
|
||||
syms-artifact: rust/gui-client/firezone-linux-gui-client-amd64.dwp
|
||||
pkg-artifact: rust/gui-client/firezone-linux-gui-client_amd64.deb
|
||||
- runs-on: windows-2019
|
||||
binary-dest-path: firezone-windows-client
|
||||
binary-dest-path: firezone-client-gui-windows
|
||||
rename-script: ../../scripts/build/tauri-rename-windows.sh
|
||||
upload-script: ../../scripts/build/tauri-upload-windows.sh
|
||||
exe-artifact: rust/gui-client/firezone-windows-client-x64.exe
|
||||
syms-artifact: rust/gui-client/firezone-windows-client-x64.pdb
|
||||
pkg-artifact: rust/gui-client/firezone-windows-client-x64.msi
|
||||
exe-artifact: rust/gui-client/firezone-client-gui-windows-x86_64.exe
|
||||
syms-artifact: rust/gui-client/firezone-client-gui-windows-x86_64.pdb
|
||||
pkg-artifact: rust/gui-client/firezone-client-gui-windows-x86_64.msi
|
||||
env:
|
||||
BINARY_DEST_PATH: ${{ matrix.binary-dest-path }}
|
||||
AZURE_KEY_VAULT_URI: ${{ secrets.AZURE_KEY_VAULT_URI }}
|
||||
@@ -83,21 +83,21 @@ jobs:
|
||||
- name: Upload exe
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ matrix.binary-dest-path }}-exe
|
||||
name: ${{ matrix.binary-dest-path }}-x86_64-exe
|
||||
path: |
|
||||
${{ matrix.exe-artifact }}
|
||||
if-no-files-found: error
|
||||
- name: Upload debug symbols
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ matrix.binary-dest-path }}-syms
|
||||
name: ${{ matrix.binary-dest-path }}-x86_64-syms
|
||||
path: |
|
||||
${{ matrix.syms-artifact }}
|
||||
if-no-files-found: error
|
||||
- name: Upload package
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ matrix.binary-dest-path }}-pkg
|
||||
name: ${{ matrix.binary-dest-path }}-x86_64-pkg
|
||||
path: |
|
||||
${{ matrix.pkg-artifact }}
|
||||
if-no-files-found: error
|
||||
|
||||
@@ -29,8 +29,9 @@ fn check_for_updates() -> Result<()> {
|
||||
client::logging::debug_command_setup()?;
|
||||
|
||||
let rt = tokio::runtime::Runtime::new().unwrap();
|
||||
let release = rt.block_on(client::updates::check());
|
||||
tracing::info!("{:?}", release.as_ref().map(serde_json::to_string));
|
||||
let release = rt.block_on(client::updates::check())?;
|
||||
tracing::info!("{:#?}", serde_json::to_string(&release));
|
||||
tracing::info!("{:?}", release.download_url());
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ use system_tray_menu::Event as TrayMenuEvent;
|
||||
use tauri::{Manager, SystemTray, SystemTrayEvent};
|
||||
use tokio::sync::{mpsc, oneshot, Notify};
|
||||
use tunnel_wrapper::CallbackHandler;
|
||||
use url::Url;
|
||||
|
||||
use ControllerRequest as Req;
|
||||
|
||||
@@ -403,16 +404,22 @@ async fn check_for_updates(ctlr_tx: CtlrTx, always_show_update_notification: boo
|
||||
let release = client::updates::check()
|
||||
.await
|
||||
.context("Error in client::updates::check")?;
|
||||
let Some(download_url) = release.download_url() else {
|
||||
tracing::warn!("No installer for this OS/arch online");
|
||||
return Ok(());
|
||||
};
|
||||
|
||||
let our_version = client::updates::current_version()?;
|
||||
let github_version = &release.tag_name;
|
||||
|
||||
if always_show_update_notification || (our_version < release.tag_name) {
|
||||
tracing::info!(?our_version, ?github_version, "Github has a new release");
|
||||
tracing::info!(?our_version, ?release.tag_name, "There is a new release");
|
||||
// We don't necessarily need to route through the Controller here, but if we
|
||||
// want a persistent "Click here to download the new MSI" button, this would allow that.
|
||||
ctlr_tx
|
||||
.send(ControllerRequest::UpdateAvailable(release))
|
||||
.send(ControllerRequest::UpdateAvailable {
|
||||
download_url: download_url.clone(),
|
||||
version_to_download: release.tag_name,
|
||||
})
|
||||
.await
|
||||
.context("Error while sending UpdateAvailable to Controller")?;
|
||||
return Ok(());
|
||||
@@ -420,8 +427,8 @@ async fn check_for_updates(ctlr_tx: CtlrTx, always_show_update_notification: boo
|
||||
|
||||
tracing::info!(
|
||||
?our_version,
|
||||
?github_version,
|
||||
"Our release is newer than, or the same as Github's latest"
|
||||
?release.tag_name,
|
||||
"Our release is newer than, or the same as, the latest"
|
||||
);
|
||||
Ok(())
|
||||
}
|
||||
@@ -474,8 +481,11 @@ pub(crate) enum ControllerRequest {
|
||||
SignIn,
|
||||
SystemTrayMenu(TrayMenuEvent),
|
||||
TunnelReady,
|
||||
UpdateAvailable(client::updates::Release),
|
||||
UpdateNotificationClicked(client::updates::Release),
|
||||
UpdateAvailable {
|
||||
download_url: Url,
|
||||
version_to_download: semver::Version,
|
||||
},
|
||||
UpdateNotificationClicked(Url),
|
||||
}
|
||||
|
||||
struct Controller {
|
||||
@@ -655,8 +665,11 @@ impl Controller {
|
||||
self.tunnel_ready = true;
|
||||
self.refresh_system_tray_menu()?;
|
||||
}
|
||||
Req::UpdateAvailable(release) => {
|
||||
let title = format!("Firezone {} available for download", release.tag_name);
|
||||
Req::UpdateAvailable {
|
||||
download_url,
|
||||
version_to_download,
|
||||
} => {
|
||||
let title = format!("Firezone {} available for download", version_to_download);
|
||||
|
||||
// We don't need to route through the controller here either, we could
|
||||
// use the `open` crate directly instead of Tauri's wrapper
|
||||
@@ -665,16 +678,12 @@ impl Controller {
|
||||
&title,
|
||||
"Click here to download the new version.",
|
||||
self.ctlr_tx.clone(),
|
||||
Req::UpdateNotificationClicked(release),
|
||||
Req::UpdateNotificationClicked(download_url),
|
||||
)?;
|
||||
}
|
||||
Req::UpdateNotificationClicked(release) => {
|
||||
Req::UpdateNotificationClicked(download_url) => {
|
||||
tracing::info!("UpdateNotificationClicked in run_controller!");
|
||||
tauri::api::shell::open(
|
||||
&self.app.shell_scope(),
|
||||
release.browser_download_url,
|
||||
None,
|
||||
)?;
|
||||
tauri::api::shell::open(&self.app.shell_scope(), download_url, None)?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
|
||||
@@ -1,58 +1,61 @@
|
||||
//! Module to check the Github repo for new releases
|
||||
|
||||
use crate::client::about::get_cargo_version;
|
||||
use std::{fmt, str::FromStr};
|
||||
use anyhow::Result;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::str::FromStr;
|
||||
use url::Url;
|
||||
|
||||
/// GUI-friendly release struct
|
||||
#[derive(serde::Serialize)]
|
||||
///
|
||||
/// Serialize is derived for debugging
|
||||
#[derive(Deserialize, Serialize)]
|
||||
pub(crate) struct Release {
|
||||
/// URL that will instantly try to download the MSI to disk
|
||||
/// All assets in a given release
|
||||
assets: Vec<Asset>,
|
||||
/// Git tag name / Cargo version name
|
||||
///
|
||||
/// e.g. <https://github.com/firezone/firezone/releases/download/1.0.0-pre.8/gui-client-x64.msi>
|
||||
pub browser_download_url: Url,
|
||||
/// Git tag name
|
||||
///
|
||||
/// e.g. 1.0.0-pre.8
|
||||
/// e.g. 1.0.1
|
||||
pub tag_name: semver::Version,
|
||||
}
|
||||
|
||||
impl Release {
|
||||
/// Parses the release JSON, finds the MSI asset, and returns info about the latest MSI
|
||||
fn from_str(s: &str) -> Result<Self, Error> {
|
||||
let ReleaseDetails { assets, tag_name } = serde_json::from_str(s)?;
|
||||
let asset = assets
|
||||
.into_iter()
|
||||
.find(|asset| asset.name == ASSET_NAME)
|
||||
.ok_or(Error::NoSuchAsset)?;
|
||||
|
||||
Ok(Release {
|
||||
browser_download_url: asset.browser_download_url,
|
||||
tag_name,
|
||||
})
|
||||
}
|
||||
#[derive(Deserialize, Serialize)]
|
||||
struct Asset {
|
||||
browser_download_url: Url,
|
||||
/// Name of the asset, e.g. `firezone-client-gui-windows-x86_64.msi`
|
||||
name: String,
|
||||
}
|
||||
|
||||
impl fmt::Debug for Release {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.debug_struct("Release")
|
||||
.field(
|
||||
"browser_download_url",
|
||||
&self.browser_download_url.to_string(),
|
||||
)
|
||||
.field("tag_name", &self.tag_name.to_string())
|
||||
.finish()
|
||||
impl Release {
|
||||
/// Download URL for current OS and arch
|
||||
pub fn download_url(&self) -> Option<&Url> {
|
||||
self.download_url_for(std::env::consts::ARCH, std::env::consts::OS)
|
||||
}
|
||||
|
||||
/// Download URL for the first asset that matches the given arch, OS, and package type
|
||||
fn download_url_for(&self, arch: &str, os: &str) -> Option<&Url> {
|
||||
let package = match os {
|
||||
"linux" => "deb",
|
||||
"macos" => "dmg", // Unused in practice
|
||||
"windows" => "msi",
|
||||
_ => panic!("Don't know what package this OS uses"),
|
||||
};
|
||||
|
||||
let prefix = format!("firezone-client-gui-{os}_");
|
||||
let suffix = format!("_{arch}.{package}");
|
||||
|
||||
let mut iter = self
|
||||
.assets
|
||||
.iter()
|
||||
.filter(|x| x.name.starts_with(&prefix) && x.name.ends_with(&suffix));
|
||||
iter.next().map(|asset| &asset.browser_download_url)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
pub(crate) enum Error {
|
||||
#[error("Non-OK HTTP status")]
|
||||
HttpStatus(reqwest::StatusCode),
|
||||
#[error(transparent)]
|
||||
JsonParse(#[from] serde_json::Error),
|
||||
#[error("No such asset `{ASSET_NAME}` in the latest release")]
|
||||
NoSuchAsset,
|
||||
#[error("Our own semver in the exe is invalid, this should be impossible")]
|
||||
OurVersionIsInvalid(semver::Error),
|
||||
#[error(transparent)]
|
||||
@@ -65,30 +68,14 @@ const LATEST_RELEASE_API_URL: &str =
|
||||
/// <https://docs.github.com/en/rest/about-the-rest-api/api-versions?apiVersion=2022-11-28>
|
||||
const GITHUB_API_VERSION: &str = "2022-11-28";
|
||||
|
||||
/// The name of the Windows MSI / Linux deb asset.
|
||||
///
|
||||
/// These ultimately come from `cd.yml`, `git grep WCPYPXZF`
|
||||
#[cfg(target_os = "linux")]
|
||||
const ASSET_NAME: &str = "firezone-linux-gui-client_amd64.deb";
|
||||
|
||||
/// Unused - The Tauri client is not supported for macOS
|
||||
#[cfg(target_os = "macos")]
|
||||
const ASSET_NAME: &str = "firezone-mac-unused-client_aarch64.dmg";
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
const ASSET_NAME: &str = "firezone-windows-client-x64.msi";
|
||||
|
||||
/// Returns the latest release, even if ours is already newer
|
||||
pub(crate) async fn check() -> Result<Release, Error> {
|
||||
pub(crate) async fn check() -> Result<Release> {
|
||||
let client = reqwest::Client::builder().build()?;
|
||||
let arch = std::env::consts::ARCH;
|
||||
let os = std::env::consts::OS;
|
||||
|
||||
// <https://docs.github.com/en/rest/using-the-rest-api/getting-started-with-the-rest-api?apiVersion=2022-11-28#user-agent-required>
|
||||
// This would change for aarch64 support
|
||||
let user_agent = format!(
|
||||
// TODO: remove 'windows'
|
||||
"Firezone Client/{:?} (Windows; Win64; x64)",
|
||||
current_version()
|
||||
);
|
||||
let user_agent = format!("Firezone Client/{:?} ({os}; {arch})", current_version());
|
||||
|
||||
// Reqwest follows up to 10 redirects by default
|
||||
// https://docs.rs/reqwest/latest/reqwest/struct.ClientBuilder.html#method.redirect
|
||||
@@ -101,11 +88,11 @@ pub(crate) async fn check() -> Result<Release, Error> {
|
||||
.await?;
|
||||
let status = response.status();
|
||||
if status != reqwest::StatusCode::OK {
|
||||
return Err(Error::HttpStatus(status));
|
||||
anyhow::bail!("HTTP status: {status}");
|
||||
}
|
||||
|
||||
let response = response.text().await?;
|
||||
Release::from_str(&response)
|
||||
Ok(serde_json::from_str(&response)?)
|
||||
}
|
||||
|
||||
// TODO: DRY with about.rs
|
||||
@@ -113,156 +100,109 @@ pub(crate) fn current_version() -> Result<semver::Version, Error> {
|
||||
semver::Version::from_str(&get_cargo_version()).map_err(Error::OurVersionIsInvalid)
|
||||
}
|
||||
|
||||
/// Deserializable struct that matches Github's JSON
|
||||
#[derive(serde::Deserialize)]
|
||||
struct ReleaseDetails {
|
||||
assets: Vec<Asset>,
|
||||
tag_name: semver::Version,
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
struct Asset {
|
||||
browser_download_url: Url,
|
||||
/// Name of the asset, e.g. `firezone-windows-client-x64.msi`
|
||||
name: String,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::str::FromStr;
|
||||
|
||||
/// A cut-down example of the real JSON from Github's API
|
||||
///
|
||||
/// The real one is about 32 KB, most of which is details about the assets,
|
||||
/// so it'll get bigger over time if new assets are added.
|
||||
///
|
||||
/// The GraphQL API couldn't be used because it needs a token.
|
||||
const RELEASES_LATEST_JSON: &str = r#"
|
||||
{
|
||||
"url": "https://api.github.com/repos/firezone/firezone/releases/138228264",
|
||||
"assets_url": "https://api.github.com/repos/firezone/firezone/releases/138228264/assets",
|
||||
"upload_url": "https://uploads.github.com/repos/firezone/firezone/releases/138228264/assets{?name,label}",
|
||||
"html_url": "https://github.com/firezone/firezone/releases/tag/1.0.0-pre.8",
|
||||
"id": 138228264,
|
||||
"author": {
|
||||
"login": "github-actions[bot]",
|
||||
"id": 41898282,
|
||||
"node_id": "MDM6Qm90NDE4OTgyODI=",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/github-actions%5Bbot%5D",
|
||||
"html_url": "https://github.com/apps/github-actions",
|
||||
"followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
|
||||
"following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
|
||||
"repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
|
||||
"events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
|
||||
"type": "Bot",
|
||||
"site_admin": false
|
||||
},
|
||||
"node_id": "RE_kwDOD12Hpc4IPTIo",
|
||||
"tag_name": "1.0.0-pre.8",
|
||||
"target_commitish": "refs/heads/main",
|
||||
"name": "1.0.0-pre.8",
|
||||
"draft": false,
|
||||
"prerelease": false,
|
||||
"created_at": "2024-01-24T00:23:23Z",
|
||||
"published_at": "2024-01-24T04:34:44Z",
|
||||
"assets": [
|
||||
{
|
||||
"url": "https://api.github.com/repos/firezone/firezone/releases/assets/147443613",
|
||||
"id": 147443613,
|
||||
"node_id": "RA_kwDOD12Hpc4Iyc-c",
|
||||
"name": "firezone-linux-gui-client_amd64.deb",
|
||||
"label": "",
|
||||
"uploader": {
|
||||
"login": "github-actions[bot]",
|
||||
"id": 41898282,
|
||||
"node_id": "MDM6Qm90NDE4OTgyODI=",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/github-actions%5Bbot%5D",
|
||||
"html_url": "https://github.com/apps/github-actions",
|
||||
"followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
|
||||
"following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
|
||||
"repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
|
||||
"events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
|
||||
"type": "Bot",
|
||||
"site_admin": false
|
||||
},
|
||||
"content_type": "application/octet-stream",
|
||||
"state": "uploaded",
|
||||
"size": 8376320,
|
||||
"download_count": 10,
|
||||
"created_at": "2024-01-24T04:33:53Z",
|
||||
"updated_at": "2024-01-24T04:33:53Z",
|
||||
"browser_download_url": "https://github.com/firezone/firezone/releases/download/1.0.0-pre.8/firezone-linux-gui-client_amd64.deb"
|
||||
},
|
||||
{
|
||||
"url": "https://api.github.com/repos/firezone/firezone/releases/assets/147443612",
|
||||
"id": 147443612,
|
||||
"node_id": "RA_kwDOD12Hpc4Iyc-c",
|
||||
"name": "firezone-windows-client-x64.msi",
|
||||
"label": "",
|
||||
"uploader": {
|
||||
"login": "github-actions[bot]",
|
||||
"id": 41898282,
|
||||
"node_id": "MDM6Qm90NDE4OTgyODI=",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
|
||||
"gravatar_id": "",
|
||||
"url": "https://api.github.com/users/github-actions%5Bbot%5D",
|
||||
"html_url": "https://github.com/apps/github-actions",
|
||||
"followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
|
||||
"following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
|
||||
"gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
|
||||
"starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
|
||||
"subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
|
||||
"organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
|
||||
"repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
|
||||
"events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
|
||||
"received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
|
||||
"type": "Bot",
|
||||
"site_admin": false
|
||||
},
|
||||
"content_type": "application/octet-stream",
|
||||
"state": "uploaded",
|
||||
"size": 8376320,
|
||||
"download_count": 10,
|
||||
"created_at": "2024-01-24T04:33:53Z",
|
||||
"updated_at": "2024-01-24T04:33:53Z",
|
||||
"browser_download_url": "https://github.com/firezone/firezone/releases/download/1.0.0-pre.8/firezone-windows-client-x64.msi"
|
||||
}
|
||||
]
|
||||
}"#;
|
||||
|
||||
#[test]
|
||||
fn test() {
|
||||
let asset_name = super::ASSET_NAME;
|
||||
let release = super::Release::from_str(RELEASES_LATEST_JSON).unwrap();
|
||||
let expected_url = format!(
|
||||
"https://github.com/firezone/firezone/releases/download/1.0.0-pre.8/{asset_name}"
|
||||
fn new_format() {
|
||||
let s = r#"
|
||||
{
|
||||
"tag_name": "1.0.0-pre.14",
|
||||
"assets": [
|
||||
{
|
||||
"name": "firezone-client-gui-linux_1.0.0-pre.14_aarch64.deb",
|
||||
"browser_download_url": "https://github.com/firezone/firezone/releases/download/1.0.0-pre.14/firezone-client-gui-linux_1.0.0-pre.14_aarch64.deb"
|
||||
},
|
||||
{
|
||||
"name": "firezone-client-gui-linux_1.0.0-pre.14_x86_64.deb",
|
||||
"browser_download_url": "https://github.com/firezone/firezone/releases/download/1.0.0-pre.14/firezone-client-gui-linux_1.0.0-pre.14_x86_64.deb"
|
||||
},
|
||||
{
|
||||
"name": "firezone-client-gui-windows_1.0.0-pre.14_aarch64.msi",
|
||||
"browser_download_url": "https://github.com/firezone/firezone/releases/download/1.0.0-pre.14/firezone-client-gui-windows_1.0.0-pre.14_aarch64.msi"
|
||||
},
|
||||
{
|
||||
"name": "firezone-client-gui-windows_1.0.0-pre.14_x86_64.msi",
|
||||
"browser_download_url": "https://github.com/firezone/firezone/releases/download/1.0.0-pre.14/firezone-client-gui-windows_1.0.0-pre.14_x86_64.msi"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "firezone-client-headless-linux_1.0.0-pre.14_aarch64.deb",
|
||||
"browser_download_url": "https://github.com/firezone/firezone/releases/download/1.0.0-pre.14/firezone-client-headless-linux_1.0.0-pre.14_aarch64.deb"
|
||||
},
|
||||
{
|
||||
"name": "firezone-client-headless-linux_1.0.0-pre.14_x86_64.deb",
|
||||
"browser_download_url": "https://github.com/firezone/firezone/releases/download/1.0.0-pre.14/firezone-client-headless-linux_1.0.0-pre.14_x86_64.deb"
|
||||
},
|
||||
{
|
||||
"name": "firezone-client-headless-windows_1.0.0-pre.14_aarch64.msi",
|
||||
"browser_download_url": "https://github.com/firezone/firezone/releases/download/1.0.0-pre.14/firezone-client-headless-windows_1.0.0-pre.14_aarch64.msi"
|
||||
},
|
||||
{
|
||||
"name": "firezone-client-headless-windows_1.0.0-pre.14_x86_64.msi",
|
||||
"browser_download_url": "https://github.com/firezone/firezone/releases/download/1.0.0-pre.14/firezone-client-headless-windows_1.0.0-pre.14_x86_64.msi"
|
||||
}
|
||||
]
|
||||
}"#;
|
||||
|
||||
let release: super::Release = serde_json::from_str(s).unwrap();
|
||||
let expected_url = "https://github.com/firezone/firezone/releases/download/1.0.0-pre.14/firezone-client-gui-windows_1.0.0-pre.14_x86_64.msi";
|
||||
assert_eq!(
|
||||
release
|
||||
.download_url_for("x86_64", "windows")
|
||||
.unwrap()
|
||||
.to_string(),
|
||||
expected_url
|
||||
);
|
||||
assert_eq!(release.browser_download_url.to_string(), expected_url);
|
||||
assert_eq!(release.tag_name.to_string(), "1.0.0-pre.8");
|
||||
assert_eq!(release.tag_name.to_string(), "1.0.0-pre.14");
|
||||
|
||||
assert!(
|
||||
semver::Version::from_str("1.0.0").unwrap()
|
||||
> semver::Version::from_str("1.0.0-pre.8").unwrap()
|
||||
> semver::Version::from_str("1.0.0-pre.14").unwrap()
|
||||
);
|
||||
assert!(
|
||||
semver::Version::from_str("1.0.0-pre.8").unwrap()
|
||||
semver::Version::from_str("1.0.0-pre.14").unwrap()
|
||||
> semver::Version::from_str("0.7.0").unwrap()
|
||||
);
|
||||
|
||||
assert!(super::current_version().is_ok());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pick_asset() {
|
||||
let asset_names = [
|
||||
"firezone-client-gui-linux_1.0.0-pre.14_aarch64.deb",
|
||||
"firezone-client-gui-linux_1.0.0-pre.14_x86_64.deb",
|
||||
"firezone-client-gui-windows_1.0.0-pre.14_aarch64.msi",
|
||||
"firezone-client-gui-windows_1.0.0-pre.14_x86_64.msi",
|
||||
"firezone-client-headless-linux_1.0.0-pre.14_aarch64.deb",
|
||||
"firezone-client-headless-linux_1.0.0-pre.14_x86_64.deb",
|
||||
"firezone-client-headless-windows_1.0.0-pre.14_aarch64.msi",
|
||||
"firezone-client-headless-windows_1.0.0-pre.14_x86_64.msi",
|
||||
"firezone-gateway-linux_1.0.0-pre.14_aarch64.deb",
|
||||
"firezone-gateway-linux_1.0.0-pre.14_x86_64.deb",
|
||||
"firezone-gateway-windows_1.0.0-pre.14_aarch64.msi",
|
||||
"firezone-gateway-windows_1.0.0-pre.14_x86_64.msi",
|
||||
];
|
||||
|
||||
let product = "client-gui";
|
||||
let arch = "x86_64";
|
||||
let os = "windows";
|
||||
let package = "msi";
|
||||
|
||||
let prefix = format!("firezone-{product}-{os}_");
|
||||
let suffix = format!("_{arch}.{package}");
|
||||
|
||||
let mut iter = asset_names
|
||||
.into_iter()
|
||||
.filter(|x| x.starts_with(&prefix) && x.ends_with(&suffix));
|
||||
let asset_name = iter.next().unwrap();
|
||||
assert!(iter.next().is_none());
|
||||
|
||||
assert_eq!(
|
||||
asset_name,
|
||||
"firezone-client-gui-windows_1.0.0-pre.14_x86_64.msi"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,10 +22,10 @@ android-version:
|
||||
@find kotlin/ -name "*.gradle.kts" -exec sed $(SEDARG) -e '/mark:automatic-version/{n;s/versionName =.*/versionName = "$(android-version)"/;}' {} \;
|
||||
|
||||
cargo-version:
|
||||
@find rust/ -name "Cargo.toml" -exec sed $(SEDARG) -e '/mark:automatic-version/{n;s/[0-9]*\.[0-9]*\.[0-9]*/$(rust-version)/;}' {} \;
|
||||
# TODO: This can fail on some platforms. You may need to specify the package
|
||||
# to avoid hitting the wrong codepaths for your platform.
|
||||
@cd rust && cargo check
|
||||
@# The website hosts permalinks to our published packages and binaries
|
||||
@find website/ -name "redirects.js" -exec sed $(SEDARG) -e '/mark:automatic-version/{n;s/[0-9]*\.[0-9]*\.[0-9]*/$(cargo-version)/g;}' {} \;
|
||||
@find rust/ -name "Cargo.toml" -exec sed $(SEDARG) -e '/mark:automatic-version/{n;s/[0-9]*\.[0-9]*\.[0-9]*/$(cargo-version)/;}' {} \;
|
||||
@cd rust && cargo update --workspace
|
||||
|
||||
ci-version:
|
||||
@find .github/ -name "*.yml" -exec sed $(SEDARG) -e '/mark:automatic-version/{n;s/[0-9]*\.[0-9]*\.[0-9]*/$(ci-version)/;}' {} \;
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
set -euox pipefail
|
||||
|
||||
# For debugging
|
||||
ls ../target/release ../target/release/bundle/msi
|
||||
|
||||
# Used for release artifact
|
||||
# In release mode the name comes from tauri.conf.json
|
||||
cp ../target/release/Firezone.exe "$BINARY_DEST_PATH-x64.exe"
|
||||
cp ../target/release/bundle/msi/*.msi "$BINARY_DEST_PATH-x64.msi"
|
||||
cp ../target/release/firezone_gui_client.pdb "$BINARY_DEST_PATH-x64.pdb"
|
||||
cp ../target/release/Firezone.exe "$BINARY_DEST_PATH-x86_64.exe"
|
||||
cp ../target/release/bundle/msi/*.msi "$BINARY_DEST_PATH-x86_64.msi"
|
||||
cp ../target/release/firezone_gui_client.pdb "$BINARY_DEST_PATH-x86_64.pdb"
|
||||
|
||||
function make_hash() {
|
||||
sha256sum "$1"> "$1.sha256sum.txt"
|
||||
}
|
||||
|
||||
make_hash "$BINARY_DEST_PATH-x64.exe"
|
||||
make_hash "$BINARY_DEST_PATH-x64.msi"
|
||||
make_hash "$BINARY_DEST_PATH-x64.pdb"
|
||||
make_hash "$BINARY_DEST_PATH-x86_64.exe"
|
||||
make_hash "$BINARY_DEST_PATH-x86_64.msi"
|
||||
make_hash "$BINARY_DEST_PATH-x86_64.pdb"
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
set -euox pipefail
|
||||
|
||||
# This artifact name is tied to the update checker in `gui-client/src-tauri/src/client/updates.rs`
|
||||
# So we can't put the version number in it until we stop using Github for update checks.
|
||||
gh release upload "$TAG_NAME" \
|
||||
"$BINARY_DEST_PATH"-x64.msi \
|
||||
"$BINARY_DEST_PATH"-x64.msi.sha256sum.txt \
|
||||
"$BINARY_DEST_PATH"_"$TAG_NAME"_x86_64.msi \
|
||||
"$BINARY_DEST_PATH"_"$TAG_NAME"_x86_64.msi.sha256sum.txt \
|
||||
--clobber \
|
||||
--repo "$REPOSITORY"
|
||||
|
||||
@@ -57,21 +57,9 @@ set -ue
|
||||
if [ ! -e /usr/local/bin/firezone-gateway ]; then
|
||||
echo "/usr/local/bin/firezone-gateway not found. Downloading latest version..."
|
||||
arch=\$(uname -m)
|
||||
case \$arch in
|
||||
aarch64)
|
||||
bin="gateway-arm64"
|
||||
;;
|
||||
armv7l)
|
||||
bin="gateway-arm"
|
||||
;;
|
||||
x86_64)
|
||||
bin="gateway-x64"
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported architecture"
|
||||
exit 1
|
||||
esac
|
||||
curl -Ls https://github.com/firezone/firezone/releases/latest/download/\$bin -o /usr/local/bin/firezone-gateway
|
||||
|
||||
# See https://www.github.com/firezone/firezone/releases for available binaries
|
||||
curl -fsSL https://www.firezone.dev/dl/firezone-gateway/latest/\$arch -o /usr/local/bin/firezone-gateway
|
||||
else
|
||||
echo "/usr/local/bin/firezone-gateway found. Skipping download."
|
||||
fi
|
||||
|
||||
@@ -4,6 +4,7 @@ import remarkGfm from "remark-gfm";
|
||||
import remarkParse from "remark-parse";
|
||||
import rehypeStringify from "rehype-stringify";
|
||||
import rehypeHighlight from "rehype-highlight";
|
||||
import redirects from "./redirects.js";
|
||||
|
||||
// Add IDs to headings
|
||||
import rehypeSlug from "rehype-slug";
|
||||
@@ -34,6 +35,9 @@ const nextConfig = {
|
||||
experimental: {
|
||||
typedRoutes: true,
|
||||
},
|
||||
async redirects() {
|
||||
return redirects;
|
||||
},
|
||||
// Proxy GitHub requests to avoid CORS issues
|
||||
async rewrites() {
|
||||
return [
|
||||
|
||||
142
website/redirects.js
Normal file
142
website/redirects.js
Normal file
@@ -0,0 +1,142 @@
|
||||
// Add all server-side redirects here. Will be loaded by next.config.mjs.
|
||||
|
||||
module.exports = [
|
||||
/*
|
||||
*
|
||||
* Windows Client
|
||||
*
|
||||
*/
|
||||
// latest
|
||||
{
|
||||
source: "/dl/firezone-client-gui-windows/latest/x86_64",
|
||||
destination:
|
||||
// mark:automatic-version
|
||||
"https://www.github.com/firezone/firezone/releases/download/1.0.0/firezone-client-gui-windows_1.0.0_x86_64.msi",
|
||||
permanent: false,
|
||||
},
|
||||
// versioned
|
||||
{
|
||||
source: "/dl/firezone-client-gui-windows/:version/x86_64",
|
||||
destination:
|
||||
"https://www.github.com/firezone/firezone/releases/download/:version/firezone-client-gui-windows_:version_x86_64.msi",
|
||||
permanent: false,
|
||||
},
|
||||
/*
|
||||
*
|
||||
* Linux Client
|
||||
*
|
||||
*/
|
||||
// latest
|
||||
{
|
||||
source: "/dl/firezone-client-gui-linux/latest/x86_64",
|
||||
destination:
|
||||
// mark:automatic-version
|
||||
"https://www.github.com/firezone/firezone/releases/download/1.0.0/firezone-client-gui-linux_1.0.0_x86_64.deb",
|
||||
permanent: false,
|
||||
},
|
||||
{
|
||||
source: "/dl/firezone-client-gui-linux/latest/aarch64",
|
||||
destination:
|
||||
// mark:automatic-version
|
||||
"https://www.github.com/firezone/firezone/releases/download/1.0.0/firezone-client-gui-linux_1.0.0_aarch64.deb",
|
||||
permanent: false,
|
||||
},
|
||||
{
|
||||
source: "/dl/firezone-client-headless-linux/latest/x86_64",
|
||||
destination:
|
||||
// mark:automatic-version
|
||||
"https://www.github.com/firezone/firezone/releases/download/1.0.0/firezone-client-headless-linux_1.0.0_x86_64",
|
||||
permanent: false,
|
||||
},
|
||||
{
|
||||
source: "/dl/firezone-client-headless-linux/latest/aarch64",
|
||||
destination:
|
||||
// mark:automatic-version
|
||||
"https://www.github.com/firezone/firezone/releases/download/1.0.0/firezone-client-headless-linux_1.0.0_aarch64",
|
||||
permanent: false,
|
||||
},
|
||||
{
|
||||
source: "/dl/firezone-client-headless-linux/latest/armv7",
|
||||
destination:
|
||||
// mark:automatic-version
|
||||
"https://www.github.com/firezone/firezone/releases/download/1.0.0/firezone-client-headless-linux_1.0.0_armv7",
|
||||
permanent: false,
|
||||
},
|
||||
// versioned
|
||||
{
|
||||
source: "/dl/firezone-client-gui-linux/:version/x86_64",
|
||||
destination:
|
||||
"https://www.github.com/firezone/firezone/releases/download/:version/firezone-client-gui-linux_:version_x86_64.deb",
|
||||
permanent: false,
|
||||
},
|
||||
{
|
||||
source: "/dl/firezone-client-gui-linux/:version/aarch64",
|
||||
destination:
|
||||
"https://www.github.com/firezone/firezone/releases/download/:version/firezone-client-gui-linux_:version_aarch64.deb",
|
||||
permanent: false,
|
||||
},
|
||||
{
|
||||
source: "/dl/firezone-client-headless-linux/:version/x86_64",
|
||||
destination:
|
||||
"https://www.github.com/firezone/firezone/releases/download/:version/firezone-client-headless-linux_:version_x86_64",
|
||||
permanent: false,
|
||||
},
|
||||
{
|
||||
source: "/dl/firezone-client-headless-linux/:version/aarch64",
|
||||
destination:
|
||||
"https://www.github.com/firezone/firezone/releases/download/:version/firezone-client-headless-linux_:version_aarch64",
|
||||
permanent: false,
|
||||
},
|
||||
{
|
||||
source: "/dl/firezone-client-headless-linux/:version/armv7",
|
||||
destination:
|
||||
"https://www.github.com/firezone/firezone/releases/download/:version/firezone-client-headless-linux_:version_armv7",
|
||||
permanent: false,
|
||||
},
|
||||
/*
|
||||
*
|
||||
* Gateway
|
||||
*
|
||||
*/
|
||||
// latest
|
||||
{
|
||||
source: "/dl/firezone-gateway/latest/x86_64",
|
||||
destination:
|
||||
// mark:automatic-version
|
||||
"https://www.github.com/firezone/firezone/releases/download/1.0.0/firezone-gateway_1.0.0_x86_64",
|
||||
permanent: false,
|
||||
},
|
||||
{
|
||||
source: "/dl/firezone-gateway/latest/aarch64",
|
||||
destination:
|
||||
// mark:automatic-version
|
||||
"https://www.github.com/firezone/firezone/releases/download/1.0.0/firezone-gateway_1.0.0_aarch64",
|
||||
permanent: false,
|
||||
},
|
||||
{
|
||||
source: "/dl/firezone-gateway/latest/armv7",
|
||||
destination:
|
||||
// mark:automatic-version
|
||||
"https://www.github.com/firezone/firezone/releases/download/1.0.0/firezone-gateway_1.0.0_armv7",
|
||||
permanent: false,
|
||||
},
|
||||
// versioned
|
||||
{
|
||||
source: "/dl/firezone-gateway/:version/x86_64",
|
||||
destination:
|
||||
"https://www.github.com/firezone/firezone/releases/download/:version/firezone-gateway_:version_x86_64",
|
||||
permanent: false,
|
||||
},
|
||||
{
|
||||
source: "/dl/firezone-gateway/:version/aarch64",
|
||||
destination:
|
||||
"https://www.github.com/firezone/firezone/releases/download/:version/firezone-gateway_:version_aarch64",
|
||||
permanent: false,
|
||||
},
|
||||
{
|
||||
source: "/dl/firezone-gateway/:version/armv7",
|
||||
destination:
|
||||
"https://www.github.com/firezone/firezone/releases/download/:version/firezone-gateway_:version_armv7",
|
||||
permanent: false,
|
||||
},
|
||||
];
|
||||
@@ -39,8 +39,7 @@ The Firezone Windows client is now available for beta testing!
|
||||
|
||||
You'll need Windows 10 or higher and an x86-64 CPU to run the client.
|
||||
[See the docs](/kb/user-guides/windows-client) for more information and download
|
||||
links, or use
|
||||
[this direct link](https://github.com/firezone/firezone/releases/latest/download/firezone-windows-client-x64.msi)
|
||||
links, or use [this direct link](/dl/firezone-client-gui-windows/latest/x86_64)
|
||||
to get started right away.
|
||||
|
||||
**Note**: Be sure to click **Allow** when prompted by the User Account Control
|
||||
|
||||
@@ -21,9 +21,9 @@ The Linux Client is currently in beta and can be downloaded from our
|
||||
[main repository's releases page](https://github.com/firezone/firezone/releases).
|
||||
Alternatively, download the latest Client binary using one of the links below:
|
||||
|
||||
- [Download the Linux Client for `x86-64`](https://github.com/firezone/firezone/releases/latest/download/linux-client-x64)
|
||||
- [Download the Linux Client for `ARMv7l`](https://github.com/firezone/firezone/releases/latest/download/linux-client-arm)
|
||||
- [Download the Linux Client for `ARM64`](https://github.com/firezone/firezone/releases/latest/download/linux-client-arm64)
|
||||
- [Download the Linux Client for `x86-64`](/dl/firezone-client-headless-linux/latest/x86_64)
|
||||
- [Download the Linux Client for `ARMv7l`](/dl/firezone-client-headless-linux/latest/armv7)
|
||||
- [Download the Linux Client for `ARM64`](/dl/firezone-client-headless/linux/latest/aarch64)
|
||||
|
||||
## Usage
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ architecture.
|
||||
The Windows Client is currently in beta and can be downloaded from the following
|
||||
link:
|
||||
|
||||
- [Download the MSI installer package](https://github.com/firezone/firezone/releases/latest/download/firezone-windows-client-x64.msi)
|
||||
- [Download the MSI installer package](/dl/firezone-client-gui-windows/latest/x86_64)
|
||||
|
||||
## Usage
|
||||
|
||||
|
||||
Reference in New Issue
Block a user