{"id":42599045,"url":"https://github.com/nspcc-dev/gh-push-to-neofs","last_synced_at":"2026-01-29T00:16:33.412Z","repository":{"id":200780279,"uuid":"694075731","full_name":"nspcc-dev/gh-push-to-neofs","owner":"nspcc-dev","description":"GitHub action to push things into NeoFS","archived":false,"fork":false,"pushed_at":"2025-06-11T06:32:01.000Z","size":47,"stargazers_count":7,"open_issues_count":9,"forks_count":2,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-06-11T07:40:22.929Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/nspcc-dev.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":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-09-20T09:29:59.000Z","updated_at":"2025-06-11T06:32:03.000Z","dependencies_parsed_at":null,"dependency_job_id":"dedbc085-5378-47a5-a78c-55b3143aa315","html_url":"https://github.com/nspcc-dev/gh-push-to-neofs","commit_stats":null,"previous_names":["nspcc-dev/gh-push-to-neofs"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/nspcc-dev/gh-push-to-neofs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nspcc-dev%2Fgh-push-to-neofs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nspcc-dev%2Fgh-push-to-neofs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nspcc-dev%2Fgh-push-to-neofs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nspcc-dev%2Fgh-push-to-neofs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nspcc-dev","download_url":"https://codeload.github.com/nspcc-dev/gh-push-to-neofs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nspcc-dev%2Fgh-push-to-neofs/sbom","scorecard":{"id":697351,"data":{"date":"2025-08-11","repo":{"name":"github.com/nspcc-dev/gh-push-to-neofs","commit":"2231e4d795ece1a9cabf9ee6c82d50c4ec38b717"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.1,"checks":[{"name":"Code-Review","score":6,"reason":"Found 7/11 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":1,"reason":"2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/dco.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/nspcc-dev/gh-push-to-neofs/dco.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/nspcc-dev/gh-push-to-neofs/tests.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/nspcc-dev/gh-push-to-neofs/tests.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:68","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   1 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/dco.yml:1","Warn: topLevel permissions set to 'write-all': .github/workflows/tests.yml:22"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-22T04:07:14.258Z","repository_id":200780279,"created_at":"2025-08-22T04:07:14.259Z","updated_at":"2025-08-22T04:07:14.259Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28857423,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T22:56:21.783Z","status":"ssl_error","status_checked_at":"2026-01-28T22:56:00.861Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":[],"created_at":"2026-01-29T00:16:28.703Z","updated_at":"2026-01-29T00:16:33.405Z","avatar_url":"https://github.com/nspcc-dev.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"./.github/logo_dark.svg\"\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"./.github/logo_light.svg\"\u003e\n    \u003cimg src=\"./.github/logo_light.svg\"  width=\"500px\" alt=\"NeoFS logo\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://fs.neo.org\"\u003eNeoFS\u003c/a\u003e is a decentralized distributed object storage integrated with the \u003ca href=\"https://neo.org\"\u003eNeo blockchain\u003c/a\u003e.\n\u003c/p\u003e\n\n# GitHub Action to Publish to NeoFS\nThis GitHub action allows you to save files as objects in the [NeoFS](https://fs.neo.org/).\n\nThis way you can both publicly and privately save logs and test results, host web pages, and publish releases.\n\nTo use this action you need a wallet, some NeoFS balance and a container. The\neasiest way to handle deposit and container creation is via [Panel](https://panel.fs.neo.org/).\n\n## Supported platforms\nThis action supports the following platforms:\n- Linux x64\n\nThis action tested on the following runners:\n- [Ubuntu 22.04 GitHub-hosted runners](https://github.com/actions/runner-images/blob/main/images/linux/Ubuntu2204-Readme.md)\n\n# Configuration\n\n## GitHub secrets\nThe following Sensitive information must be passed as\n[GitHub Actions secrets](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions).\nIt is very important to use SECRETS and NOT variables, otherwise your wallet, password and token will be available to\nthe whole internet.\n\n| Key                     | Value                                                                                                                                                                      | Required | Default |\n|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|---------|\n| `NEOFS_WALLET`          | Base64-encoded NEP-6 Neo N3 wallet. To create N3 wallet: `neo-go wallet init -w wallet.json -a` The output of this command should be here: 'cat wallet.json \u0026#124; base64' | **Yes**  | N/A     |\n| `NEOFS_WALLET_PASSWORD` | N3 wallet password                                                                                                                                                         | **Yes**  | N/A     |\n\nPlease keep sensitive data safe.\n\n## GitHub environment variables\n\n### NeoFS network environment variables\nThe following variables must be passed as\n[GitHub Actions vars context](https://docs.github.com/en/actions/learn-github-actions/variables#using-the-vars-context-to-access-configuration-variable-values) \nor [GitHub Actions environment variables](https://docs.github.com/en/actions/learn-github-actions/variables).\n\nUp-to-date information about NeoFS network can be seen on https://status.fs.neo.org.\n\nIf you are using the NeoFS mainnet, we recommend that you do not change `NEOFS_NETWORK_DOMAIN`\nand `NEOFS_HTTP_GATE` environment variables.\n\n| Key                    | Value                                                                                 | Required | Default                |\n|------------------------|---------------------------------------------------------------------------------------|----------|------------------------|\n| `NEOFS_NETWORK_DOMAIN` | Rpc endpoint domain address                                                           | **No**   | st1.storage.fs.neo.org |\n| `NEOFS_HTTP_GATE`      | REST gateway domain address                                                           | **No**   | rest.fs.neo.org        |\n| `STORE_OBJECTS_CID`    | Container ID for your data. For example: 7gHG4HB3BrpFcH9BN3KMZg6hEETx4mFP71nEoNXHFqrv | **Yes**  | N/A                    |\n\n\n### Data handling environment variables\nThe following variables must be passed as\n[GitHub Actions vars context](https://docs.github.com/en/actions/learn-github-actions/variables#using-the-vars-context-to-access-configuration-variable-values)\nor [GitHub Actions environment variables](https://docs.github.com/en/actions/learn-github-actions/variables).\n\nThese inputs control uploaded data. Attributes can be used to identify all objects for a given uploaded set. `LIFETIME`\ncan be used to autodelete objects that don't need to be stored forever (like logs or test reports).\n\n| Key                 | Value                                                                                                                                                   | Required | Default |\n|---------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------|----------|---------|\n| `PATH_TO_FILES_DIR` | Path to the directory with the files to be pushed                                                                                                       | **Yes**  | N/A     |\n| `LIFETIME`          | Number of epochs (for mainnet 1 epoch is ~1 hour) for object to stay valid (it's deleted afterwards), \"0\" means \"unlimited\"                             | **No**   | 0       |\n| `NEOFS_ATTRIBUTES`  | User attributes in form of Key1=Value1,Key2=Value2. By default, each object contains attributes of relative path to the file and MIME type of the file. | **No**   | N/A     |\n| `REPLACE_OBJECTS`   | Boolean controlling object replacement by path, with \"false\" objects are uploaded and old ones are kept even if they have the same \"FilePath\"           | **No**   | true    |\n| `REPLACE_CONTAINER_CONTENTS` | Boolean controlling complete container contents replacement, when \"true\" all old container objects are deleted                                 | **No**   | false   |\n| `STRIP_PREFIX`      | Boolean controlling FilePath attribute of uploaded objects, when \"true\" PATH_TO_FILES_DIR is stripped from file path                                    | **No**   | false   |\n| `URL_PREFIX`        | Prefix added to the URL address in OUTPUT_CONTAINER_URL                                                                                                 | **No**   | N/A     |\n\n## Output\n\n| Key                    | Value                                                                                                       | Required | Default |\n|------------------------|-------------------------------------------------------------------------------------------------------------|----------|---------|\n| `OUTPUT_CONTAINER_URL` | Output example: https://http.storage.fs.neo.org/HXSaMJXk2g8C14ht8HSi7BBaiYZ1HeWh2xnWPGQCg4H6/872-1696332227 | **No**   | N/A     |\n\n# Dependencies\n\n## Python\nThe GitHub runner must have Python 3 installed on it.\n\nYou can install Python like this:\n```yml\n- name: Set up Python\n  uses: actions/setup-python@v4\n  with:\n    python-version: '3.11.6'\n```\n\n# Examples\n## How to store files from the directory to NeoFS\n\n```yml\nname: Publish to NeoFS\non:\n  push:\n    branches: [ master ]\njobs:\n  push-to-neofs:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Set up Python\n        uses: actions/setup-python@v4\n        with:\n          python-version: '3.11.6'\n  \n      - uses: actions/checkout@v4\n      - name: Publish to NeoFS\n        uses: nspcc-dev/gh-push-to-neofs@master\n        with:\n          NEOFS_WALLET: ${{ secrets.NEOFS_WALLET }}\n          NEOFS_WALLET_PASSWORD: ${{ secrets.NEOFS_WALLET_PASSWORD }}\n          NEOFS_NETWORK_DOMAIN: ${{ vars.NEOFS_NETWORK_DOMAIN }}\n          NEOFS_HTTP_GATE: ${{ vars.NEOFS_HTTP_GATE }}\n          STORE_OBJECTS_CID: ${{ vars.STORE_OBJECTS_CID }}\n          LIFETIME: ${{ vars.LIFETIME }}\n          PATH_TO_FILES_DIR: ${{ env.PATH_TO_FILES_DIR }}\n```\n\n## How to store Allure report to NeoFS as static page\n\nSee https://github.com/nspcc-dev/gh-push-allure-report-to-neofs for more details.\n\nIn the [NeoFS](https://github.com/nspcc-dev/neofs-node) project, we use the following workflow to store the\n[Allure report](https://github.com/allure-framework/allure2) as a static page in the NeoFS mainnet.\nThis is a good example of practical use of this action.\n\nTo avoid creating a huge (weighing hundreds of megabytes or more) web page, in this example we upload zip archives with\nattachments as separate objects.\nAccess to them from the Allure report will be via hyperlinks from the report page. Yes, this is the Web 1.0 world\nin the Web 3.0. And it's beautiful.\n\nWe use the [simple-elf/allure-report-action](https://github.com/simple-elf/allure-report-action) action to generate\nthe Allure report and the [allure-combine](https://github.com/MihanEntalpo/allure-single-html-file) tool to convert\nthe report to a static page.\nOf course, you can use any other tool to generate the Allure report and convert it to a static page. For example, you\ncan use [allure-commandline](https://github.com/allure-framework/allure-npm) or Allure itself according to\n[this](https://github.com/allure-framework/allure2/pull/2072) merged pull request.\n\nThe Allure report will be available in a web browser at a link like this:\nhttps://http.fs.neo.org/86C4P6uJC7gb5n3KkwEGpXRfdczubXyRNW5N9KeJRW73/53-1696453127/comb_report/complete.html#\n\nAttachments will also be available at the link:\nhttps://http.fs.neo.org/86C4P6uJC7gb5n3KkwEGpXRfdczubXyRNW5N9KeJRW73/876-1696502182/comb_report/data/attachments/ce0fa9e280851f32.zip\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnspcc-dev%2Fgh-push-to-neofs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnspcc-dev%2Fgh-push-to-neofs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnspcc-dev%2Fgh-push-to-neofs/lists"}