{"id":15090878,"url":"https://github.com/williamfzc/glockr","last_synced_at":"2026-01-04T19:03:59.684Z","repository":{"id":57434981,"uuid":"184398764","full_name":"williamfzc/glockr","owner":"williamfzc","description":"make everything lockable","archived":false,"fork":false,"pushed_at":"2019-05-05T03:07:59.000Z","size":60,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-09-22T09:04:48.914Z","etag":null,"topics":["jenkins","lockable","management","python","resources"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/williamfzc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-05-01T10:07:50.000Z","updated_at":"2019-05-05T03:08:01.000Z","dependencies_parsed_at":"2022-09-04T15:33:01.057Z","dependency_job_id":null,"html_url":"https://github.com/williamfzc/glockr","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamfzc%2Fglockr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamfzc%2Fglockr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamfzc%2Fglockr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamfzc%2Fglockr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/williamfzc","download_url":"https://codeload.github.com/williamfzc/glockr/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244937833,"owners_count":20535127,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["jenkins","lockable","management","python","resources"],"created_at":"2024-09-25T10:34:28.460Z","updated_at":"2026-01-04T19:03:59.610Z","avatar_url":"https://github.com/williamfzc.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eG(lobal) Lock(able) R(esource)\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n    \u003cem\u003eMake everything lockable.\u003c/em\u003e\n\u003c/p\u003e\n\n---\n\n[![Python 3.6](https://img.shields.io/badge/python-3.6+-blue.svg)](https://www.python.org/downloads/release/python-360/)\n[![PyPI version](https://badge.fury.io/py/glockr.svg)](https://badge.fury.io/py/glockr)\n[![Maintainability](https://api.codeclimate.com/v1/badges/913f98606870d82e0b24/maintainability)](https://codeclimate.com/github/williamfzc/glockr/maintainability)\n[![Build Status](https://travis-ci.org/williamfzc/glockr.svg?branch=master)](https://travis-ci.org/williamfzc/glockr)\n\n---\n\n# goal\n\nMake everything(resource) lockable.\n\nHighly inspired by [Jenkins's lockable resources plugin](https://wiki.jenkins.io/display/JENKINS/Lockable+Resources+Plugin).\n\nAnd, make it works locally.\n\n# usage\n\nPython 3.6+\n\n## backend\n\n\u003e g lock r s = global lockable resource server\n\nStart your backend firstly:\n\n```bash\npip install glockr\n\n# default use port 29410\nglockrs start\n\n# or use another port?\n# would be better to set it in file (such as ~/.bashrc)\nexport GLOCKR_PORT=29411 \u0026\u0026 glockrs start\n\n# and your server will be running on 29411\n```\n\nOr, directly use docker:\n\n```bash\ndocker pull williamfzc/glockr\ndocker run --rm -p 29410:29410 williamfzc/glockr\n```\n\nBased on [FastAPI](https://github.com/tiangolo/fastapi), All the API of glockr can be easily viewed and executed via [http://127.0.0.1:29410/docs](http://127.0.0.1:29410/docs). \n\n![backend](./pic/backend_ui.png)\n\nYou can also use it as UI to manage your resource directly.\n\n## CLI\n\n\u003e g lock r c = global lockable resource client\n\nMake sure glockr backend has been started.\n\n```bash\nglockrc heartbeat\n```\n\nAnd you will see the help:\n\n```bash\n➜  glockr git:(master) glockrc\nType:        GClient\nString form: \u003cglockr.client.GClient object at 0x7f506abcee48\u003e\n\nUsage:       glockrc\n             glockrc acquire-label\n             glockrc acquire-name\n             glockrc add\n             glockrc download\n             glockrc heartbeat\n             glockrc release-label\n             glockrc release-name\n             glockrc remove\n             glockrc show-all\n             glockrc upload\n```\n\nJSON response can be easily handled by other programs.\n\n### add a new resource\n\nNew a resource object, named \"123\", label \"abc\":\n\n```bash\nin:\nglockrc add 123 abc\n\nout:\n{\"result\": True, \"reason\": \"\"}\n```\n\n### acquire a resource\n\nAcquire it by name!\n\n```bash\nin:\nglockrc acquire-name 123\n\nout:\n{\"result\": True, \"reason\": \"\"}\n```\n\nAfter acquirement, resource has been locked!\n\n```bash\nin:\nglockrc acquire-name 123\n\nout:\n{\"result\": False, \"reason\": \"res 123 status: BUSY\"}\n```\n\n### acquire multiple resources with `label`\n\nLabel can be used to require locks on multiple resources concurrently.\n\nNew a resource object, named \"456\", label \"abc\". Then, lock label \"abc\". By doing this, \"123\" and \"456\" (because they have label \"abc\") will be locked.\n\n```bash\nin:\nglockrc release-name 123\nglockrc add 456 abc\nglockrc acquire-label abc\nglockrc show-all\n\nout:\n{\"123\": {\"name\": \"123\", \"label\": \"abc\", \"status\": \"BUSY\"}, \"456\": {\"name\": \"456\", \"label\": \"abc\", \"status\": \"BUSY\"}}\n```\n\n### backup and restore your data\n\nNote: **glockr server only save your data in python runtime! And once server were stopped, your data will gone and you have to add them again.**\n\nBut, you can use `download` and `upload` to sync your data easily.\n\n```bash\nin:\nglockrc download ./data1.json\n\nout:\n{\"123\": {\"name\": \"123\", \"label\": \"abc\", \"status\": \"BUSY\"}, \"456\": {\"name\": \"456\", \"label\": \"abc\", \"status\": \"BUSY\"}}\n```\n\nYour data will be saved in `./data1.json`. And, you can use them to init your server:\n\n```bash\nin:\nglockrc upload ./data1.json\n\nout:\n{\"result\":true,\"reason\":\"\"}\n{\"result\":true,\"reason\":\"\"}\n```\n\nOne by one, your data has been uploaded!\n\n## program (WIP)\n\nBased on C/S, glockr supports different language clients.\n\n# contribution\n\nWelcome! And please let me know via issue or PR :)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwilliamfzc%2Fglockr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwilliamfzc%2Fglockr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwilliamfzc%2Fglockr/lists"}