diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml
index 48bc08dc..d0a77126 100644
--- a/.github/workflows/backend.yml
+++ b/.github/workflows/backend.yml
@@ -29,25 +29,18 @@ jobs:
- run: python -m PyInstaller --onefile app.py
- uses: actions/upload-artifact@v2
with:
- name: "server_${{ matrix.os }}"
+ name: "server_${{ runner.os }}"
path: backend/dist
- release:
+ docker-release:
if: github.ref == 'refs/heads/master'
-
- strategy:
- matrix:
- os: [ubuntu-latest]
-
- runs-on: ${{ matrix.os }}
-
+ runs-on: ubuntu-latest
needs: build
-
steps:
- uses: actions/checkout@v2
- uses: actions/download-artifact@v2
with:
- name: "server_${{ matrix.os }}"
+ name: server_Linux
path: backend/dist
- uses: docker/build-push-action@v1
with:
@@ -57,3 +50,58 @@ jobs:
registry: docker.pkg.github.com/polycortex/polydodo
repository: backend
tags: latest
+
+ release:
+ if: github.ref == 'refs/heads/master'
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - uses: actions/checkout@v2
+
+ - uses: release-drafter/release-drafter@v5
+ id: create_release
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ - uses: actions/download-artifact@v2
+ with:
+ name: server_Linux
+ path: backend/dist/linux
+ - run: chmod +x backend/dist/linux/app
+ - run: tar -pczvf linux.tar.gz -C backend/dist/linux app
+ - uses: actions/upload-release-asset@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ steps.create_release.outputs.upload_url }}
+ asset_path: ./linux.tar.gz
+ asset_name: polydodo_server_standalone_linux-x64.tar.gz
+ asset_content_type: application/octet-stream
+
+ - uses: actions/download-artifact@v2
+ with:
+ name: server_macOS
+ path: backend/dist/macos
+ - run: chmod +x backend/dist/macos/app
+ - run: tar -pczvf macos.tar.gz -C backend/dist/macos app
+ - uses: actions/upload-release-asset@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ steps.create_release.outputs.upload_url }}
+ asset_path: ./macos.tar.gz
+ asset_name: polydodo_server_standalone_macos-x64.tar.gz
+ asset_content_type: application/octet-stream
+
+ - uses: actions/download-artifact@v2
+ with:
+ name: server_Windows
+ path: backend/dist/windows
+ - uses: actions/upload-release-asset@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ steps.create_release.outputs.upload_url }}
+ asset_path: ./backend/dist/windows/app.exe
+ asset_name: polydodo_server_standalone_windows-x64.exe
+ asset_content_type: application/octet-stream
diff --git a/.github/workflows/delete-draft-release.yml b/.github/workflows/delete-draft-release.yml
new file mode 100644
index 00000000..964991e0
--- /dev/null
+++ b/.github/workflows/delete-draft-release.yml
@@ -0,0 +1,18 @@
+# This file exists because of https://github.com/actions/upload-release-asset/pull/22
+
+on:
+ push:
+ branches:
+ - master
+
+name: Delete Draft Releases
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Delete drafts
+ uses: hugo19941994/delete-draft-releases@v0.1.0
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/mobile.yml b/.github/workflows/mobile.yml
index 8ff28dc1..0d7f034c 100644
--- a/.github/workflows/mobile.yml
+++ b/.github/workflows/mobile.yml
@@ -31,11 +31,32 @@ jobs:
- run: flutter build apk
- uses: actions/upload-artifact@v2
with:
- name: Android app
- path: mobile/build/app/outputs/flutter-apk/app-release.apk
+ name: Android
+ path: mobile/build/app/outputs/flutter-apk
- - run: flutter build ios --release --no-codesign
- - uses: actions/upload-artifact@v2
+ - run: flutter build ios --no-codesign
+
+ release:
+ if: github.ref == 'refs/heads/master'
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - uses: actions/checkout@v2
+
+ - uses: release-drafter/release-drafter@v5
+ id: create_release
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ - uses: actions/download-artifact@v2
+ with:
+ name: Android
+ path: mobile/out
+ - uses: actions/upload-release-asset@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
- name: iOS app
- path: mobile/build/ios/iphoneos/Runner.app
+ upload_url: ${{ steps.create_release.outputs.upload_url }}
+ asset_path: ./mobile/out/app-release.apk
+ asset_name: polydodo_app_android.apk
+ asset_content_type: application/octet-stream
diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml
index 8c04845e..ccae1887 100644
--- a/.github/workflows/web.yml
+++ b/.github/workflows/web.yml
@@ -23,9 +23,9 @@ jobs:
path: web/build
release:
+ if: github.ref == 'refs/heads/master'
runs-on: ubuntu-latest
needs: build
- if: github.ref == 'refs/heads/master'
steps:
- uses: actions/checkout@v2
- uses: actions/download-artifact@v2
diff --git a/web/package.json b/web/package.json
index f61ccdf6..ebe28b96 100644
--- a/web/package.json
+++ b/web/package.json
@@ -23,6 +23,7 @@
"not op_mini all"
],
"dependencies": {
+ "@octokit/rest": "^18.0.6",
"argon-design-system-react": "^1.1.0",
"axios": "^0.20.0",
"axios-observable": "^1.1.3",
@@ -30,6 +31,7 @@
"classnames": "2.2.6",
"d3": "^5.16.0",
"d3-tip": "^0.9.1",
+ "detect-browser": "^5.2.0",
"headroom.js": "^0.11.0",
"luxon": "^1.25.0",
"node-sass": "4.14.1",
diff --git a/web/src/requests/latest_release.js b/web/src/requests/latest_release.js
new file mode 100644
index 00000000..83df49ee
--- /dev/null
+++ b/web/src/requests/latest_release.js
@@ -0,0 +1,29 @@
+import { Octokit } from '@octokit/rest';
+import { detect } from 'detect-browser';
+
+const octokit = new Octokit();
+
+const CURRENT_OS_NAME = detect().os;
+
+const ASSET_DISPLAYNAME_MAP = {
+ 'polydodo_server_standalone_linux-x64.tar.gz': 'Linux',
+ 'polydodo_server_standalone_macos-x64.tar.gz': 'Mac OS',
+ 'polydodo_server_standalone_windows-x64.exe': 'Windows',
+};
+
+const getPublishedReleases = async () => {
+ const releases = await octokit.repos.listReleases({ owner: 'polycortex', repo: 'polydodo' });
+ const publishedReleases = releases.data.filter((release) => !release.draft);
+ return publishedReleases;
+};
+
+export const getLatestServerReleaseAssets = async () => {
+ const latestRelease = (await getPublishedReleases())[0];
+ return latestRelease.assets
+ .filter((asset) => asset.name.startsWith('polydodo_server'))
+ .map((asset) => ({
+ name: ASSET_DISPLAYNAME_MAP[asset.name],
+ currentOs: CURRENT_OS_NAME.includes(ASSET_DISPLAYNAME_MAP[asset.name]),
+ url: asset.browser_download_url,
+ }));
+};
diff --git a/web/src/views/analyze_sleep/waiting_for_server/index.js b/web/src/views/analyze_sleep/waiting_for_server/index.js
index 19be741f..4a5a1854 100644
--- a/web/src/views/analyze_sleep/waiting_for_server/index.js
+++ b/web/src/views/analyze_sleep/waiting_for_server/index.js
@@ -1,15 +1,39 @@
-import React from 'react';
+import React, { useEffect, useState } from 'react';
import { Container, Row, Col, Spinner } from 'reactstrap';
+import { getLatestServerReleaseAssets } from 'requests/latest_release';
+import { ListGroup, ListGroupItem } from 'reactstrap';
-const WaitingForServer = () => (
-
- Waiting for local server to be running...
-
-
-
-
-
-
-);
+const WaitingForServer = () => {
+ const [assets, setAssets] = useState([]);
+
+ useEffect(() => {
+ getLatestServerReleaseAssets().then((assets) => setAssets(assets));
+ }, [setAssets]);
+
+ return (
+
+ Waiting for local server to be running...
+
+ Download latest server release
+
+
+
+ {assets.map((asset) => (
+
+ {asset.name}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+ );
+};
export default WaitingForServer;
diff --git a/web/yarn.lock b/web/yarn.lock
index 0af92a60..e5806366 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -1372,6 +1372,103 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+"@octokit/auth-token@^2.4.0":
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.2.tgz#10d0ae979b100fa6b72fa0e8e63e27e6d0dbff8a"
+ integrity sha512-jE/lE/IKIz2v1+/P0u4fJqv0kYwXOTujKemJMFr6FeopsxlIK3+wKDCJGnysg81XID5TgZQbIfuJ5J0lnTiuyQ==
+ dependencies:
+ "@octokit/types" "^5.0.0"
+
+"@octokit/core@^3.0.0":
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.2.0.tgz#7a872ad4cb8d8d2f417dd7fe1aaff3919c09dc04"
+ integrity sha512-42jzu1GWlCr4KUo52X4hD3if2AwjNJLzsS8mqUs9JkJbsM3vzvSx8AqTnVBQjOM0hQMYBqR7/7SAUTfH7IZqIg==
+ dependencies:
+ "@octokit/auth-token" "^2.4.0"
+ "@octokit/graphql" "^4.3.1"
+ "@octokit/request" "^5.4.0"
+ "@octokit/types" "^5.0.0"
+ before-after-hook "^2.1.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/endpoint@^6.0.1":
+ version "6.0.8"
+ resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.8.tgz#91b07e236fdb69929c678c6439f7a560dc6058ac"
+ integrity sha512-MuRrgv+bM4Q+e9uEvxAB/Kf+Sj0O2JAOBA131uo1o6lgdq1iS8ejKwtqHgdfY91V3rN9R/hdGKFiQYMzVzVBEQ==
+ dependencies:
+ "@octokit/types" "^5.0.0"
+ is-plain-object "^5.0.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/graphql@^4.3.1":
+ version "4.5.6"
+ resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.5.6.tgz#708143ba15cf7c1879ed6188266e7f270be805d4"
+ integrity sha512-Rry+unqKTa3svswT2ZAuqenpLrzJd+JTv89LTeVa5UM/5OX8o4KTkPL7/1ABq4f/ZkELb0XEK/2IEoYwykcLXg==
+ dependencies:
+ "@octokit/request" "^5.3.0"
+ "@octokit/types" "^5.0.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/plugin-paginate-rest@^2.2.0":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.4.0.tgz#92f951ddc8a1cd505353fa07650752ca25ed7e93"
+ integrity sha512-YT6Klz3LLH6/nNgi0pheJnUmTFW4kVnxGft+v8Itc41IIcjl7y1C8TatmKQBbCSuTSNFXO5pCENnqg6sjwpJhg==
+ dependencies:
+ "@octokit/types" "^5.5.0"
+
+"@octokit/plugin-request-log@^1.0.0":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.2.tgz#394d59ec734cd2f122431fbaf05099861ece3c44"
+ integrity sha512-oTJSNAmBqyDR41uSMunLQKMX0jmEXbwD1fpz8FG27lScV3RhtGfBa1/BBLym+PxcC16IBlF7KH9vP1BUYxA+Eg==
+
+"@octokit/plugin-rest-endpoint-methods@4.2.0":
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.2.0.tgz#c5a0691b3aba5d8b4ef5dffd6af3649608f167ba"
+ integrity sha512-1/qn1q1C1hGz6W/iEDm9DoyNoG/xdFDt78E3eZ5hHeUfJTLJgyAMdj9chL/cNBHjcjd+FH5aO1x0VCqR2RE0mw==
+ dependencies:
+ "@octokit/types" "^5.5.0"
+ deprecation "^2.3.1"
+
+"@octokit/request-error@^2.0.0":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.2.tgz#0e76b83f5d8fdda1db99027ea5f617c2e6ba9ed0"
+ integrity sha512-2BrmnvVSV1MXQvEkrb9zwzP0wXFNbPJij922kYBTLIlIafukrGOb+ABBT2+c6wZiuyWDH1K1zmjGQ0toN/wMWw==
+ dependencies:
+ "@octokit/types" "^5.0.1"
+ deprecation "^2.0.0"
+ once "^1.4.0"
+
+"@octokit/request@^5.3.0", "@octokit/request@^5.4.0":
+ version "5.4.9"
+ resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.9.tgz#0a46f11b82351b3416d3157261ad9b1558c43365"
+ integrity sha512-CzwVvRyimIM1h2n9pLVYfTDmX9m+KHSgCpqPsY8F1NdEK8IaWqXhSBXsdjOBFZSpEcxNEeg4p0UO9cQ8EnOCLA==
+ dependencies:
+ "@octokit/endpoint" "^6.0.1"
+ "@octokit/request-error" "^2.0.0"
+ "@octokit/types" "^5.0.0"
+ deprecation "^2.0.0"
+ is-plain-object "^5.0.0"
+ node-fetch "^2.6.1"
+ once "^1.4.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/rest@^18.0.6":
+ version "18.0.6"
+ resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.0.6.tgz#76c274f1a68f40741a131768ef483f041e7b98b6"
+ integrity sha512-ES4lZBKPJMX/yUoQjAZiyFjei9pJ4lTTfb9k7OtYoUzKPDLl/M8jiHqt6qeSauyU4eZGLw0sgP1WiQl9FYeM5w==
+ dependencies:
+ "@octokit/core" "^3.0.0"
+ "@octokit/plugin-paginate-rest" "^2.2.0"
+ "@octokit/plugin-request-log" "^1.0.0"
+ "@octokit/plugin-rest-endpoint-methods" "4.2.0"
+
+"@octokit/types@^5.0.0", "@octokit/types@^5.0.1", "@octokit/types@^5.5.0":
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/@octokit/types/-/types-5.5.0.tgz#e5f06e8db21246ca102aa28444cdb13ae17a139b"
+ integrity sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==
+ dependencies:
+ "@types/node" ">= 8"
+
"@svgr/babel-plugin-add-jsx-attribute@^4.2.0":
version "4.2.0"
resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1"
@@ -1556,6 +1653,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.2.tgz#2de1ed6670439387da1c9f549a2ade2b0a799256"
integrity sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==
+"@types/node@>= 8":
+ version "14.14.5"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.5.tgz#e92d3b8f76583efa26c1a63a21c9d3c1143daa29"
+ integrity sha512-H5Wn24s/ZOukBmDn03nnGTp18A60ny9AmCwnEcgJiTgSGsCO7k+NWP7zjCCbhlcnVCoI+co52dUAt9GMhOSULw==
+
"@types/parse-json@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
@@ -2403,6 +2505,11 @@ bcrypt-pbkdf@^1.0.0:
dependencies:
tweetnacl "^0.14.3"
+before-after-hook@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635"
+ integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==
+
big.js@^5.2.2:
version "5.2.2"
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
@@ -4005,6 +4112,11 @@ depd@~1.1.2:
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+deprecation@^2.0.0, deprecation@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
+ integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
+
des.js@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
@@ -4018,6 +4130,11 @@ destroy@~1.0.4:
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+detect-browser@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97"
+ integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA==
+
detect-newline@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
@@ -6144,6 +6261,11 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
+is-plain-object@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
+ integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
+
is-regex@^1.0.4, is-regex@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9"
@@ -7582,6 +7704,11 @@ node-fetch@^1.0.1:
encoding "^0.1.11"
is-stream "^1.0.1"
+node-fetch@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
+ integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
+
node-forge@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3"
@@ -11261,6 +11388,11 @@ unique-slug@^2.0.0:
dependencies:
imurmurhash "^0.1.4"
+universal-user-agent@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee"
+ integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==
+
universalify@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"