commit
e90f34b1b6
|
@ -0,0 +1,65 @@
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "main" ]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-snapbin-image:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4.1.1
|
||||||
|
- uses: cachix/install-nix-action@v26
|
||||||
|
- uses: DeterminateSystems/magic-nix-cache-action@main
|
||||||
|
- name: Build snapbin image
|
||||||
|
run: nix build .#snapbin-image && docker load < ./result
|
||||||
|
|
||||||
|
- name: Log into registry
|
||||||
|
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
|
||||||
|
|
||||||
|
- name: Push image
|
||||||
|
env:
|
||||||
|
IMAGE_NAME: snapbin
|
||||||
|
run: |
|
||||||
|
IMAGE_ID=ghcr.io/${{ github.repository }}/$IMAGE_NAME
|
||||||
|
# Change all uppercase to lowercase
|
||||||
|
IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')
|
||||||
|
# Strip git ref prefix from version
|
||||||
|
VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
|
||||||
|
# Strip "v" prefix from tag name
|
||||||
|
[[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
|
||||||
|
# Use Docker `latest` tag convention
|
||||||
|
[ "$VERSION" == "main" ] && VERSION=latest
|
||||||
|
echo IMAGE_ID=$IMAGE_ID
|
||||||
|
echo VERSION=$VERSION
|
||||||
|
docker tag $IMAGE_NAME $IMAGE_ID:$VERSION
|
||||||
|
docker push $IMAGE_ID:$VERSION
|
||||||
|
|
||||||
|
build-redis-image:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4.1.1
|
||||||
|
- uses: cachix/install-nix-action@v26
|
||||||
|
- uses: DeterminateSystems/magic-nix-cache-action@main
|
||||||
|
- name: Build redis image
|
||||||
|
run: nix build .#redis-image && docker load < ./result
|
||||||
|
|
||||||
|
- name: Log into registry
|
||||||
|
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
|
||||||
|
|
||||||
|
- name: Push image
|
||||||
|
env:
|
||||||
|
IMAGE_NAME: redis
|
||||||
|
run: |
|
||||||
|
IMAGE_ID=ghcr.io/${{ github.repository }}/$IMAGE_NAME
|
||||||
|
# Change all uppercase to lowercase
|
||||||
|
IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')
|
||||||
|
# Strip git ref prefix from version
|
||||||
|
VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
|
||||||
|
# Strip "v" prefix from tag name
|
||||||
|
[[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
|
||||||
|
# Use Docker `latest` tag convention
|
||||||
|
[ "$VERSION" == "main" ] && VERSION=latest
|
||||||
|
echo IMAGE_ID=$IMAGE_ID
|
||||||
|
echo VERSION=$VERSION
|
||||||
|
docker tag $IMAGE_NAME $IMAGE_ID:$VERSION
|
||||||
|
docker push $IMAGE_ID:$VERSION
|
15
README.org
15
README.org
|
@ -10,21 +10,24 @@ This project was inspired by Snappass and was previously licensed under MIT.
|
||||||
|
|
||||||
** Tests :verb:
|
** Tests :verb:
|
||||||
|
|
||||||
*** Store secret
|
# To run this tests you need to have Emacs and the package [[https://github.com/federicotdn/verb][verb]] installed.
|
||||||
POST http://localhost:8000
|
# Then you can press the following key combination on the headings {C-c C-r C-r}.
|
||||||
|
|
||||||
|
template http://localhost:8000
|
||||||
Accept: application/json
|
Accept: application/json
|
||||||
Content-Type: application/json
|
Content-Type: application/json
|
||||||
|
|
||||||
|
*** Store secret
|
||||||
|
POST /
|
||||||
|
|
||||||
{
|
{
|
||||||
"ttl": 604800,
|
"ttl": 604800,
|
||||||
"password": "Foo"
|
"password": "Foo"
|
||||||
}
|
}
|
||||||
|
|
||||||
*** Retrieve secret
|
*** Retrieve secret
|
||||||
POST http://localhost:8000/get-secret
|
POST /get-secret
|
||||||
Accept: application/json
|
|
||||||
Content-Type: application/json
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"key": "snappass941ad23f9e4b4e7fa699854e48f83ff9~tQVYlz56h1bzXVlrCY5W8rYER1sXGtvYtRHrMyXLhSc="
|
"key": "{{(verb-json-get (oref verb-last body) "key")}}"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
import src.main as snapbin
|
import snapbin.main as snapbin
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: snapbin
|
||||||
|
ports:
|
||||||
|
- "8000:8000"
|
||||||
|
redis:
|
||||||
|
image: redis
|
55
flake.nix
55
flake.nix
|
@ -22,23 +22,56 @@
|
||||||
let
|
let
|
||||||
pkgs = nixpkgs.legacyPackages.${system};
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; };
|
poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; };
|
||||||
|
application = poetry2nix.mkPoetryApplication {
|
||||||
|
projectDir = ./.;
|
||||||
|
python = pkgs.python312;
|
||||||
|
};
|
||||||
|
env = poetry2nix.mkPoetryEnv {
|
||||||
|
projectDir = ./.;
|
||||||
|
python = pkgs.python312;
|
||||||
|
groups = [ "dev" ];
|
||||||
|
editablePackageSources = {
|
||||||
|
snapbin = ./snapbin;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
tests = pkgs.writeShellScriptBin "python-test" ''
|
||||||
|
trap "process-compose down &> /dev/null" EXIT
|
||||||
|
process-compose up --tui=false &
|
||||||
|
pytest --cov=snapbin tests.py
|
||||||
|
'';
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
packages = {
|
packages = {
|
||||||
devenv-up = self.devShells.${system}.default.config.procfileScript;
|
snapbin-image = pkgs.dockerTools.buildImage {
|
||||||
|
name = "snapbin";
|
||||||
|
tag = "latest";
|
||||||
|
copyToRoot = pkgs.buildEnv {
|
||||||
|
name = "image-root";
|
||||||
|
paths = [ application.dependencyEnv ];
|
||||||
|
};
|
||||||
|
config = {
|
||||||
|
Cmd = [
|
||||||
|
"${application.dependencyEnv}/bin/gunicorn"
|
||||||
|
"--bind=0.0.0.0"
|
||||||
|
"snapbin.main:app"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
redis-image = pkgs.dockerTools.buildImage {
|
||||||
|
name = "redis";
|
||||||
|
tag = "latest";
|
||||||
|
copyToRoot = pkgs.buildEnv {
|
||||||
|
name = "image-root";
|
||||||
|
paths = [ pkgs.redis ];
|
||||||
|
};
|
||||||
|
config = {
|
||||||
|
Cmd = [ "${pkgs.redis}/bin/redis-server" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
devShells =
|
devShells =
|
||||||
let
|
let
|
||||||
config = self.devShells.${system}.default.config;
|
config = self.devShells.${system}.default.config;
|
||||||
env = poetry2nix.mkPoetryEnv {
|
|
||||||
projectDir = ./.;
|
|
||||||
python = pkgs.python312;
|
|
||||||
};
|
|
||||||
tests = pkgs.writeShellScriptBin "python-test" ''
|
|
||||||
trap "process-compose down &> /dev/null" EXIT
|
|
||||||
process-compose up --tui=false &
|
|
||||||
pytest --cov=src tests.py
|
|
||||||
'';
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
default = devenv.lib.mkShell {
|
default = devenv.lib.mkShell {
|
||||||
|
@ -60,7 +93,7 @@
|
||||||
processes = {
|
processes = {
|
||||||
webserver = {
|
webserver = {
|
||||||
process-compose.depends_on.redis.condition = "process_started";
|
process-compose.depends_on.redis.condition = "process_started";
|
||||||
exec = "gunicorn src.main:app";
|
exec = "gunicorn snapbin.main:app";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
services.redis.enable = true;
|
services.redis.enable = true;
|
||||||
|
|
|
@ -4,7 +4,7 @@ version = "0.1.0"
|
||||||
description = "A little service to store and encrypt information, deleting it once it's retrieved."
|
description = "A little service to store and encrypt information, deleting it once it's retrieved."
|
||||||
authors = ["Andreas Zweili <andreas@zweili.ch>"]
|
authors = ["Andreas Zweili <andreas@zweili.ch>"]
|
||||||
license = "GPL3.0+"
|
license = "GPL3.0+"
|
||||||
readme = "README.md"
|
readme = "README.org"
|
||||||
|
|
||||||
[tool.pylint."MESSAGES CONTROL"]
|
[tool.pylint."MESSAGES CONTROL"]
|
||||||
disable = [
|
disable = [
|
||||||
|
|
2
tests.py
2
tests.py
|
@ -8,7 +8,7 @@ from freezegun import freeze_time
|
||||||
from werkzeug.exceptions import BadRequest
|
from werkzeug.exceptions import BadRequest
|
||||||
|
|
||||||
# noinspection PyPep8Naming
|
# noinspection PyPep8Naming
|
||||||
import src.main as snapbin
|
import snapbin.main as snapbin
|
||||||
|
|
||||||
|
|
||||||
def test_get_password():
|
def test_get_password():
|
||||||
|
|
Loading…
Reference in New Issue