feat: add fluxer upstream source and self-hosting documentation
- Clone of github.com/fluxerapp/fluxer (official upstream) - SELF_HOSTING.md: full VM rebuild procedure, architecture overview, service reference, step-by-step setup, troubleshooting, seattle reference - dev/.env.example: all env vars with secrets redacted and generation instructions - dev/livekit.yaml: LiveKit config template with placeholder keys - fluxer-seattle/: existing seattle deployment setup scripts
This commit is contained in:
39
fluxer/.github/DISCUSSION_TEMPLATE/ideas.yaml
vendored
Normal file
39
fluxer/.github/DISCUSSION_TEMPLATE/ideas.yaml
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for the suggestion.
|
||||
|
||||
For larger changes, please align with maintainers before investing time.
|
||||
Security issues should go to https://fluxer.app/security.
|
||||
- type: textarea
|
||||
id: problem
|
||||
attributes:
|
||||
label: Problem
|
||||
description: What problem are you trying to solve, and for whom?
|
||||
placeholder: "Right now, users can't ..., which causes ..."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: proposal
|
||||
attributes:
|
||||
label: Proposed solution
|
||||
description: What would you like to see happen?
|
||||
placeholder: "Add ..., so that ..."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: notes
|
||||
attributes:
|
||||
label: Notes (optional)
|
||||
description: Constraints, rough plan, or links to relevant code.
|
||||
placeholder: "Notes: ...\nPotential files/areas: ..."
|
||||
validations:
|
||||
required: false
|
||||
- type: checkboxes
|
||||
id: checks
|
||||
attributes:
|
||||
label: Checks
|
||||
options:
|
||||
- label: I searched for existing discussions and didn't find a duplicate.
|
||||
required: true
|
||||
57
fluxer/.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
57
fluxer/.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
name: Bug report
|
||||
description: Report a reproducible problem in Fluxer
|
||||
labels: ['bug']
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for the report.
|
||||
|
||||
Please check our status page at https://fluxerstatus.com and search for existing issues before filing.
|
||||
Security issues should go to https://fluxer.app/security.
|
||||
- type: textarea
|
||||
id: summary
|
||||
attributes:
|
||||
label: Summary
|
||||
description: What happened, and what did you expect instead?
|
||||
placeholder: "When I ..., the app ..., but I expected ..."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: repro
|
||||
attributes:
|
||||
label: Steps to reproduce
|
||||
description: Provide clear, numbered steps.
|
||||
placeholder: |
|
||||
1. Go to ...
|
||||
2. Click ...
|
||||
3. See ...
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: environment
|
||||
attributes:
|
||||
label: Environment (optional)
|
||||
description: Include versions that matter (commit/tag, OS, runtime, browser/device).
|
||||
placeholder: |
|
||||
- Commit/Tag:
|
||||
- OS:
|
||||
- Runtime:
|
||||
- Browser (if applicable):
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Logs or screenshots (optional)
|
||||
description: Paste logs (redact secrets) or attach screenshots/recordings.
|
||||
placeholder: "Paste stack traces, console output, network errors, etc."
|
||||
validations:
|
||||
required: false
|
||||
- type: checkboxes
|
||||
id: checks
|
||||
attributes:
|
||||
label: Checks
|
||||
options:
|
||||
- label: I searched for existing issues and didn't find a duplicate.
|
||||
required: true
|
||||
8
fluxer/.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
8
fluxer/.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Feature requests
|
||||
url: https://github.com/orgs/fluxerapp/discussions
|
||||
about: Suggest an improvement or new capability.
|
||||
- name: Security vulnerability report
|
||||
url: https://fluxer.app/security
|
||||
about: Please report security issues privately using our security policy.
|
||||
42
fluxer/.github/ISSUE_TEMPLATE/docs.yml
vendored
Normal file
42
fluxer/.github/ISSUE_TEMPLATE/docs.yml
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
name: Documentation
|
||||
description: Report a docs issue or suggest an improvement
|
||||
labels: ['docs']
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks.
|
||||
|
||||
Please check our status page at https://fluxerstatus.com and search for existing issues before filing.
|
||||
Security issues should go to https://fluxer.app/security.
|
||||
- type: textarea
|
||||
id: issue
|
||||
attributes:
|
||||
label: What needs fixing?
|
||||
description: Describe the gap, error, or outdated content.
|
||||
placeholder: "The README says ..., but actually ..."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: location
|
||||
attributes:
|
||||
label: Where is it? (optional)
|
||||
description: Link the file/section if possible.
|
||||
placeholder: "File: ...\nSection/heading: ...\nLink: ..."
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: suggestion
|
||||
attributes:
|
||||
label: Suggested wording (optional)
|
||||
description: If you already know how it should read, propose text.
|
||||
placeholder: "Proposed text: ..."
|
||||
validations:
|
||||
required: false
|
||||
- type: checkboxes
|
||||
id: checks
|
||||
attributes:
|
||||
label: Checks
|
||||
options:
|
||||
- label: I searched for existing issues and didn't find a duplicate.
|
||||
required: true
|
||||
32
fluxer/.github/pull_request_template.md
vendored
Normal file
32
fluxer/.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
## Summary
|
||||
|
||||
<!-- A few bullets is perfect: what changed, why it changed, and anything reviewers should pay attention to. -->
|
||||
|
||||
- **What:**
|
||||
- **Why:**
|
||||
- **Notes for reviewers:**
|
||||
|
||||
## How to verify
|
||||
|
||||
<!-- Concrete steps to validate the change. Include screenshots/recordings for UI changes when helpful. -->
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
## Tests
|
||||
|
||||
<!-- List what you ran, or explain why tests weren't added/changed. -->
|
||||
|
||||
- [ ] Added/updated unit tests (where it makes sense)
|
||||
- [ ] Manual verification:
|
||||
|
||||
## Checklist
|
||||
|
||||
- [ ] PR targets `canary`
|
||||
- [ ] PR title follows Conventional Commits (mostly lowercase)
|
||||
- [ ] CI is green (or I'm actively addressing failures)
|
||||
|
||||
## Screenshots / recordings (UI changes)
|
||||
|
||||
<!-- Drag and drop images/videos here. -->
|
||||
415
fluxer/.github/workflows/build-desktop.yaml
vendored
Normal file
415
fluxer/.github/workflows/build-desktop.yaml
vendored
Normal file
@@ -0,0 +1,415 @@
|
||||
name: build desktop
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
channel:
|
||||
description: Channel to build (stable or canary)
|
||||
required: false
|
||||
type: choice
|
||||
options:
|
||||
- stable
|
||||
- canary
|
||||
default: stable
|
||||
ref:
|
||||
description: Git ref to build (branch, tag, or commit SHA)
|
||||
required: false
|
||||
default: ''
|
||||
type: string
|
||||
skip_windows:
|
||||
description: Skip Windows builds
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
skip_macos:
|
||||
description: Skip macOS builds
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
skip_linux:
|
||||
description: Skip Linux builds
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
skip_windows_x64:
|
||||
description: Skip Windows x64 builds
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
skip_windows_arm64:
|
||||
description: Skip Windows ARM64 builds
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
skip_macos_x64:
|
||||
description: Skip macOS x64 builds
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
skip_macos_arm64:
|
||||
description: Skip macOS ARM64 builds
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
skip_linux_x64:
|
||||
description: Skip Linux x64 builds
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
skip_linux_arm64:
|
||||
description: Skip Linux ARM64 builds
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
concurrency:
|
||||
group: desktop-${{ inputs.channel }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
CHANNEL: ${{ inputs.channel }}
|
||||
BUILD_CHANNEL: ${{ inputs.channel == 'canary' && 'canary' || 'stable' }}
|
||||
|
||||
jobs:
|
||||
meta:
|
||||
name: Resolve build metadata
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
outputs:
|
||||
version: ${{ steps.meta.outputs.version }}
|
||||
pub_date: ${{ steps.meta.outputs.pub_date }}
|
||||
channel: ${{ steps.meta.outputs.channel }}
|
||||
build_channel: ${{ steps.meta.outputs.build_channel }}
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
sparse-checkout: scripts/ci
|
||||
sparse-checkout-cone-mode: false
|
||||
|
||||
- name: Set metadata
|
||||
id: meta
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/build_desktop.py
|
||||
--step set_metadata
|
||||
--channel "${{ inputs.channel }}"
|
||||
--ref "${{ inputs.ref }}"
|
||||
|
||||
matrix:
|
||||
name: Resolve build matrix
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
outputs:
|
||||
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
sparse-checkout: scripts/ci
|
||||
sparse-checkout-cone-mode: false
|
||||
|
||||
- name: Build platform matrix
|
||||
id: set-matrix
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/build_desktop.py
|
||||
--step set_matrix
|
||||
--skip-windows "${{ inputs.skip_windows }}"
|
||||
--skip-windows-x64 "${{ inputs.skip_windows_x64 }}"
|
||||
--skip-windows-arm64 "${{ inputs.skip_windows_arm64 }}"
|
||||
--skip-macos "${{ inputs.skip_macos }}"
|
||||
--skip-macos-x64 "${{ inputs.skip_macos_x64 }}"
|
||||
--skip-macos-arm64 "${{ inputs.skip_macos_arm64 }}"
|
||||
--skip-linux "${{ inputs.skip_linux }}"
|
||||
--skip-linux-x64 "${{ inputs.skip_linux_x64 }}"
|
||||
--skip-linux-arm64 "${{ inputs.skip_linux_arm64 }}"
|
||||
|
||||
build:
|
||||
name: Build ${{ matrix.platform }} (${{ matrix.arch }})
|
||||
needs:
|
||||
- meta
|
||||
- matrix
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 25
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix: ${{ fromJson(needs.matrix.outputs.matrix) }}
|
||||
env:
|
||||
CHANNEL: ${{ needs.meta.outputs.channel }}
|
||||
BUILD_CHANNEL: ${{ needs.meta.outputs.build_channel }}
|
||||
VERSION: ${{ needs.meta.outputs.version }}
|
||||
PUB_DATE: ${{ needs.meta.outputs.pub_date }}
|
||||
PLATFORM: ${{ matrix.platform }}
|
||||
ARCH: ${{ matrix.arch }}
|
||||
ELECTRON_ARCH: ${{ matrix.electron_arch }}
|
||||
steps:
|
||||
- name: Checkout source
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ inputs.ref || '' }}
|
||||
|
||||
- name: Shorten Windows paths (workspace + temp for Squirrel) and pin pnpm store
|
||||
if: runner.os == 'Windows'
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step windows_paths
|
||||
|
||||
- name: Set workdir (Unix)
|
||||
if: runner.os != 'Windows'
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step set_workdir_unix
|
||||
|
||||
- name: Set up pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 24
|
||||
|
||||
- name: Resolve pnpm store path (Windows)
|
||||
if: runner.os == 'Windows'
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step resolve_pnpm_store_windows
|
||||
|
||||
- name: Resolve pnpm store path (Unix)
|
||||
if: runner.os != 'Windows'
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step resolve_pnpm_store_unix
|
||||
|
||||
- name: Cache pnpm store
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.PNPM_STORE_PATH }}
|
||||
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pnpm-store-
|
||||
|
||||
- name: Install Python setuptools (Windows ARM64)
|
||||
if: matrix.platform == 'windows' && matrix.arch == 'arm64'
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step install_setuptools_windows_arm64
|
||||
|
||||
- name: Install Python setuptools (macOS)
|
||||
if: matrix.platform == 'macos'
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step install_setuptools_macos
|
||||
|
||||
- name: Install Linux dependencies
|
||||
if: matrix.platform == 'linux'
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step install_linux_deps
|
||||
|
||||
- name: Install dependencies
|
||||
working-directory: ${{ env.WORKDIR }}/fluxer_desktop
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step install_dependencies
|
||||
|
||||
- name: Update version
|
||||
working-directory: ${{ env.WORKDIR }}/fluxer_desktop
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step update_version
|
||||
|
||||
- name: Set build channel
|
||||
working-directory: ${{ env.WORKDIR }}/fluxer_desktop
|
||||
env:
|
||||
BUILD_CHANNEL: ${{ env.BUILD_CHANNEL }}
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step set_build_channel
|
||||
|
||||
- name: Build Electron main process
|
||||
working-directory: ${{ env.WORKDIR }}/fluxer_desktop
|
||||
env:
|
||||
BUILD_CHANNEL: ${{ env.BUILD_CHANNEL }}
|
||||
TURBO_API: https://turborepo.fluxer.dev
|
||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||
TURBO_TEAM: team_fluxer
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step build_electron_main
|
||||
|
||||
- name: Build Electron app (macOS)
|
||||
if: matrix.platform == 'macos'
|
||||
working-directory: ${{ env.WORKDIR }}/fluxer_desktop
|
||||
env:
|
||||
BUILD_CHANNEL: ${{ env.BUILD_CHANNEL }}
|
||||
CSC_LINK: ${{ secrets.APPLE_CERTIFICATE }}
|
||||
CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
|
||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step build_app_macos
|
||||
|
||||
- name: Verify macOS bundle ID (fail fast if wrong channel)
|
||||
if: matrix.platform == 'macos'
|
||||
working-directory: ${{ env.WORKDIR }}/fluxer_desktop
|
||||
env:
|
||||
BUILD_CHANNEL: ${{ env.BUILD_CHANNEL }}
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step verify_bundle_id
|
||||
|
||||
- name: Build Electron app (Windows)
|
||||
if: matrix.platform == 'windows'
|
||||
working-directory: ${{ env.WORKDIR }}/fluxer_desktop
|
||||
env:
|
||||
BUILD_CHANNEL: ${{ env.BUILD_CHANNEL }}
|
||||
TEMP: C:\t
|
||||
TMP: C:\t
|
||||
SQUIRREL_TEMP: C:\sq
|
||||
ELECTRON_BUILDER_CACHE: C:\ebcache
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step build_app_windows
|
||||
|
||||
- name: Analyze Squirrel nupkg for long paths
|
||||
if: matrix.platform == 'windows'
|
||||
working-directory: ${{ env.WORKDIR }}/fluxer_desktop
|
||||
env:
|
||||
BUILD_VERSION: ${{ env.VERSION }}
|
||||
MAX_WINDOWS_PATH_LEN: 260
|
||||
PATH_HEADROOM: 10
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step analyse_squirrel_paths
|
||||
|
||||
- name: Build Electron app (Linux)
|
||||
if: matrix.platform == 'linux'
|
||||
working-directory: ${{ env.WORKDIR }}/fluxer_desktop
|
||||
env:
|
||||
BUILD_CHANNEL: ${{ env.BUILD_CHANNEL }}
|
||||
USE_SYSTEM_FPM: true
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step build_app_linux
|
||||
|
||||
- name: Prepare artifacts (Windows)
|
||||
if: runner.os == 'Windows'
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step prepare_artifacts_windows
|
||||
|
||||
- name: Prepare artifacts (Unix)
|
||||
if: runner.os != 'Windows'
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step prepare_artifacts_unix
|
||||
|
||||
- name: Normalize updater YAML (arm64)
|
||||
if: matrix.arch == 'arm64'
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step normalise_updater_yaml
|
||||
|
||||
- name: Generate SHA256 checksums (Unix)
|
||||
if: runner.os != 'Windows'
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step generate_checksums_unix
|
||||
|
||||
- name: Generate SHA256 checksums (Windows)
|
||||
if: runner.os == 'Windows'
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/build_desktop.py
|
||||
--step generate_checksums_windows
|
||||
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: fluxer-desktop-${{ env.BUILD_CHANNEL }}-${{ matrix.platform }}-${{ matrix.arch }}
|
||||
path: |
|
||||
upload_staging/*.exe
|
||||
upload_staging/*.exe.blockmap
|
||||
upload_staging/*.exe.sha256
|
||||
upload_staging/*.dmg
|
||||
upload_staging/*.dmg.sha256
|
||||
upload_staging/*.zip
|
||||
upload_staging/*.zip.blockmap
|
||||
upload_staging/*.zip.sha256
|
||||
upload_staging/*.AppImage
|
||||
upload_staging/*.AppImage.sha256
|
||||
upload_staging/*.deb
|
||||
upload_staging/*.deb.sha256
|
||||
upload_staging/*.rpm
|
||||
upload_staging/*.rpm.sha256
|
||||
upload_staging/*.tar.gz
|
||||
upload_staging/*.tar.gz.sha256
|
||||
upload_staging/*.yml
|
||||
upload_staging/*.nupkg
|
||||
upload_staging/*.nupkg.blockmap
|
||||
upload_staging/*.nupkg.sha256
|
||||
upload_staging/RELEASES*
|
||||
retention-days: 30
|
||||
|
||||
upload:
|
||||
name: Upload to S3 (rclone)
|
||||
needs:
|
||||
- meta
|
||||
- build
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
env:
|
||||
CHANNEL: ${{ needs.meta.outputs.build_channel }}
|
||||
DISPLAY_CHANNEL: ${{ needs.meta.outputs.channel }}
|
||||
VERSION: ${{ needs.meta.outputs.version }}
|
||||
PUB_DATE: ${{ needs.meta.outputs.pub_date }}
|
||||
S3_ENDPOINT: https://s3.us-east-va.io.cloud.ovh.us
|
||||
S3_BUCKET: fluxer-downloads
|
||||
PUBLIC_DL_BASE: https://api.fluxer.app/dl
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
sparse-checkout: scripts/ci
|
||||
sparse-checkout-cone-mode: false
|
||||
|
||||
- name: Download all artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: artifacts
|
||||
pattern: fluxer-desktop-${{ needs.meta.outputs.build_channel }}-*
|
||||
|
||||
- name: Install rclone
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/build_desktop.py
|
||||
--step install_rclone
|
||||
|
||||
- name: Configure rclone (OVH S3)
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/build_desktop.py
|
||||
--step configure_rclone
|
||||
|
||||
- name: Build S3 payload layout (+ manifest.json)
|
||||
env:
|
||||
VERSION: ${{ needs.meta.outputs.version }}
|
||||
PUB_DATE: ${{ needs.meta.outputs.pub_date }}
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/build_desktop.py
|
||||
--step build_payload
|
||||
|
||||
- name: Upload payload to S3
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/build_desktop.py
|
||||
--step upload_payload
|
||||
|
||||
- name: Build summary
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/build_desktop.py
|
||||
--step build_summary
|
||||
48
fluxer/.github/workflows/channel-vars.yaml
vendored
Normal file
48
fluxer/.github/workflows/channel-vars.yaml
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
name: channel vars
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
github_event_name:
|
||||
type: string
|
||||
github_ref_name:
|
||||
type: string
|
||||
required: false
|
||||
workflow_dispatch_channel:
|
||||
type: string
|
||||
required: false
|
||||
|
||||
outputs:
|
||||
channel:
|
||||
description: 'Computed release channel (stable|canary)'
|
||||
value: ${{ jobs.emit.outputs.channel }}
|
||||
is_canary:
|
||||
description: 'Whether this is a canary deploy (true|false)'
|
||||
value: ${{ jobs.emit.outputs.is_canary }}
|
||||
stack_suffix:
|
||||
description: "Suffix for stack/image names ('' or '-canary')"
|
||||
value: ${{ jobs.emit.outputs.stack_suffix }}
|
||||
|
||||
jobs:
|
||||
emit:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 25
|
||||
outputs:
|
||||
channel: ${{ steps.compute.outputs.channel }}
|
||||
is_canary: ${{ steps.compute.outputs.is_canary }}
|
||||
stack_suffix: ${{ steps.compute.outputs.stack_suffix }}
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
sparse-checkout: scripts/ci
|
||||
sparse-checkout-cone-mode: false
|
||||
|
||||
- name: Determine channel
|
||||
id: compute
|
||||
shell: bash
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/channel_vars.py
|
||||
--event-name "${{ inputs.github_event_name }}"
|
||||
--ref-name "${{ inputs.github_ref_name || '' }}"
|
||||
--dispatch-channel "${{ inputs.workflow_dispatch_channel || '' }}"
|
||||
137
fluxer/.github/workflows/ci.yaml
vendored
Normal file
137
fluxer/.github/workflows/ci.yaml
vendored
Normal file
@@ -0,0 +1,137 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, reopened, synchronize]
|
||||
|
||||
jobs:
|
||||
typecheck:
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Install Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '24'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: python3 scripts/ci/workflows/ci.py --step install_dependencies
|
||||
|
||||
- name: Run typecheck
|
||||
run: python3 scripts/ci/workflows/ci.py --step typecheck
|
||||
env:
|
||||
TURBO_API: https://turborepo.fluxer.dev
|
||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||
TURBO_TEAM: team_fluxer
|
||||
|
||||
test:
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Install Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '24'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: python3 scripts/ci/workflows/ci.py --step install_dependencies
|
||||
|
||||
- name: Run tests
|
||||
run: python3 scripts/ci/workflows/ci.py --step test
|
||||
env:
|
||||
FLUXER_CONFIG: config/config.test.json
|
||||
TURBO_API: https://turborepo.fluxer.dev
|
||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||
TURBO_TEAM: team_fluxer
|
||||
|
||||
gateway:
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Set up Erlang
|
||||
uses: erlef/setup-beam@v1
|
||||
with:
|
||||
otp-version: '28'
|
||||
rebar3-version: '3.24.0'
|
||||
|
||||
- name: Cache rebar3 dependencies
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
fluxer_gateway/_build
|
||||
~/.cache/rebar3
|
||||
key: rebar3-${{ runner.os }}-${{ hashFiles('fluxer_gateway/rebar.lock') }}
|
||||
restore-keys: |
|
||||
rebar3-${{ runner.os }}-
|
||||
|
||||
- name: Compile
|
||||
run: python3 scripts/ci/workflows/ci.py --step gateway_compile
|
||||
|
||||
- name: Run dialyzer
|
||||
run: python3 scripts/ci/workflows/ci.py --step gateway_dialyzer
|
||||
|
||||
- name: Run eunit tests
|
||||
run: python3 scripts/ci/workflows/ci.py --step gateway_eunit
|
||||
env:
|
||||
FLUXER_CONFIG: ../config/config.test.json
|
||||
|
||||
knip:
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Install Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '24'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: python3 scripts/ci/workflows/ci.py --step install_dependencies
|
||||
|
||||
- name: Run knip
|
||||
run: python3 scripts/ci/workflows/ci.py --step knip
|
||||
env:
|
||||
TURBO_API: https://turborepo.fluxer.dev
|
||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||
TURBO_TEAM: team_fluxer
|
||||
|
||||
ci-scripts:
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Set up uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
with:
|
||||
python-version: "3.12"
|
||||
|
||||
- name: Sync ci python dependencies
|
||||
run: python3 scripts/ci/workflows/ci_scripts.py --step sync
|
||||
|
||||
- name: Run ci python tests
|
||||
run: python3 scripts/ci/workflows/ci_scripts.py --step test
|
||||
112
fluxer/.github/workflows/deploy-admin.yaml
vendored
Normal file
112
fluxer/.github/workflows/deploy-admin.yaml
vendored
Normal file
@@ -0,0 +1,112 @@
|
||||
name: deploy admin
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- canary
|
||||
paths:
|
||||
- fluxer_admin/**
|
||||
- .github/workflows/deploy-admin.yaml
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
channel:
|
||||
type: choice
|
||||
options:
|
||||
- stable
|
||||
- canary
|
||||
default: stable
|
||||
description: Release channel to deploy
|
||||
ref:
|
||||
type: string
|
||||
required: false
|
||||
default: ''
|
||||
description: Optional git ref (defaults to the triggering branch)
|
||||
|
||||
concurrency:
|
||||
group: deploy-fluxer-admin-${{ github.event_name == 'workflow_dispatch' && inputs.channel || (github.ref_name == 'canary' && 'canary') || 'stable' }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
jobs:
|
||||
channel-vars:
|
||||
uses: ./.github/workflows/channel-vars.yaml
|
||||
with:
|
||||
github_event_name: ${{ github.event_name }}
|
||||
github_ref_name: ${{ github.ref_name }}
|
||||
workflow_dispatch_channel: ${{ github.event_name == 'workflow_dispatch' && inputs.channel || '' }}
|
||||
|
||||
deploy:
|
||||
name: Deploy admin
|
||||
needs: channel-vars
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
env:
|
||||
CHANNEL: ${{ needs.channel-vars.outputs.channel }}
|
||||
IS_CANARY: ${{ needs.channel-vars.outputs.is_canary }}
|
||||
STACK_SUFFIX: ${{ needs.channel-vars.outputs.stack_suffix }}
|
||||
STACK: ${{ format('fluxer-admin{0}', needs.channel-vars.outputs.stack_suffix) }}
|
||||
CACHE_SCOPE: ${{ format('deploy-fluxer-admin{0}', needs.channel-vars.outputs.stack_suffix) }}
|
||||
CADDY_DOMAIN: ${{ needs.channel-vars.outputs.is_canary == 'true' && 'admin.canary.fluxer.app' || 'admin.fluxer.app' }}
|
||||
REPLICAS: ${{ needs.channel-vars.outputs.is_canary == 'true' && 1 || 2 }}
|
||||
RELEASE_CHANNEL: ${{ needs.channel-vars.outputs.channel }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ inputs.ref || '' }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Record deploy commit
|
||||
run: python3 scripts/ci/workflows/deploy_admin.py --step record_deploy_commit
|
||||
|
||||
- name: Set build timestamp
|
||||
run: python3 scripts/ci/workflows/deploy_admin.py --step set_build_timestamp
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||
|
||||
- name: Build image
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
file: fluxer_admin/Dockerfile
|
||||
tags: ${{ env.STACK }}:${{ env.DEPLOY_SHA }}
|
||||
load: true
|
||||
platforms: linux/amd64
|
||||
cache-from: type=gha,scope=${{ env.CACHE_SCOPE }}
|
||||
cache-to: type=gha,mode=max,scope=${{ env.CACHE_SCOPE }}
|
||||
build-args: |
|
||||
BUILD_SHA=${{ env.DEPLOY_SHA }}
|
||||
BUILD_NUMBER=${{ github.run_number }}
|
||||
BUILD_TIMESTAMP=${{ env.BUILD_TIMESTAMP }}
|
||||
RELEASE_CHANNEL=${{ env.RELEASE_CHANNEL }}
|
||||
env:
|
||||
DOCKER_BUILD_SUMMARY: false
|
||||
DOCKER_BUILD_RECORD_UPLOAD: false
|
||||
|
||||
- name: Install docker-pussh
|
||||
run: python3 scripts/ci/workflows/deploy_admin.py --step install_docker_pussh
|
||||
|
||||
- name: Set up SSH agent
|
||||
uses: webfactory/ssh-agent@v0.9.1
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_SERVER }}
|
||||
|
||||
- name: Add server to known hosts
|
||||
run: python3 scripts/ci/workflows/deploy_admin.py --step add_known_hosts --server-ip ${{ secrets.SERVER_IP }}
|
||||
|
||||
- name: Push image and deploy
|
||||
env:
|
||||
IMAGE_TAG: ${{ env.STACK }}:${{ env.DEPLOY_SHA }}
|
||||
SERVER: ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}
|
||||
STACK: ${{ env.STACK }}
|
||||
CADDY_DOMAIN: ${{ env.CADDY_DOMAIN }}
|
||||
REPLICAS: ${{ env.REPLICAS }}
|
||||
run: python3 scripts/ci/workflows/deploy_admin.py --step push_and_deploy
|
||||
119
fluxer/.github/workflows/deploy-api.yaml
vendored
Normal file
119
fluxer/.github/workflows/deploy-api.yaml
vendored
Normal file
@@ -0,0 +1,119 @@
|
||||
name: deploy api
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- canary
|
||||
paths:
|
||||
- fluxer_api/**
|
||||
- .github/workflows/deploy-api.yaml
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
channel:
|
||||
type: choice
|
||||
options:
|
||||
- stable
|
||||
- canary
|
||||
default: stable
|
||||
description: Release channel to deploy
|
||||
ref:
|
||||
type: string
|
||||
required: false
|
||||
default: ''
|
||||
description: Optional git ref (defaults to the triggering branch)
|
||||
|
||||
concurrency:
|
||||
group: deploy-fluxer-api-${{ github.event_name == 'workflow_dispatch' && inputs.channel || (github.ref_name == 'canary' && 'canary') || 'stable' }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
channel-vars:
|
||||
uses: ./.github/workflows/channel-vars.yaml
|
||||
with:
|
||||
github_event_name: ${{ github.event_name }}
|
||||
github_ref_name: ${{ github.ref_name }}
|
||||
workflow_dispatch_channel: ${{ github.event_name == 'workflow_dispatch' && inputs.channel || '' }}
|
||||
|
||||
deploy:
|
||||
name: Deploy api
|
||||
needs: channel-vars
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
env:
|
||||
CHANNEL: ${{ needs.channel-vars.outputs.channel }}
|
||||
IS_CANARY: ${{ needs.channel-vars.outputs.is_canary }}
|
||||
STACK_SUFFIX: ${{ needs.channel-vars.outputs.stack_suffix }}
|
||||
|
||||
STACK: ${{ format('fluxer-api{0}', needs.channel-vars.outputs.stack_suffix) }}
|
||||
WORKER_STACK: fluxer-api-worker
|
||||
CANARY_WORKER_REPLICAS: 3
|
||||
CACHE_SCOPE: ${{ format('deploy-fluxer-api{0}', needs.channel-vars.outputs.stack_suffix) }}
|
||||
|
||||
CADDY_DOMAIN: ${{ needs.channel-vars.outputs.is_canary == 'true' && 'api.canary.fluxer.app' || 'api.fluxer.app' }}
|
||||
RELEASE_CHANNEL: ${{ needs.channel-vars.outputs.channel }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ inputs.ref || '' }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Record deploy commit
|
||||
run: python3 scripts/ci/workflows/deploy_api.py --step record_deploy_commit
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||
|
||||
- name: Build image(s)
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
file: fluxer_api/Dockerfile
|
||||
tags: |
|
||||
${{ env.STACK }}:${{ env.DEPLOY_SHA }}
|
||||
${{ env.WORKER_STACK }}:${{ env.DEPLOY_SHA }}
|
||||
load: true
|
||||
platforms: linux/amd64
|
||||
cache-from: type=gha,scope=${{ env.CACHE_SCOPE }}
|
||||
cache-to: type=gha,mode=max,scope=${{ env.CACHE_SCOPE }}
|
||||
build-args: |
|
||||
BUILD_SHA=${{ env.SENTRY_BUILD_SHA }}
|
||||
BUILD_NUMBER=${{ env.SENTRY_BUILD_NUMBER }}
|
||||
BUILD_TIMESTAMP=${{ env.SENTRY_BUILD_TIMESTAMP }}
|
||||
RELEASE_CHANNEL=${{ env.RELEASE_CHANNEL }}
|
||||
env:
|
||||
DOCKER_BUILD_SUMMARY: false
|
||||
DOCKER_BUILD_RECORD_UPLOAD: false
|
||||
|
||||
- name: Install docker-pussh
|
||||
run: python3 scripts/ci/workflows/deploy_api.py --step install_docker_pussh
|
||||
|
||||
- name: Set up SSH agent
|
||||
uses: webfactory/ssh-agent@v0.9.1
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_SERVER }}
|
||||
|
||||
- name: Add server to known hosts
|
||||
run: python3 scripts/ci/workflows/deploy_api.py --step add_known_hosts --server-ip ${{ secrets.SERVER_IP }}
|
||||
|
||||
- name: Push image(s) and deploy
|
||||
env:
|
||||
SERVER: ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}
|
||||
IMAGE_TAG_APP: ${{ env.STACK }}:${{ env.DEPLOY_SHA }}
|
||||
IMAGE_TAG_WORKER: ${{ env.WORKER_STACK }}:${{ env.DEPLOY_SHA }}
|
||||
CANARY_WORKER_REPLICAS: ${{ env.CANARY_WORKER_REPLICAS }}
|
||||
SENTRY_BUILD_SHA: ${{ env.SENTRY_BUILD_SHA }}
|
||||
SENTRY_BUILD_NUMBER: ${{ env.SENTRY_BUILD_NUMBER }}
|
||||
SENTRY_BUILD_TIMESTAMP: ${{ env.SENTRY_BUILD_TIMESTAMP }}
|
||||
RELEASE_CHANNEL: ${{ env.CHANNEL }}
|
||||
SENTRY_RELEASE: ${{ format('fluxer-api@{0}', env.SENTRY_BUILD_SHA) }}
|
||||
run: python3 scripts/ci/workflows/deploy_api.py --step push_and_deploy
|
||||
191
fluxer/.github/workflows/deploy-app.yaml
vendored
Normal file
191
fluxer/.github/workflows/deploy-app.yaml
vendored
Normal file
@@ -0,0 +1,191 @@
|
||||
name: deploy app
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- canary
|
||||
paths:
|
||||
- fluxer_app/**
|
||||
- fluxer_app_proxy/**
|
||||
- .github/workflows/deploy-app.yaml
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
channel:
|
||||
type: choice
|
||||
options:
|
||||
- stable
|
||||
- canary
|
||||
default: stable
|
||||
description: Release channel to deploy
|
||||
ref:
|
||||
type: string
|
||||
required: false
|
||||
default: ''
|
||||
description: Optional git ref (defaults to the triggering branch)
|
||||
|
||||
concurrency:
|
||||
group: deploy-fluxer-app-${{ github.event_name == 'workflow_dispatch' && inputs.channel || (github.ref_name == 'canary' && 'canary') || 'stable' }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
channel-vars:
|
||||
uses: ./.github/workflows/channel-vars.yaml
|
||||
with:
|
||||
github_event_name: ${{ github.event_name }}
|
||||
github_ref_name: ${{ github.ref_name }}
|
||||
workflow_dispatch_channel: ${{ github.event_name == 'workflow_dispatch' && inputs.channel || '' }}
|
||||
|
||||
deploy:
|
||||
name: Deploy app
|
||||
needs: channel-vars
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
env:
|
||||
CHANNEL: ${{ needs.channel-vars.outputs.channel }}
|
||||
IS_CANARY: ${{ needs.channel-vars.outputs.is_canary }}
|
||||
STACK_SUFFIX: ${{ needs.channel-vars.outputs.stack_suffix }}
|
||||
|
||||
SERVICE_NAME: ${{ format('fluxer-app{0}', needs.channel-vars.outputs.stack_suffix) }}
|
||||
DOCKERFILE: fluxer_app_proxy/Dockerfile
|
||||
CACHE_SCOPE: ${{ format('fluxer-app{0}', needs.channel-vars.outputs.stack_suffix) }}
|
||||
|
||||
RELEASE_CHANNEL: ${{ needs.channel-vars.outputs.channel }}
|
||||
APP_REPLICAS: ${{ needs.channel-vars.outputs.is_canary == 'true' && 1 || 2 }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ inputs.ref || '' }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 24
|
||||
cache: pnpm
|
||||
cache-dependency-path: fluxer_app/pnpm-lock.yaml
|
||||
|
||||
- name: Install dependencies
|
||||
run: python3 scripts/ci/workflows/deploy_app.py --step install_dependencies
|
||||
|
||||
- name: Run Lingui i18n tasks
|
||||
run: python3 scripts/ci/workflows/deploy_app.py --step run_lingui
|
||||
env:
|
||||
TURBO_API: https://turborepo.fluxer.dev
|
||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||
TURBO_TEAM: team_fluxer
|
||||
|
||||
- name: Record deploy commit
|
||||
run: python3 scripts/ci/workflows/deploy_app.py --step record_deploy_commit
|
||||
|
||||
- name: Set up Rust
|
||||
uses: dtolnay/rust-toolchain@stable
|
||||
with:
|
||||
targets: wasm32-unknown-unknown
|
||||
|
||||
- name: Cache Rust dependencies
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: |
|
||||
~/.cargo/bin/
|
||||
~/.cargo/registry/index/
|
||||
~/.cargo/registry/cache/
|
||||
~/.cargo/git/db/
|
||||
fluxer_app/crates/gif_wasm/target/
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('fluxer_app/crates/gif_wasm/Cargo.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-cargo-
|
||||
|
||||
- name: Install wasm-pack
|
||||
run: python3 scripts/ci/workflows/deploy_app.py --step install_wasm_pack
|
||||
|
||||
- name: Generate wasm artifacts
|
||||
run: python3 scripts/ci/workflows/deploy_app.py --step generate_wasm
|
||||
env:
|
||||
TURBO_API: https://turborepo.fluxer.dev
|
||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||
TURBO_TEAM: team_fluxer
|
||||
|
||||
- name: Set up SSH agent
|
||||
uses: webfactory/ssh-agent@v0.9.1
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_SERVER }}
|
||||
|
||||
- name: Add server to known hosts
|
||||
run: python3 scripts/ci/workflows/deploy_app.py --step add_known_hosts --server-ip ${{ secrets.SERVER_IP }}
|
||||
|
||||
- name: Fetch deployment config
|
||||
env:
|
||||
SERVER: ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}
|
||||
RELEASE_CHANNEL: ${{ env.RELEASE_CHANNEL }}
|
||||
run: python3 scripts/ci/workflows/deploy_app.py --step fetch_deployment_config
|
||||
|
||||
- name: Build application
|
||||
env:
|
||||
FLUXER_CONFIG: ${{ github.workspace }}/fluxer_app/config.json
|
||||
TURBO_API: https://turborepo.fluxer.dev
|
||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||
TURBO_TEAM: team_fluxer
|
||||
run: python3 scripts/ci/workflows/deploy_app.py --step build_application
|
||||
|
||||
- name: Install rclone
|
||||
run: python3 scripts/ci/workflows/deploy_app.py --step install_rclone
|
||||
|
||||
- name: Upload assets to S3 static bucket
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
run: python3 scripts/ci/workflows/deploy_app.py --step upload_assets
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||
|
||||
- name: Set build timestamp
|
||||
run: python3 scripts/ci/workflows/deploy_app.py --step set_build_timestamp
|
||||
|
||||
- name: Build image
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
file: ${{ env.DOCKERFILE }}
|
||||
tags: ${{ env.SERVICE_NAME }}:${{ env.DEPLOY_SHA }}
|
||||
load: true
|
||||
platforms: linux/amd64
|
||||
cache-from: type=gha,scope=${{ env.CACHE_SCOPE }}
|
||||
cache-to: type=gha,mode=max,scope=${{ env.CACHE_SCOPE }}
|
||||
build-args: |
|
||||
BUILD_SHA=${{ env.DEPLOY_SHA }}
|
||||
BUILD_NUMBER=${{ github.run_number }}
|
||||
BUILD_TIMESTAMP=${{ env.BUILD_TIMESTAMP }}
|
||||
RELEASE_CHANNEL=${{ env.RELEASE_CHANNEL }}
|
||||
env:
|
||||
DOCKER_BUILD_SUMMARY: false
|
||||
DOCKER_BUILD_RECORD_UPLOAD: false
|
||||
|
||||
- name: Install docker-pussh
|
||||
run: python3 scripts/ci/workflows/deploy_app.py --step install_docker_pussh
|
||||
|
||||
- name: Push image and deploy
|
||||
env:
|
||||
IMAGE_TAG: ${{ env.SERVICE_NAME }}:${{ env.DEPLOY_SHA }}
|
||||
SERVER: ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}
|
||||
|
||||
SERVICE_NAME: ${{ env.SERVICE_NAME }}
|
||||
COMPOSE_STACK: ${{ env.SERVICE_NAME }}
|
||||
|
||||
RELEASE_CHANNEL: ${{ env.RELEASE_CHANNEL }}
|
||||
APP_REPLICAS: ${{ env.APP_REPLICAS }}
|
||||
run: python3 scripts/ci/workflows/deploy_app.py --step push_and_deploy
|
||||
62
fluxer/.github/workflows/deploy-gateway.yaml
vendored
Normal file
62
fluxer/.github/workflows/deploy-gateway.yaml
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
name: deploy gateway
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
ref:
|
||||
type: string
|
||||
required: false
|
||||
default: ''
|
||||
description: Optional git ref (defaults to the triggering branch)
|
||||
push:
|
||||
branches:
|
||||
- canary
|
||||
paths:
|
||||
- 'fluxer_gateway/**'
|
||||
|
||||
concurrency:
|
||||
group: deploy-gateway
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
name: Deploy (hot patch)
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ inputs.ref || '' }}
|
||||
sparse-checkout: |
|
||||
fluxer_gateway
|
||||
scripts/ci
|
||||
|
||||
- name: Set up Erlang
|
||||
uses: erlef/setup-beam@v1
|
||||
with:
|
||||
otp-version: '28'
|
||||
rebar3-version: '3.24.0'
|
||||
|
||||
- name: Compile
|
||||
run: python3 scripts/ci/workflows/deploy_gateway.py --step compile
|
||||
|
||||
- name: Set up SSH
|
||||
uses: webfactory/ssh-agent@v0.9.1
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_SERVER }}
|
||||
|
||||
- name: Add server to known hosts
|
||||
run: python3 scripts/ci/workflows/deploy_gateway.py --step add_known_hosts --server-ip ${{ secrets.SERVER_IP }}
|
||||
|
||||
- name: Record deploy commit
|
||||
run: python3 scripts/ci/workflows/deploy_gateway.py --step record_deploy_commit
|
||||
|
||||
- name: Deploy
|
||||
env:
|
||||
SERVER: ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}
|
||||
GATEWAY_ADMIN_SECRET: ${{ secrets.GATEWAY_ADMIN_SECRET }}
|
||||
run: python3 scripts/ci/workflows/deploy_gateway.py --step deploy
|
||||
117
fluxer/.github/workflows/deploy-marketing.yaml
vendored
Normal file
117
fluxer/.github/workflows/deploy-marketing.yaml
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
name: deploy marketing
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- canary
|
||||
paths:
|
||||
- fluxer_marketing/**
|
||||
- .github/workflows/deploy-marketing.yaml
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
channel:
|
||||
type: choice
|
||||
options:
|
||||
- stable
|
||||
- canary
|
||||
default: stable
|
||||
description: Release channel to deploy
|
||||
ref:
|
||||
type: string
|
||||
required: false
|
||||
default: ''
|
||||
description: Optional git ref (defaults to the triggering branch)
|
||||
|
||||
concurrency:
|
||||
group: deploy-fluxer-marketing-${{ github.event_name == 'workflow_dispatch' && inputs.channel || (github.ref_name == 'canary' && 'canary') || 'stable' }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
channel-vars:
|
||||
uses: ./.github/workflows/channel-vars.yaml
|
||||
with:
|
||||
github_event_name: ${{ github.event_name }}
|
||||
github_ref_name: ${{ github.ref_name }}
|
||||
workflow_dispatch_channel: ${{ github.event_name == 'workflow_dispatch' && inputs.channel || '' }}
|
||||
|
||||
deploy:
|
||||
name: Deploy marketing
|
||||
needs: channel-vars
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
env:
|
||||
CHANNEL: ${{ needs.channel-vars.outputs.channel }}
|
||||
IS_CANARY: ${{ needs.channel-vars.outputs.is_canary }}
|
||||
STACK_SUFFIX: ${{ needs.channel-vars.outputs.stack_suffix }}
|
||||
STACK: ${{ format('fluxer-marketing{0}', needs.channel-vars.outputs.stack_suffix) }}
|
||||
IMAGE_NAME: ${{ format('fluxer-marketing{0}', needs.channel-vars.outputs.stack_suffix) }}
|
||||
CACHE_SCOPE: ${{ format('deploy-fluxer-marketing{0}', needs.channel-vars.outputs.stack_suffix) }}
|
||||
APP_REPLICAS: ${{ needs.channel-vars.outputs.is_canary == 'true' && 1 || 2 }}
|
||||
CADDY_DOMAIN: ${{ needs.channel-vars.outputs.is_canary == 'true' && 'canary.fluxer.app' || 'fluxer.app' }}
|
||||
RELEASE_CHANNEL: ${{ needs.channel-vars.outputs.channel }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ inputs.ref || '' }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Record deploy commit
|
||||
run: python3 scripts/ci/workflows/deploy_marketing.py --step record_deploy_commit
|
||||
|
||||
- name: Set build timestamp
|
||||
run: python3 scripts/ci/workflows/deploy_marketing.py --step set_build_timestamp
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||
|
||||
- name: Build image
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
file: fluxer_marketing/Dockerfile
|
||||
tags: ${{ env.IMAGE_NAME }}:${{ env.DEPLOY_SHA }}
|
||||
load: true
|
||||
platforms: linux/amd64
|
||||
cache-from: type=gha,scope=${{ env.CACHE_SCOPE }}
|
||||
cache-to: type=gha,mode=max,scope=${{ env.CACHE_SCOPE }}
|
||||
build-args: |
|
||||
BUILD_SHA=${{ env.DEPLOY_SHA }}
|
||||
BUILD_NUMBER=${{ github.run_number }}
|
||||
BUILD_TIMESTAMP=${{ env.BUILD_TIMESTAMP }}
|
||||
RELEASE_CHANNEL=${{ env.RELEASE_CHANNEL }}
|
||||
env:
|
||||
DOCKER_BUILD_SUMMARY: false
|
||||
DOCKER_BUILD_RECORD_UPLOAD: false
|
||||
|
||||
- name: Install docker-pussh
|
||||
run: python3 scripts/ci/workflows/deploy_marketing.py --step install_docker_pussh
|
||||
|
||||
- name: Set up SSH agent
|
||||
uses: webfactory/ssh-agent@v0.9.1
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_SERVER }}
|
||||
|
||||
- name: Add server to known hosts
|
||||
run: python3 scripts/ci/workflows/deploy_marketing.py --step add_known_hosts --server-ip ${{ secrets.SERVER_IP }}
|
||||
|
||||
- name: Push image and deploy
|
||||
env:
|
||||
IMAGE_TAG: ${{ env.IMAGE_NAME }}:${{ env.DEPLOY_SHA }}
|
||||
SERVER: ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}
|
||||
STACK: ${{ env.STACK }}
|
||||
IS_CANARY: ${{ env.IS_CANARY }}
|
||||
CADDY_DOMAIN: ${{ env.CADDY_DOMAIN }}
|
||||
RELEASE_CHANNEL: ${{ env.RELEASE_CHANNEL }}
|
||||
APP_REPLICAS: ${{ env.APP_REPLICAS }}
|
||||
run: python3 scripts/ci/workflows/deploy_marketing.py --step push_and_deploy
|
||||
92
fluxer/.github/workflows/deploy-media-proxy.yaml
vendored
Normal file
92
fluxer/.github/workflows/deploy-media-proxy.yaml
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
name: deploy media-proxy
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- fluxer_media_proxy/**
|
||||
- .github/workflows/deploy-media-proxy.yaml
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
ref:
|
||||
type: string
|
||||
required: false
|
||||
default: ''
|
||||
description: Optional git ref (defaults to the triggering branch)
|
||||
|
||||
concurrency:
|
||||
group: deploy-fluxer-media-proxy
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
SERVICE_NAME: fluxer-media-proxy
|
||||
IMAGE_NAME: fluxer-media-proxy
|
||||
CONTEXT_DIR: fluxer_media_proxy
|
||||
COMPOSE_STACK: fluxer-media-proxy
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
name: Deploy media proxy
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
env:
|
||||
RELEASE_CHANNEL: stable
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ inputs.ref || '' }}
|
||||
|
||||
- name: Record deploy commit
|
||||
run: python3 scripts/ci/workflows/deploy_media_proxy.py --step record_deploy_commit
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||
|
||||
- name: Set build timestamp
|
||||
run: python3 scripts/ci/workflows/deploy_media_proxy.py --step set_build_timestamp
|
||||
|
||||
- name: Build image
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
file: ${{ env.CONTEXT_DIR }}/Dockerfile
|
||||
tags: ${{ env.IMAGE_NAME }}:${{ env.DEPLOY_SHA }}
|
||||
load: true
|
||||
platforms: linux/amd64
|
||||
cache-from: type=gha,scope=${{ env.SERVICE_NAME }}
|
||||
cache-to: type=gha,mode=max,scope=${{ env.SERVICE_NAME }}
|
||||
build-args: |
|
||||
BUILD_SHA=${{ env.DEPLOY_SHA }}
|
||||
BUILD_NUMBER=${{ github.run_number }}
|
||||
BUILD_TIMESTAMP=${{ env.BUILD_TIMESTAMP }}
|
||||
RELEASE_CHANNEL=${{ env.RELEASE_CHANNEL }}
|
||||
env:
|
||||
DOCKER_BUILD_SUMMARY: false
|
||||
DOCKER_BUILD_RECORD_UPLOAD: false
|
||||
|
||||
- name: Install docker-pussh
|
||||
run: python3 scripts/ci/workflows/deploy_media_proxy.py --step install_docker_pussh
|
||||
|
||||
- name: Set up SSH agent
|
||||
uses: webfactory/ssh-agent@v0.9.1
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_SERVER }}
|
||||
|
||||
- name: Add server to known hosts
|
||||
run: python3 scripts/ci/workflows/deploy_media_proxy.py --step add_known_hosts --server-ip ${{ secrets.SERVER_IP }}
|
||||
|
||||
- name: Push image and deploy
|
||||
env:
|
||||
IMAGE_TAG: ${{ env.IMAGE_NAME }}:${{ env.DEPLOY_SHA }}
|
||||
SERVER: ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}
|
||||
run: python3 scripts/ci/workflows/deploy_media_proxy.py --step push_and_deploy
|
||||
91
fluxer/.github/workflows/deploy-relay-directory.yaml
vendored
Normal file
91
fluxer/.github/workflows/deploy-relay-directory.yaml
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
name: deploy relay directory
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- canary
|
||||
paths:
|
||||
- fluxer_relay_directory/**
|
||||
- .github/workflows/deploy-relay-directory.yaml
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
ref:
|
||||
type: string
|
||||
required: false
|
||||
default: ''
|
||||
description: Optional git ref (defaults to the triggering branch)
|
||||
|
||||
concurrency:
|
||||
group: deploy-fluxer-relay-directory
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
name: Deploy relay directory
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
env:
|
||||
STACK: fluxer-relay-directory
|
||||
CACHE_SCOPE: deploy-fluxer-relay-directory
|
||||
IS_CANARY: true
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ inputs.ref || '' }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Record deploy commit
|
||||
run: python3 scripts/ci/workflows/deploy_relay_directory.py --step record_deploy_commit
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||
|
||||
- name: Set build timestamp
|
||||
run: python3 scripts/ci/workflows/deploy_relay_directory.py --step set_build_timestamp
|
||||
|
||||
- name: Build image
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
file: fluxer_relay_directory/Dockerfile
|
||||
tags: |
|
||||
${{ env.STACK }}:${{ env.DEPLOY_SHA }}
|
||||
load: true
|
||||
platforms: linux/amd64
|
||||
cache-from: type=gha,scope=${{ env.CACHE_SCOPE }}
|
||||
cache-to: type=gha,mode=max,scope=${{ env.CACHE_SCOPE }}
|
||||
build-args: |
|
||||
BUILD_SHA=${{ env.DEPLOY_SHA }}
|
||||
BUILD_NUMBER=${{ github.run_number }}
|
||||
BUILD_TIMESTAMP=${{ env.BUILD_TIMESTAMP }}
|
||||
RELEASE_CHANNEL=canary
|
||||
env:
|
||||
DOCKER_BUILD_SUMMARY: false
|
||||
DOCKER_BUILD_RECORD_UPLOAD: false
|
||||
|
||||
- name: Install docker-pussh
|
||||
run: python3 scripts/ci/workflows/deploy_relay_directory.py --step install_docker_pussh
|
||||
|
||||
- name: Set up SSH agent
|
||||
uses: webfactory/ssh-agent@v0.9.1
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_SERVER }}
|
||||
|
||||
- name: Add server to known hosts
|
||||
run: python3 scripts/ci/workflows/deploy_relay_directory.py --step add_known_hosts --server-ip ${{ secrets.SERVER_IP }}
|
||||
|
||||
- name: Push image and deploy
|
||||
env:
|
||||
SERVER: ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}
|
||||
IMAGE_TAG: ${{ env.STACK }}:${{ env.DEPLOY_SHA }}
|
||||
run: python3 scripts/ci/workflows/deploy_relay_directory.py --step push_and_deploy
|
||||
62
fluxer/.github/workflows/deploy-relay.yaml
vendored
Normal file
62
fluxer/.github/workflows/deploy-relay.yaml
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
name: deploy relay
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
ref:
|
||||
type: string
|
||||
required: false
|
||||
default: ''
|
||||
description: Optional git ref (defaults to the triggering branch)
|
||||
push:
|
||||
branches:
|
||||
- canary
|
||||
paths:
|
||||
- 'fluxer_relay/**'
|
||||
|
||||
concurrency:
|
||||
group: deploy-relay
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
name: Deploy (hot patch)
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ inputs.ref || '' }}
|
||||
sparse-checkout: |
|
||||
fluxer_relay
|
||||
scripts/ci
|
||||
|
||||
- name: Set up Erlang
|
||||
uses: erlef/setup-beam@v1
|
||||
with:
|
||||
otp-version: '28'
|
||||
rebar3-version: '3.24.0'
|
||||
|
||||
- name: Compile
|
||||
run: python3 scripts/ci/workflows/deploy_relay.py --step compile
|
||||
|
||||
- name: Set up SSH
|
||||
uses: webfactory/ssh-agent@v0.9.1
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_SERVER }}
|
||||
|
||||
- name: Add server to known hosts
|
||||
run: python3 scripts/ci/workflows/deploy_relay.py --step add_known_hosts --server-ip ${{ secrets.SERVER_IP }}
|
||||
|
||||
- name: Record deploy commit
|
||||
run: python3 scripts/ci/workflows/deploy_relay.py --step record_deploy_commit
|
||||
|
||||
- name: Deploy
|
||||
env:
|
||||
SERVER: ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}
|
||||
RELAY_ADMIN_SECRET: ${{ secrets.RELAY_ADMIN_SECRET }}
|
||||
run: python3 scripts/ci/workflows/deploy_relay.py --step deploy
|
||||
92
fluxer/.github/workflows/deploy-static-proxy.yaml
vendored
Normal file
92
fluxer/.github/workflows/deploy-static-proxy.yaml
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
name: deploy static-proxy
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- fluxer_media_proxy/**
|
||||
- .github/workflows/deploy-static-proxy.yaml
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
ref:
|
||||
type: string
|
||||
required: false
|
||||
default: ''
|
||||
description: Optional git ref (defaults to the triggering branch)
|
||||
|
||||
concurrency:
|
||||
group: deploy-fluxer-static-proxy
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
SERVICE_NAME: fluxer-static-proxy
|
||||
IMAGE_NAME: fluxer-static-proxy
|
||||
CONTEXT_DIR: fluxer_media_proxy
|
||||
COMPOSE_STACK: fluxer-static-proxy
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
name: Deploy static proxy
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
env:
|
||||
RELEASE_CHANNEL: stable
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ inputs.ref || '' }}
|
||||
|
||||
- name: Record deploy commit
|
||||
run: python3 scripts/ci/workflows/deploy_static_proxy.py --step record_deploy_commit
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||
|
||||
- name: Set build timestamp
|
||||
run: python3 scripts/ci/workflows/deploy_static_proxy.py --step set_build_timestamp
|
||||
|
||||
- name: Build image
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
file: ${{ env.CONTEXT_DIR }}/Dockerfile
|
||||
tags: ${{ env.IMAGE_NAME }}:${{ env.DEPLOY_SHA }}
|
||||
load: true
|
||||
platforms: linux/amd64
|
||||
cache-from: type=gha,scope=${{ env.SERVICE_NAME }}
|
||||
cache-to: type=gha,mode=max,scope=${{ env.SERVICE_NAME }}
|
||||
build-args: |
|
||||
BUILD_SHA=${{ env.DEPLOY_SHA }}
|
||||
BUILD_NUMBER=${{ github.run_number }}
|
||||
BUILD_TIMESTAMP=${{ env.BUILD_TIMESTAMP }}
|
||||
RELEASE_CHANNEL=${{ env.RELEASE_CHANNEL }}
|
||||
env:
|
||||
DOCKER_BUILD_SUMMARY: false
|
||||
DOCKER_BUILD_RECORD_UPLOAD: false
|
||||
|
||||
- name: Install docker-pussh
|
||||
run: python3 scripts/ci/workflows/deploy_static_proxy.py --step install_docker_pussh
|
||||
|
||||
- name: Set up SSH agent
|
||||
uses: webfactory/ssh-agent@v0.9.1
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_SERVER }}
|
||||
|
||||
- name: Add server to known hosts
|
||||
run: python3 scripts/ci/workflows/deploy_static_proxy.py --step add_known_hosts --server-ip ${{ secrets.SERVER_IP }}
|
||||
|
||||
- name: Push image and deploy
|
||||
env:
|
||||
IMAGE_TAG: ${{ env.IMAGE_NAME }}:${{ env.DEPLOY_SHA }}
|
||||
SERVER: ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}
|
||||
run: python3 scripts/ci/workflows/deploy_static_proxy.py --step push_and_deploy
|
||||
67
fluxer/.github/workflows/migrate-cassandra.yaml
vendored
Normal file
67
fluxer/.github/workflows/migrate-cassandra.yaml
vendored
Normal file
@@ -0,0 +1,67 @@
|
||||
name: migrate cassandra
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- canary
|
||||
paths:
|
||||
- fluxer_devops/cassandra/migrations/**/*.cql
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: migrate-cassandra-prod
|
||||
cancel-in-progress: false
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
migrate:
|
||||
name: Run database migrations
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Set up pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 24
|
||||
cache: pnpm
|
||||
cache-dependency-path: pnpm-lock.yaml
|
||||
|
||||
- name: Install dependencies
|
||||
run: python3 scripts/ci/workflows/migrate_cassandra.py --step install_dependencies
|
||||
|
||||
- name: Validate migrations
|
||||
run: python3 scripts/ci/workflows/migrate_cassandra.py --step validate_migrations
|
||||
|
||||
- name: Set up SSH agent
|
||||
uses: webfactory/ssh-agent@v0.9.1
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_SERVER }}
|
||||
|
||||
- name: Add server to known hosts
|
||||
run: python3 scripts/ci/workflows/migrate_cassandra.py --step add_known_hosts --server-ip ${{ secrets.SERVER_IP }}
|
||||
|
||||
- name: Set up SSH tunnel for Cassandra
|
||||
run: python3 scripts/ci/workflows/migrate_cassandra.py --step setup_tunnel --server-user ${{ secrets.SERVER_USER }} --server-ip ${{ secrets.SERVER_IP }}
|
||||
|
||||
- name: Test Cassandra connection
|
||||
env:
|
||||
CASSANDRA_USERNAME: ${{ secrets.CASSANDRA_USERNAME }}
|
||||
CASSANDRA_PASSWORD: ${{ secrets.CASSANDRA_PASSWORD }}
|
||||
run: python3 scripts/ci/workflows/migrate_cassandra.py --step test_connection
|
||||
|
||||
- name: Run migrations
|
||||
env:
|
||||
CASSANDRA_USERNAME: ${{ secrets.CASSANDRA_USERNAME }}
|
||||
CASSANDRA_PASSWORD: ${{ secrets.CASSANDRA_PASSWORD }}
|
||||
run: python3 scripts/ci/workflows/migrate_cassandra.py --step run_migrations
|
||||
|
||||
- name: Close SSH tunnel
|
||||
if: always()
|
||||
run: python3 scripts/ci/workflows/migrate_cassandra.py --step close_tunnel
|
||||
67
fluxer/.github/workflows/promote-canary-to-main.yaml
vendored
Normal file
67
fluxer/.github/workflows/promote-canary-to-main.yaml
vendored
Normal file
@@ -0,0 +1,67 @@
|
||||
name: promote canary -> main
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
dry_run:
|
||||
type: boolean
|
||||
default: false
|
||||
description: "Show what would change, but don't push"
|
||||
src:
|
||||
type: string
|
||||
default: canary
|
||||
description: 'Source branch'
|
||||
dst:
|
||||
type: string
|
||||
default: main
|
||||
description: 'Destination branch'
|
||||
|
||||
concurrency:
|
||||
group: promote-${{ inputs.dst }}
|
||||
cancel-in-progress: false
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
promote:
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
|
||||
steps:
|
||||
- name: Create GitHub App token
|
||||
id: app-token
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ secrets.PROMOTE_APP_ID }}
|
||||
private-key: ${{ secrets.PROMOTE_APP_PRIVATE_KEY }}
|
||||
|
||||
- name: Checkout source
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ inputs.src }}
|
||||
fetch-depth: 0
|
||||
token: ${{ steps.app-token.outputs.token }}
|
||||
|
||||
- name: Verify ff-only + summarize
|
||||
id: verify
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/promote_canary_to_main.py
|
||||
--step verify
|
||||
--src "${{ inputs.src }}"
|
||||
--dst "${{ inputs.dst }}"
|
||||
|
||||
- name: Push fast-forward
|
||||
if: ${{ steps.verify.outputs.ahead != '0' && inputs.dry_run != true }}
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/promote_canary_to_main.py
|
||||
--step push
|
||||
--dst "${{ inputs.dst }}"
|
||||
|
||||
- name: Dry run / no-op
|
||||
if: ${{ steps.verify.outputs.ahead == '0' || inputs.dry_run == true }}
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/promote_canary_to_main.py
|
||||
--step dry_run
|
||||
--dry-run "${{ inputs.dry_run }}"
|
||||
--ahead "${{ steps.verify.outputs.ahead }}"
|
||||
151
fluxer/.github/workflows/release-livekitctl.yaml
vendored
Normal file
151
fluxer/.github/workflows/release-livekitctl.yaml
vendored
Normal file
@@ -0,0 +1,151 @@
|
||||
name: release livekitctl
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'livekitctl-v*'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
description: Version to release (e.g., 1.0.0)
|
||||
required: true
|
||||
type: string
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
concurrency:
|
||||
group: release-livekitctl
|
||||
cancel-in-progress: false
|
||||
|
||||
env:
|
||||
GO_VERSION: '1.24'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build ${{ matrix.goos }}/${{ matrix.goarch }}
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- goos: linux
|
||||
goarch: amd64
|
||||
- goos: linux
|
||||
goarch: arm64
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
cache-dependency-path: fluxer_devops/livekitctl/go.sum
|
||||
|
||||
- name: Determine version
|
||||
id: version
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/release_livekitctl.py
|
||||
--step determine_version
|
||||
--event-name "${{ github.event_name }}"
|
||||
--input-version "${{ inputs.version }}"
|
||||
--ref-name "${{ github.ref_name }}"
|
||||
|
||||
- name: Build binary
|
||||
env:
|
||||
GOOS: ${{ matrix.goos }}
|
||||
GOARCH: ${{ matrix.goarch }}
|
||||
CGO_ENABLED: 0
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/release_livekitctl.py
|
||||
--step build_binary
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: livekitctl-${{ matrix.goos }}-${{ matrix.goarch }}
|
||||
path: fluxer_devops/livekitctl/livekitctl-${{ matrix.goos }}-${{ matrix.goarch }}
|
||||
retention-days: 1
|
||||
|
||||
release:
|
||||
name: Create release
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
needs: build
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Determine version
|
||||
id: version
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/release_livekitctl.py
|
||||
--step determine_version
|
||||
--event-name "${{ github.event_name }}"
|
||||
--input-version "${{ inputs.version }}"
|
||||
--ref-name "${{ github.ref_name }}"
|
||||
|
||||
- name: Download all artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: artifacts
|
||||
|
||||
- name: Prepare release assets
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/release_livekitctl.py
|
||||
--step prepare_release_assets
|
||||
|
||||
- name: Generate checksums
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/release_livekitctl.py
|
||||
--step generate_checksums
|
||||
--release-dir release
|
||||
|
||||
- name: Create tag (workflow_dispatch only)
|
||||
if: github.event_name == 'workflow_dispatch'
|
||||
run: >-
|
||||
python3 ${{ github.workspace }}/scripts/ci/workflows/release_livekitctl.py
|
||||
--step create_tag
|
||||
--tag "${{ steps.version.outputs.tag }}"
|
||||
--version "${{ steps.version.outputs.version }}"
|
||||
|
||||
- name: Create GitHub release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: ${{ steps.version.outputs.tag }}
|
||||
name: livekitctl v${{ steps.version.outputs.version }}
|
||||
body: |
|
||||
## livekitctl v${{ steps.version.outputs.version }}
|
||||
|
||||
Self-hosted LiveKit bootstrap and operations CLI.
|
||||
|
||||
### Installation
|
||||
|
||||
```bash
|
||||
curl -fsSL https://fluxer.app/get/livekitctl | sudo bash
|
||||
```
|
||||
|
||||
### Manual download
|
||||
|
||||
Download the appropriate binary for your system:
|
||||
- `livekitctl-linux-amd64` - Linux x86_64
|
||||
- `livekitctl-linux-arm64` - Linux ARM64
|
||||
|
||||
Then make it executable and move to your PATH:
|
||||
```bash
|
||||
chmod +x livekitctl-linux-*
|
||||
sudo mv livekitctl-linux-* /usr/local/bin/livekitctl
|
||||
```
|
||||
|
||||
### Checksums
|
||||
|
||||
See `checksums.txt` for SHA256 checksums.
|
||||
files: |
|
||||
release/livekitctl-linux-amd64
|
||||
release/livekitctl-linux-arm64
|
||||
release/checksums.txt
|
||||
draft: false
|
||||
prerelease: false
|
||||
259
fluxer/.github/workflows/release-relay-directory.yaml
vendored
Normal file
259
fluxer/.github/workflows/release-relay-directory.yaml
vendored
Normal file
@@ -0,0 +1,259 @@
|
||||
name: release relay directory
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [canary]
|
||||
paths:
|
||||
- fluxer_relay_directory/**
|
||||
- .github/workflows/release-relay-directory.yaml
|
||||
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
channel:
|
||||
description: Release channel
|
||||
type: choice
|
||||
options: [stable, nightly]
|
||||
default: nightly
|
||||
required: false
|
||||
|
||||
ref:
|
||||
description: Git ref (branch, tag, or commit SHA)
|
||||
type: string
|
||||
default: ''
|
||||
required: false
|
||||
|
||||
version:
|
||||
description: Stable version (e.g. 1.0.0). Defaults to 0.0.<run_number>
|
||||
type: string
|
||||
required: false
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
packages: write
|
||||
id-token: write
|
||||
attestations: write
|
||||
|
||||
concurrency:
|
||||
group: release-relay-directory-${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.channel) || 'nightly' }}
|
||||
cancel-in-progress: true
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
env:
|
||||
REGISTRY: ghcr.io
|
||||
IMAGE_NAME: ${{ github.repository_owner }}/fluxer-relay-directory
|
||||
CHANNEL: ${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.channel) || 'nightly' }}
|
||||
SOURCE_REF: >-
|
||||
${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.ref)
|
||||
|| ((github.event_name == 'workflow_dispatch' && github.event.inputs.channel == 'stable') && 'main')
|
||||
|| 'canary' }}
|
||||
|
||||
jobs:
|
||||
meta:
|
||||
name: resolve build metadata
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
|
||||
outputs:
|
||||
version: ${{ steps.meta.outputs.version }}
|
||||
channel: ${{ steps.meta.outputs.channel }}
|
||||
source_ref: ${{ steps.meta.outputs.source_ref }}
|
||||
sha_short: ${{ steps.meta.outputs.sha_short }}
|
||||
timestamp: ${{ steps.meta.outputs.timestamp }}
|
||||
date: ${{ steps.meta.outputs.date }}
|
||||
build_number: ${{ steps.meta.outputs.build_number }}
|
||||
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ env.SOURCE_REF }}
|
||||
|
||||
- name: metadata
|
||||
id: meta
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/release_relay_directory.py
|
||||
--step metadata
|
||||
--version-input "${{ github.event.inputs.version }}"
|
||||
--channel "${{ env.CHANNEL }}"
|
||||
--source-ref "${{ env.SOURCE_REF }}"
|
||||
|
||||
build:
|
||||
name: build fluxer relay directory
|
||||
needs: meta
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
|
||||
outputs:
|
||||
image_tags: ${{ steps.docker_meta.outputs.tags }}
|
||||
image_digest: ${{ steps.build.outputs.digest }}
|
||||
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ needs.meta.outputs.source_ref }}
|
||||
|
||||
- name: set up buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: login
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: docker metadata
|
||||
id: docker_meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
type=raw,value=nightly,enable=${{ needs.meta.outputs.channel == 'nightly' }}
|
||||
type=raw,value=nightly-${{ needs.meta.outputs.date }},enable=${{ needs.meta.outputs.channel == 'nightly' }}
|
||||
type=raw,value=sha-${{ needs.meta.outputs.sha_short }},enable=${{ needs.meta.outputs.channel == 'nightly' }}
|
||||
type=raw,value=stable,enable=${{ needs.meta.outputs.channel == 'stable' }}
|
||||
type=raw,value=latest,enable=${{ needs.meta.outputs.channel == 'stable' }}
|
||||
type=raw,value=v${{ needs.meta.outputs.version }},enable=${{ needs.meta.outputs.channel == 'stable' }}
|
||||
type=semver,pattern={{version}},value=${{ needs.meta.outputs.version }},enable=${{ needs.meta.outputs.channel == 'stable' && !startsWith(needs.meta.outputs.version, '0.0.') }}
|
||||
type=semver,pattern={{major}}.{{minor}},value=${{ needs.meta.outputs.version }},enable=${{ needs.meta.outputs.channel == 'stable' && !startsWith(needs.meta.outputs.version, '0.0.') }}
|
||||
|
||||
- name: build and push
|
||||
id: build
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
file: fluxer_relay_directory/Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ steps.docker_meta.outputs.tags }}
|
||||
labels: |
|
||||
${{ steps.docker_meta.outputs.labels }}
|
||||
org.opencontainers.image.version=v${{ needs.meta.outputs.version }}
|
||||
org.opencontainers.image.revision=${{ github.sha }}
|
||||
org.opencontainers.image.created=${{ needs.meta.outputs.timestamp }}
|
||||
org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
|
||||
dev.fluxer.build.channel=${{ needs.meta.outputs.channel }}
|
||||
dev.fluxer.build.number=${{ needs.meta.outputs.build_number }}
|
||||
dev.fluxer.build.sha=${{ github.sha }}
|
||||
dev.fluxer.build.short_sha=${{ needs.meta.outputs.sha_short }}
|
||||
dev.fluxer.build.date=${{ needs.meta.outputs.date }}
|
||||
build-args: |
|
||||
BUILD_SHA=${{ github.sha }}
|
||||
BUILD_NUMBER=${{ needs.meta.outputs.build_number }}
|
||||
BUILD_TIMESTAMP=${{ needs.meta.outputs.timestamp }}
|
||||
RELEASE_CHANNEL=${{ needs.meta.outputs.channel }}
|
||||
cache-from: type=gha,scope=relay-directory-${{ needs.meta.outputs.channel }}
|
||||
cache-to: type=gha,mode=max,scope=relay-directory-${{ needs.meta.outputs.channel }}
|
||||
provenance: true
|
||||
sbom: true
|
||||
|
||||
- name: attest
|
||||
uses: actions/attest-build-provenance@v2
|
||||
with:
|
||||
subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
subject-digest: ${{ steps.build.outputs.digest }}
|
||||
push-to-registry: true
|
||||
|
||||
create-release:
|
||||
name: create release
|
||||
needs: [meta, build]
|
||||
if: |
|
||||
always() &&
|
||||
needs.meta.outputs.version != '' &&
|
||||
needs.build.result == 'success'
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ needs.meta.outputs.source_ref }}
|
||||
|
||||
- name: stable release
|
||||
if: needs.meta.outputs.channel == 'stable'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: relay-directory-v${{ needs.meta.outputs.version }}
|
||||
name: Fluxer Relay Directory v${{ needs.meta.outputs.version }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
generate_release_notes: true
|
||||
body: |
|
||||
Fluxer Relay Directory
|
||||
|
||||
Pull:
|
||||
```bash
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:v${{ needs.meta.outputs.version }}
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
|
||||
```
|
||||
|
||||
Build:
|
||||
- version: v${{ needs.meta.outputs.version }}
|
||||
- build: ${{ needs.meta.outputs.build_number }}
|
||||
- sha: ${{ github.sha }}
|
||||
- time: ${{ needs.meta.outputs.timestamp }}
|
||||
- channel: stable
|
||||
|
||||
Docs: https://docs.fluxer.app/federation
|
||||
|
||||
- name: nightly release
|
||||
if: needs.meta.outputs.channel == 'nightly'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: relay-directory-nightly-${{ needs.meta.outputs.date }}-${{ needs.meta.outputs.sha_short }}
|
||||
name: Relay Directory nightly ${{ needs.meta.outputs.date }} (${{ needs.meta.outputs.sha_short }})
|
||||
draft: false
|
||||
prerelease: true
|
||||
generate_release_notes: true
|
||||
body: |
|
||||
Nightly Fluxer Relay Directory image from canary.
|
||||
|
||||
Pull:
|
||||
```bash
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:nightly
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:nightly-${{ needs.meta.outputs.date }}
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:sha-${{ needs.meta.outputs.sha_short }}
|
||||
```
|
||||
|
||||
Build:
|
||||
- version: v${{ needs.meta.outputs.version }}
|
||||
- build: ${{ needs.meta.outputs.build_number }}
|
||||
- sha: ${{ github.sha }}
|
||||
- time: ${{ needs.meta.outputs.timestamp }}
|
||||
- channel: nightly
|
||||
- branch: canary
|
||||
|
||||
release-summary:
|
||||
name: release summary
|
||||
needs: [meta, build]
|
||||
if: always()
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
sparse-checkout: scripts/ci
|
||||
sparse-checkout-cone-mode: false
|
||||
|
||||
- name: summary
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/release_relay_directory.py
|
||||
--step summary
|
||||
--build-result "${{ needs.build.result }}"
|
||||
--channel "${{ needs.meta.outputs.channel }}"
|
||||
--version "${{ needs.meta.outputs.version }}"
|
||||
--build-number "${{ needs.meta.outputs.build_number }}"
|
||||
--sha-short "${{ needs.meta.outputs.sha_short }}"
|
||||
--timestamp "${{ needs.meta.outputs.timestamp }}"
|
||||
--date-ymd "${{ needs.meta.outputs.date }}"
|
||||
--source-ref "${{ needs.meta.outputs.source_ref }}"
|
||||
--image-tags "${{ needs.build.outputs.image_tags }}"
|
||||
--image-digest "${{ needs.build.outputs.image_digest }}"
|
||||
--registry "${{ env.REGISTRY }}"
|
||||
--image-name "${{ env.IMAGE_NAME }}"
|
||||
259
fluxer/.github/workflows/release-relay.yaml
vendored
Normal file
259
fluxer/.github/workflows/release-relay.yaml
vendored
Normal file
@@ -0,0 +1,259 @@
|
||||
name: release relay
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [canary]
|
||||
paths:
|
||||
- fluxer_relay/**
|
||||
- .github/workflows/release-relay.yaml
|
||||
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
channel:
|
||||
description: Release channel
|
||||
type: choice
|
||||
options: [stable, nightly]
|
||||
default: nightly
|
||||
required: false
|
||||
|
||||
ref:
|
||||
description: Git ref (branch, tag, or commit SHA)
|
||||
type: string
|
||||
default: ''
|
||||
required: false
|
||||
|
||||
version:
|
||||
description: Stable version (e.g. 1.0.0). Defaults to 0.0.<run_number>
|
||||
type: string
|
||||
required: false
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
packages: write
|
||||
id-token: write
|
||||
attestations: write
|
||||
|
||||
concurrency:
|
||||
group: release-relay-${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.channel) || 'nightly' }}
|
||||
cancel-in-progress: true
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
env:
|
||||
REGISTRY: ghcr.io
|
||||
IMAGE_NAME: ${{ github.repository_owner }}/fluxer-relay
|
||||
CHANNEL: ${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.channel) || 'nightly' }}
|
||||
SOURCE_REF: >-
|
||||
${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.ref)
|
||||
|| ((github.event_name == 'workflow_dispatch' && github.event.inputs.channel == 'stable') && 'main')
|
||||
|| 'canary' }}
|
||||
|
||||
jobs:
|
||||
meta:
|
||||
name: resolve build metadata
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
|
||||
outputs:
|
||||
version: ${{ steps.meta.outputs.version }}
|
||||
channel: ${{ steps.meta.outputs.channel }}
|
||||
source_ref: ${{ steps.meta.outputs.source_ref }}
|
||||
sha_short: ${{ steps.meta.outputs.sha_short }}
|
||||
timestamp: ${{ steps.meta.outputs.timestamp }}
|
||||
date: ${{ steps.meta.outputs.date }}
|
||||
build_number: ${{ steps.meta.outputs.build_number }}
|
||||
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ env.SOURCE_REF }}
|
||||
|
||||
- name: metadata
|
||||
id: meta
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/release_relay.py
|
||||
--step metadata
|
||||
--version-input "${{ github.event.inputs.version }}"
|
||||
--channel "${{ env.CHANNEL }}"
|
||||
--source-ref "${{ env.SOURCE_REF }}"
|
||||
|
||||
build:
|
||||
name: build fluxer relay
|
||||
needs: meta
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
|
||||
outputs:
|
||||
image_tags: ${{ steps.docker_meta.outputs.tags }}
|
||||
image_digest: ${{ steps.build.outputs.digest }}
|
||||
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ needs.meta.outputs.source_ref }}
|
||||
|
||||
- name: set up buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: login
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: docker metadata
|
||||
id: docker_meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
type=raw,value=nightly,enable=${{ needs.meta.outputs.channel == 'nightly' }}
|
||||
type=raw,value=nightly-${{ needs.meta.outputs.date }},enable=${{ needs.meta.outputs.channel == 'nightly' }}
|
||||
type=raw,value=sha-${{ needs.meta.outputs.sha_short }},enable=${{ needs.meta.outputs.channel == 'nightly' }}
|
||||
type=raw,value=stable,enable=${{ needs.meta.outputs.channel == 'stable' }}
|
||||
type=raw,value=latest,enable=${{ needs.meta.outputs.channel == 'stable' }}
|
||||
type=raw,value=v${{ needs.meta.outputs.version }},enable=${{ needs.meta.outputs.channel == 'stable' }}
|
||||
type=semver,pattern={{version}},value=${{ needs.meta.outputs.version }},enable=${{ needs.meta.outputs.channel == 'stable' && !startsWith(needs.meta.outputs.version, '0.0.') }}
|
||||
type=semver,pattern={{major}}.{{minor}},value=${{ needs.meta.outputs.version }},enable=${{ needs.meta.outputs.channel == 'stable' && !startsWith(needs.meta.outputs.version, '0.0.') }}
|
||||
|
||||
- name: build and push
|
||||
id: build
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: fluxer_relay
|
||||
file: fluxer_relay/Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ steps.docker_meta.outputs.tags }}
|
||||
labels: |
|
||||
${{ steps.docker_meta.outputs.labels }}
|
||||
org.opencontainers.image.version=v${{ needs.meta.outputs.version }}
|
||||
org.opencontainers.image.revision=${{ github.sha }}
|
||||
org.opencontainers.image.created=${{ needs.meta.outputs.timestamp }}
|
||||
org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
|
||||
dev.fluxer.build.channel=${{ needs.meta.outputs.channel }}
|
||||
dev.fluxer.build.number=${{ needs.meta.outputs.build_number }}
|
||||
dev.fluxer.build.sha=${{ github.sha }}
|
||||
dev.fluxer.build.short_sha=${{ needs.meta.outputs.sha_short }}
|
||||
dev.fluxer.build.date=${{ needs.meta.outputs.date }}
|
||||
build-args: |
|
||||
BUILD_SHA=${{ github.sha }}
|
||||
BUILD_NUMBER=${{ needs.meta.outputs.build_number }}
|
||||
BUILD_TIMESTAMP=${{ needs.meta.outputs.timestamp }}
|
||||
RELEASE_CHANNEL=${{ needs.meta.outputs.channel }}
|
||||
cache-from: type=gha,scope=relay-${{ needs.meta.outputs.channel }}
|
||||
cache-to: type=gha,mode=max,scope=relay-${{ needs.meta.outputs.channel }}
|
||||
provenance: true
|
||||
sbom: true
|
||||
|
||||
- name: attest
|
||||
uses: actions/attest-build-provenance@v2
|
||||
with:
|
||||
subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
subject-digest: ${{ steps.build.outputs.digest }}
|
||||
push-to-registry: true
|
||||
|
||||
create-release:
|
||||
name: create release
|
||||
needs: [meta, build]
|
||||
if: |
|
||||
always() &&
|
||||
needs.meta.outputs.version != '' &&
|
||||
needs.build.result == 'success'
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ needs.meta.outputs.source_ref }}
|
||||
|
||||
- name: stable release
|
||||
if: needs.meta.outputs.channel == 'stable'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: relay-v${{ needs.meta.outputs.version }}
|
||||
name: Fluxer Relay v${{ needs.meta.outputs.version }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
generate_release_notes: true
|
||||
body: |
|
||||
Fluxer Relay
|
||||
|
||||
Pull:
|
||||
```bash
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:v${{ needs.meta.outputs.version }}
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
|
||||
```
|
||||
|
||||
Build:
|
||||
- version: v${{ needs.meta.outputs.version }}
|
||||
- build: ${{ needs.meta.outputs.build_number }}
|
||||
- sha: ${{ github.sha }}
|
||||
- time: ${{ needs.meta.outputs.timestamp }}
|
||||
- channel: stable
|
||||
|
||||
Docs: https://docs.fluxer.app/federation
|
||||
|
||||
- name: nightly release
|
||||
if: needs.meta.outputs.channel == 'nightly'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: relay-nightly-${{ needs.meta.outputs.date }}-${{ needs.meta.outputs.sha_short }}
|
||||
name: Relay nightly ${{ needs.meta.outputs.date }} (${{ needs.meta.outputs.sha_short }})
|
||||
draft: false
|
||||
prerelease: true
|
||||
generate_release_notes: true
|
||||
body: |
|
||||
Nightly Fluxer Relay image from canary.
|
||||
|
||||
Pull:
|
||||
```bash
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:nightly
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:nightly-${{ needs.meta.outputs.date }}
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:sha-${{ needs.meta.outputs.sha_short }}
|
||||
```
|
||||
|
||||
Build:
|
||||
- version: v${{ needs.meta.outputs.version }}
|
||||
- build: ${{ needs.meta.outputs.build_number }}
|
||||
- sha: ${{ github.sha }}
|
||||
- time: ${{ needs.meta.outputs.timestamp }}
|
||||
- channel: nightly
|
||||
- branch: canary
|
||||
|
||||
release-summary:
|
||||
name: release summary
|
||||
needs: [meta, build]
|
||||
if: always()
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
sparse-checkout: scripts/ci
|
||||
sparse-checkout-cone-mode: false
|
||||
|
||||
- name: summary
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/release_relay.py
|
||||
--step summary
|
||||
--build-result "${{ needs.build.result }}"
|
||||
--channel "${{ needs.meta.outputs.channel }}"
|
||||
--version "${{ needs.meta.outputs.version }}"
|
||||
--build-number "${{ needs.meta.outputs.build_number }}"
|
||||
--sha-short "${{ needs.meta.outputs.sha_short }}"
|
||||
--timestamp "${{ needs.meta.outputs.timestamp }}"
|
||||
--date-ymd "${{ needs.meta.outputs.date }}"
|
||||
--source-ref "${{ needs.meta.outputs.source_ref }}"
|
||||
--image-tags "${{ needs.build.outputs.image_tags }}"
|
||||
--image-digest "${{ needs.build.outputs.image_digest }}"
|
||||
--registry "${{ env.REGISTRY }}"
|
||||
--image-name "${{ env.IMAGE_NAME }}"
|
||||
278
fluxer/.github/workflows/release-server.yaml
vendored
Normal file
278
fluxer/.github/workflows/release-server.yaml
vendored
Normal file
@@ -0,0 +1,278 @@
|
||||
name: release server
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [canary]
|
||||
paths:
|
||||
- packages/**
|
||||
- fluxer_server/**
|
||||
- fluxer_gateway/**
|
||||
- pnpm-lock.yaml
|
||||
- .github/workflows/release-server.yaml
|
||||
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
channel:
|
||||
description: Release channel
|
||||
type: choice
|
||||
options: [stable, nightly]
|
||||
default: nightly
|
||||
required: false
|
||||
|
||||
ref:
|
||||
description: Git ref (branch, tag, or commit SHA)
|
||||
type: string
|
||||
default: ''
|
||||
required: false
|
||||
|
||||
version:
|
||||
description: Stable version (e.g. 1.0.0). Defaults to 0.0.<run_number>
|
||||
type: string
|
||||
required: false
|
||||
|
||||
build_server:
|
||||
description: Build Fluxer Server
|
||||
type: boolean
|
||||
default: true
|
||||
required: false
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
packages: write
|
||||
id-token: write
|
||||
attestations: write
|
||||
|
||||
concurrency:
|
||||
group: release-server-${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.channel) || 'nightly' }}
|
||||
cancel-in-progress: true
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
env:
|
||||
REGISTRY: ghcr.io
|
||||
IMAGE_NAME_SERVER: ${{ github.repository_owner }}/fluxer-server
|
||||
CHANNEL: ${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.channel) || 'nightly' }}
|
||||
SOURCE_REF: >-
|
||||
${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.ref)
|
||||
|| ((github.event_name == 'workflow_dispatch' && github.event.inputs.channel == 'stable') && 'main')
|
||||
|| 'canary' }}
|
||||
|
||||
jobs:
|
||||
meta:
|
||||
name: resolve build metadata
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
|
||||
outputs:
|
||||
version: ${{ steps.meta.outputs.version }}
|
||||
channel: ${{ steps.meta.outputs.channel }}
|
||||
source_ref: ${{ steps.meta.outputs.source_ref }}
|
||||
sha_short: ${{ steps.meta.outputs.sha_short }}
|
||||
timestamp: ${{ steps.meta.outputs.timestamp }}
|
||||
date: ${{ steps.meta.outputs.date }}
|
||||
build_number: ${{ steps.meta.outputs.build_number }}
|
||||
build_server: ${{ steps.should_build.outputs.server }}
|
||||
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ env.SOURCE_REF }}
|
||||
|
||||
- name: metadata
|
||||
id: meta
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/release_server.py
|
||||
--step metadata
|
||||
--version-input "${{ github.event.inputs.version }}"
|
||||
--channel "${{ env.CHANNEL }}"
|
||||
--source-ref "${{ env.SOURCE_REF }}"
|
||||
|
||||
- name: determine build targets
|
||||
id: should_build
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/release_server.py
|
||||
--step determine_build_targets
|
||||
--event-name "${{ github.event_name }}"
|
||||
--build-server-input "${{ github.event.inputs.build_server }}"
|
||||
|
||||
build-server:
|
||||
name: build fluxer server
|
||||
needs: meta
|
||||
if: needs.meta.outputs.build_server == 'true'
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
|
||||
outputs:
|
||||
image_tags: ${{ steps.docker_meta.outputs.tags }}
|
||||
image_digest: ${{ steps.build.outputs.digest }}
|
||||
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ needs.meta.outputs.source_ref }}
|
||||
|
||||
- name: set up buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: login
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: docker metadata
|
||||
id: docker_meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_SERVER }}
|
||||
tags: |
|
||||
type=raw,value=nightly,enable=${{ needs.meta.outputs.channel == 'nightly' }}
|
||||
type=raw,value=nightly-${{ needs.meta.outputs.date }},enable=${{ needs.meta.outputs.channel == 'nightly' }}
|
||||
type=raw,value=sha-${{ needs.meta.outputs.sha_short }},enable=${{ needs.meta.outputs.channel == 'nightly' }}
|
||||
type=raw,value=stable,enable=${{ needs.meta.outputs.channel == 'stable' }}
|
||||
type=raw,value=latest,enable=${{ needs.meta.outputs.channel == 'stable' }}
|
||||
type=raw,value=v${{ needs.meta.outputs.version }},enable=${{ needs.meta.outputs.channel == 'stable' }}
|
||||
type=semver,pattern={{version}},value=${{ needs.meta.outputs.version }},enable=${{ needs.meta.outputs.channel == 'stable' && !startsWith(needs.meta.outputs.version, '0.0.') }}
|
||||
type=semver,pattern={{major}}.{{minor}},value=${{ needs.meta.outputs.version }},enable=${{ needs.meta.outputs.channel == 'stable' && !startsWith(needs.meta.outputs.version, '0.0.') }}
|
||||
|
||||
- name: build and push
|
||||
id: build
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
file: fluxer_server/Dockerfile
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ steps.docker_meta.outputs.tags }}
|
||||
labels: |
|
||||
${{ steps.docker_meta.outputs.labels }}
|
||||
org.opencontainers.image.version=v${{ needs.meta.outputs.version }}
|
||||
org.opencontainers.image.revision=${{ github.sha }}
|
||||
org.opencontainers.image.created=${{ needs.meta.outputs.timestamp }}
|
||||
org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
|
||||
dev.fluxer.build.channel=${{ needs.meta.outputs.channel }}
|
||||
dev.fluxer.build.number=${{ needs.meta.outputs.build_number }}
|
||||
dev.fluxer.build.sha=${{ github.sha }}
|
||||
dev.fluxer.build.short_sha=${{ needs.meta.outputs.sha_short }}
|
||||
dev.fluxer.build.date=${{ needs.meta.outputs.date }}
|
||||
build-args: |
|
||||
BUILD_SHA=${{ github.sha }}
|
||||
BUILD_NUMBER=${{ needs.meta.outputs.build_number }}
|
||||
BUILD_TIMESTAMP=${{ needs.meta.outputs.timestamp }}
|
||||
RELEASE_CHANNEL=${{ needs.meta.outputs.channel }}
|
||||
cache-from: type=gha,scope=server-${{ needs.meta.outputs.channel }}
|
||||
cache-to: type=gha,mode=max,scope=server-${{ needs.meta.outputs.channel }}
|
||||
provenance: true
|
||||
sbom: true
|
||||
|
||||
- name: attest
|
||||
uses: actions/attest-build-provenance@v2
|
||||
with:
|
||||
subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_SERVER }}
|
||||
subject-digest: ${{ steps.build.outputs.digest }}
|
||||
push-to-registry: true
|
||||
|
||||
create-release:
|
||||
name: create release
|
||||
needs: [meta, build-server]
|
||||
if: |
|
||||
always() &&
|
||||
needs.meta.outputs.version != '' &&
|
||||
(needs.build-server.result == 'success' || needs.build-server.result == 'skipped')
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ needs.meta.outputs.source_ref }}
|
||||
|
||||
- name: stable release
|
||||
if: needs.meta.outputs.channel == 'stable'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: v${{ needs.meta.outputs.version }}
|
||||
name: Fluxer Server v${{ needs.meta.outputs.version }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
generate_release_notes: true
|
||||
body: |
|
||||
Fluxer Server
|
||||
|
||||
Pull:
|
||||
```bash
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_SERVER }}:v${{ needs.meta.outputs.version }}
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_SERVER }}:latest
|
||||
```
|
||||
|
||||
Build:
|
||||
- version: v${{ needs.meta.outputs.version }}
|
||||
- build: ${{ needs.meta.outputs.build_number }}
|
||||
- sha: ${{ github.sha }}
|
||||
- time: ${{ needs.meta.outputs.timestamp }}
|
||||
- channel: stable
|
||||
|
||||
Docs: https://docs.fluxer.app/self-hosting
|
||||
|
||||
- name: nightly release
|
||||
if: needs.meta.outputs.channel == 'nightly'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: nightly-${{ needs.meta.outputs.date }}-${{ needs.meta.outputs.sha_short }}
|
||||
name: Nightly build ${{ needs.meta.outputs.date }} (${{ needs.meta.outputs.sha_short }})
|
||||
draft: false
|
||||
prerelease: true
|
||||
generate_release_notes: true
|
||||
body: |
|
||||
Nightly Fluxer Server image from canary.
|
||||
|
||||
Pull:
|
||||
```bash
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_SERVER }}:nightly
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_SERVER }}:nightly-${{ needs.meta.outputs.date }}
|
||||
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_SERVER }}:sha-${{ needs.meta.outputs.sha_short }}
|
||||
```
|
||||
|
||||
Build:
|
||||
- version: v${{ needs.meta.outputs.version }}
|
||||
- build: ${{ needs.meta.outputs.build_number }}
|
||||
- sha: ${{ github.sha }}
|
||||
- time: ${{ needs.meta.outputs.timestamp }}
|
||||
- channel: nightly
|
||||
- branch: canary
|
||||
|
||||
release-summary:
|
||||
name: release summary
|
||||
needs: [meta, build-server]
|
||||
if: always()
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
sparse-checkout: scripts/ci
|
||||
sparse-checkout-cone-mode: false
|
||||
|
||||
- name: summary
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/release_server.py
|
||||
--step summary
|
||||
--build-result "${{ needs.build-server.result }}"
|
||||
--channel "${{ needs.meta.outputs.channel }}"
|
||||
--version "${{ needs.meta.outputs.version }}"
|
||||
--build-number "${{ needs.meta.outputs.build_number }}"
|
||||
--sha-short "${{ needs.meta.outputs.sha_short }}"
|
||||
--timestamp "${{ needs.meta.outputs.timestamp }}"
|
||||
--date-ymd "${{ needs.meta.outputs.date }}"
|
||||
--source-ref "${{ needs.meta.outputs.source_ref }}"
|
||||
--image-tags "${{ needs.build-server.outputs.image_tags }}"
|
||||
--image-digest "${{ needs.build-server.outputs.image_digest }}"
|
||||
--registry "${{ env.REGISTRY }}"
|
||||
--image-name-server "${{ env.IMAGE_NAME_SERVER }}"
|
||||
78
fluxer/.github/workflows/restart-gateway.yaml
vendored
Normal file
78
fluxer/.github/workflows/restart-gateway.yaml
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
name: restart gateway
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
confirmation:
|
||||
description: this will cause service interruption for all users. type RESTART to confirm.
|
||||
required: true
|
||||
type: string
|
||||
|
||||
concurrency:
|
||||
group: restart-gateway
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
SERVICE_NAME: fluxer-gateway
|
||||
IMAGE_NAME: fluxer-gateway
|
||||
CONTEXT_DIR: fluxer_gateway
|
||||
COMPOSE_STACK: fluxer-gateway
|
||||
RELEASE_CHANNEL: ${{ github.ref_name == 'canary' && 'staging' || 'production' }}
|
||||
|
||||
jobs:
|
||||
restart:
|
||||
name: Restart gateway
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
steps:
|
||||
- name: Validate confirmation
|
||||
if: ${{ github.event.inputs.confirmation != 'RESTART' }}
|
||||
run: python3 scripts/ci/workflows/restart_gateway.py --step validate_confirmation --confirmation "${{ github.event.inputs.confirmation }}"
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Record deploy commit
|
||||
run: python3 scripts/ci/workflows/restart_gateway.py --step record_deploy_commit
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||
|
||||
- name: Build image
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: ${{ env.CONTEXT_DIR }}
|
||||
file: ${{ env.CONTEXT_DIR }}/Dockerfile
|
||||
tags: ${{ env.IMAGE_NAME }}:${{ env.DEPLOY_SHA }}
|
||||
load: true
|
||||
platforms: linux/amd64
|
||||
cache-from: type=gha,scope=${{ env.SERVICE_NAME }}
|
||||
cache-to: type=gha,mode=max,scope=${{ env.SERVICE_NAME }}
|
||||
env:
|
||||
DOCKER_BUILD_SUMMARY: false
|
||||
DOCKER_BUILD_RECORD_UPLOAD: false
|
||||
|
||||
- name: Install docker-pussh
|
||||
run: python3 scripts/ci/workflows/restart_gateway.py --step install_docker_pussh
|
||||
|
||||
- name: Set up SSH agent
|
||||
uses: webfactory/ssh-agent@v0.9.1
|
||||
with:
|
||||
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_SERVER }}
|
||||
|
||||
- name: Add server to known hosts
|
||||
run: python3 scripts/ci/workflows/restart_gateway.py --step add_known_hosts --server-ip ${{ secrets.SERVER_IP }}
|
||||
|
||||
- name: Push image and deploy
|
||||
env:
|
||||
IMAGE_TAG: ${{ env.IMAGE_NAME }}:${{ env.DEPLOY_SHA }}
|
||||
SERVER: ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}
|
||||
run: python3 scripts/ci/workflows/restart_gateway.py --step push_and_deploy
|
||||
102
fluxer/.github/workflows/sync-desktop.yaml
vendored
Normal file
102
fluxer/.github/workflows/sync-desktop.yaml
vendored
Normal file
@@ -0,0 +1,102 @@
|
||||
name: sync desktop
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- canary
|
||||
paths:
|
||||
- 'fluxer_desktop/**'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branch:
|
||||
description: Branch to sync (main or canary)
|
||||
required: false
|
||||
default: ''
|
||||
type: string
|
||||
|
||||
concurrency:
|
||||
group: sync-desktop-${{ github.ref_name }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
sync:
|
||||
name: Sync to fluxerapp/fluxer_desktop
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
|
||||
steps:
|
||||
- name: Checkout CI scripts
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
sparse-checkout: scripts/ci
|
||||
sparse-checkout-cone-mode: false
|
||||
|
||||
- name: Create GitHub App token
|
||||
id: app-token
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app-id: ${{ secrets.SYNC_APP_ID }}
|
||||
private-key: ${{ secrets.SYNC_APP_PRIVATE_KEY }}
|
||||
owner: fluxerapp
|
||||
repositories: fluxer_desktop
|
||||
|
||||
- name: Get GitHub App user ID
|
||||
id: get-user-id
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/sync_desktop.py
|
||||
--step get_user_id
|
||||
--app-slug "${{ steps.app-token.outputs.app-slug }}"
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token }}
|
||||
|
||||
- name: Checkout source repository
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
path: source
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Determine target branch
|
||||
id: branch
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/sync_desktop.py
|
||||
--step determine_branch
|
||||
--input-branch "${{ inputs.branch }}"
|
||||
--ref-name "${{ github.ref_name }}"
|
||||
|
||||
- name: Clone target repository
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/sync_desktop.py
|
||||
--step clone_target
|
||||
--token "${{ steps.app-token.outputs.token }}"
|
||||
|
||||
- name: Configure git
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/sync_desktop.py
|
||||
--step configure_git
|
||||
--app-slug "${{ steps.app-token.outputs.app-slug }}"
|
||||
--user-id "${{ steps.get-user-id.outputs.user-id }}"
|
||||
|
||||
- name: Checkout or create target branch
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/sync_desktop.py
|
||||
--step checkout_or_create_branch
|
||||
--branch-name "${{ steps.branch.outputs.name }}"
|
||||
|
||||
- name: Sync files
|
||||
run: python3 scripts/ci/workflows/sync_desktop.py --step sync_files
|
||||
|
||||
- name: Commit and push
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/sync_desktop.py
|
||||
--step commit_and_push
|
||||
--branch-name "${{ steps.branch.outputs.name }}"
|
||||
|
||||
- name: Summary
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/sync_desktop.py
|
||||
--step summary
|
||||
--branch-name "${{ steps.branch.outputs.name }}"
|
||||
42
fluxer/.github/workflows/sync-static.yaml
vendored
Normal file
42
fluxer/.github/workflows/sync-static.yaml
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
name: sync static-bucket
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- 'fluxer_static/**'
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: sync-fluxer-static
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
push:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 25
|
||||
permissions:
|
||||
contents: read
|
||||
env:
|
||||
RCLONE_REMOTE: ovh
|
||||
RCLONE_BUCKET: fluxer-static
|
||||
RCLONE_SOURCE: fluxer_static
|
||||
RCLONE_ENDPOINT: https://s3.us-east-va.io.cloud.ovh.us
|
||||
RCLONE_REGION: us-east-1
|
||||
RCLONE_SOURCE_DIR: fluxer_static
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
lfs: true
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install rclone
|
||||
run: python3 scripts/ci/workflows/sync_static.py --step install_rclone
|
||||
|
||||
- name: Push repo contents to bucket
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
run: python3 scripts/ci/workflows/sync_static.py --step push
|
||||
90
fluxer/.github/workflows/test-cassandra-backup.yaml
vendored
Normal file
90
fluxer/.github/workflows/test-cassandra-backup.yaml
vendored
Normal file
@@ -0,0 +1,90 @@
|
||||
name: test cassandra-backup
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '0 */2 * * *'
|
||||
|
||||
concurrency:
|
||||
group: test-cassandra-backup
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
test-backup:
|
||||
name: Test latest Cassandra backup
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 45
|
||||
|
||||
env:
|
||||
CASSANDRA_IMAGE: cassandra:5.0.6
|
||||
CASS_CONTAINER: cass-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
UTIL_CONTAINER: cass-util-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
CASS_VOLUME: cassandra-data-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
BACKUP_VOLUME: cassandra-backup-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
MAX_HEAP_SIZE: 2G
|
||||
HEAP_NEWSIZE: 512M
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Set temp paths
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/test_cassandra_backup.py
|
||||
--step set_temp_paths
|
||||
|
||||
- name: Pre-clean
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/test_cassandra_backup.py
|
||||
--step pre_clean
|
||||
|
||||
- name: Install tools
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/test_cassandra_backup.py
|
||||
--step install_tools
|
||||
|
||||
- name: Find latest backup, validate freshness, download, decrypt, extract into Docker volume
|
||||
env:
|
||||
B2_KEY_ID: ${{ secrets.B2_KEY_ID }}
|
||||
B2_APPLICATION_KEY: ${{ secrets.B2_APPLICATION_KEY }}
|
||||
AGE_PRIVATE_KEY: ${{ secrets.CASSANDRA_AGE_PRIVATE_KEY }}
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/test_cassandra_backup.py
|
||||
--step fetch_backup
|
||||
|
||||
- name: Create data volume
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/test_cassandra_backup.py
|
||||
--step create_data_volume
|
||||
|
||||
- name: Restore keyspaces into volume and promote snapshot SSTables
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/test_cassandra_backup.py
|
||||
--step restore_keyspaces
|
||||
|
||||
- name: Start Cassandra
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/test_cassandra_backup.py
|
||||
--step start_cassandra
|
||||
|
||||
- name: Verify data
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/test_cassandra_backup.py
|
||||
--step verify_data
|
||||
|
||||
- name: Cleanup
|
||||
if: always()
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/test_cassandra_backup.py
|
||||
--step cleanup
|
||||
|
||||
- name: Report status
|
||||
if: always()
|
||||
env:
|
||||
JOB_STATUS: ${{ job.status }}
|
||||
run: >-
|
||||
python3 scripts/ci/workflows/test_cassandra_backup.py
|
||||
--step report_status
|
||||
57
fluxer/.github/workflows/update-word-lists.yaml
vendored
Normal file
57
fluxer/.github/workflows/update-word-lists.yaml
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
name: update word-lists
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 3 1 * *'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
update-word-lists:
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 25
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: canary
|
||||
|
||||
- name: Download latest word lists
|
||||
run: python3 scripts/ci/workflows/update_word_lists.py --step download
|
||||
|
||||
- name: Check for changes
|
||||
id: check_changes
|
||||
run: python3 scripts/ci/workflows/update_word_lists.py --step check_changes
|
||||
|
||||
- name: Update word lists
|
||||
if: steps.check_changes.outputs.changes_detected == 'true'
|
||||
run: python3 scripts/ci/workflows/update_word_lists.py --step update
|
||||
|
||||
- name: Create pull request for updated word lists
|
||||
if: steps.check_changes.outputs.changes_detected == 'true'
|
||||
uses: peter-evans/create-pull-request@v5
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
branch: word-lists-update-${{ github.run_id }}
|
||||
base: canary
|
||||
title: 'chore: update word lists from Tailscale upstream'
|
||||
body: |
|
||||
Automated update of scales.txt and tails.txt from the Tailscale repository.
|
||||
|
||||
These files are used to generate connection IDs for voice connections.
|
||||
|
||||
Source:
|
||||
- https://github.com/tailscale/tailscale/blob/main/words/scales.txt
|
||||
- https://github.com/tailscale/tailscale/blob/main/words/tails.txt
|
||||
commit-message: 'chore: update word lists from Tailscale upstream'
|
||||
files: |
|
||||
fluxer_api/src/words/scales.txt
|
||||
fluxer_api/src/words/tails.txt
|
||||
labels: automation
|
||||
|
||||
- name: No changes detected
|
||||
if: steps.check_changes.outputs.changes_detected == 'false'
|
||||
run: python3 scripts/ci/workflows/update_word_lists.py --step no_changes
|
||||
Reference in New Issue
Block a user