{"id":20207561,"url":"https://github.com/ctfer-io/victor","last_synced_at":"2025-04-10T12:34:21.765Z","repository":{"id":211934198,"uuid":"730303380","full_name":"ctfer-io/victor","owner":"ctfer-io","description":"Victor is always here to assist you through continuous deployment, and especially when updating and storing Pulumi stack states in webservers through a GitHub Action workflow or a Drone pipeline.","archived":false,"fork":false,"pushed_at":"2025-04-07T19:52:11.000Z","size":505,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-07T20:41:10.648Z","etag":null,"topics":["actions","continuous-deployment","docker","drone","golang","plugin","pulumi"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ctfer-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-11T16:24:41.000Z","updated_at":"2025-04-07T19:52:09.000Z","dependencies_parsed_at":"2024-01-01T15:26:06.543Z","dependency_job_id":"203613f1-393b-4c26-965a-127af8536f41","html_url":"https://github.com/ctfer-io/victor","commit_stats":null,"previous_names":["ctfer-io/victor"],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctfer-io%2Fvictor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctfer-io%2Fvictor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctfer-io%2Fvictor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctfer-io%2Fvictor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ctfer-io","download_url":"https://codeload.github.com/ctfer-io/victor/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248217146,"owners_count":21066633,"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":["actions","continuous-deployment","docker","drone","golang","plugin","pulumi"],"created_at":"2024-11-14T05:29:53.042Z","updated_at":"2025-04-10T12:34:21.738Z","avatar_url":"https://github.com/ctfer-io.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n    \u003ch1\u003eVictor\u003c/h1\u003e\n    \u003cp\u003e\u003cb\u003eVictor is always here to assist you through continuous deployment, and especially when updating and storing Pulumi stack states in webservers through a GitHub Action workflow or a Drone pipeline.\u003c/b\u003e\u003cp\u003e\n    \u003ca href=\"https://pkg.go.dev/github.com/ctfer-io/victor\"\u003e\u003cimg src=\"https://shields.io/badge/-reference-blue?logo=go\u0026style=for-the-badge\" alt=\"reference\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://hub.docker.com/r/ctferio/victor\"\u003e\u003cimg src=\"https://img.shields.io/docker/pulls/ctferio/victor?style=for-the-badge\" alt=\"docker pulls\"\u003e\u003c/a\u003e\n\t\u003ca href=\"https://goreportcard.com/report/github.com/ctfer-io/victor\"\u003e\u003cimg src=\"https://goreportcard.com/badge/github.com/ctfer-io/victor?style=for-the-badge\" alt=\"go report\"\u003e\u003c/a\u003e\n\t\u003ca href=\"https://coveralls.io/github/ctfer-io/victor?branch=main\"\u003e\u003cimg src=\"https://img.shields.io/coverallsCoverage/github/ctfer-io/victor?style=for-the-badge\" alt=\"Coverage Status\"\u003e\u003c/a\u003e\n\t\u003cbr\u003e\n\t\u003ca href=\"\"\u003e\u003cimg src=\"https://img.shields.io/github/license/ctfer-io/victor?style=for-the-badge\" alt=\"License\"\u003e\u003c/a\u003e\n\t\u003ca href=\"https://github.com/ctfer-io/victor/actions?query=workflow%3Aci+\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/ctfer-io/victor/ci.yaml?style=for-the-badge\u0026label=CI\" alt=\"CI\"\u003e\u003c/a\u003e\n\t\u003ca href=\"https://github.com/ctfer-io/victor/actions/workflows/codeql-analysis.yaml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/ctfer-io/victor/codeql-analysis.yaml?style=for-the-badge\u0026label=CodeQL\" alt=\"CodeQL\"\u003e\u003c/a\u003e\n    \u003cbr\u003e\n    \u003ca href=\"https://securityscorecards.dev/viewer/?uri=github.com/ctfer-io/victor\"\u003e\u003cimg src=\"https://img.shields.io/ossf-scorecard/github.com/ctfer-io/victor?label=openssf%20scorecard\u0026style=for-the-badge\" alt=\"OpenSSF Scoreboard\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n## How to use\n\nYou can drop the following into your GitHub Action workflow.\n\n```yaml\nname: 'My workflow'\n\non:\n  push:\n    branches:\n      - 'main'\n\njobs:\n  my-job:\n    runs-on: 'ubuntu-latest'\n    steps:\n      - name: 'Victor CD'\n        uses: 'ctfer-io/victor@v0'\n        with:\n          # Webserver related options\n          statefile: 'https://my-webserver.dev/project.stack.state'\n          username: ${{ secrets.WEBDAV_USERNAME }}\n          password: ${{ secrets.WEBDAV_PASSWORD }}\n          # Pulumi related options\n          passphrase: ${{ secrets.PULUMI_CONFIG_PASSPHRASE }}\n          context: './deploy'\n          resources:\n            - \"kubernetes 3.29.1\"\n            - \"random 4.13.2\"\n          configuration:\n            - \"namespace prod\"\n            - \"version v1.5.2\"\n          server: 'https://my-webserver.dev/pulumi'\n          outputs: 'outputs.json'\n        # Specific environment variables that fit your context (e.g. offline)\n        env:\n          MY_VAR1: 'my_value'\n          MY_VAR2: ${{ secrets.MY_VAR2 }}\n```\n\nAlternatively, you can use it in a Drone pipeline (`type: docker`).\n\n```yaml\nsteps:\n  - name: victor\n    image: ctferio/victor:latest\n    settings:\n      # Webserver related options\n      statefile: https://my-webserver.dev/project.stack.state\n      username:\n        from_secret: WEBSERVER_USERNAME\n      password:\n        from_secret: WEBSERVER_PASSWORD\n      # Pulumi related options\n      passphrase:\n        from_secret: PULUMI_CONFIG_PASSPHRASE\n      context: ./deploy\n      resources:\n        - \"kubernetes 3.29.1\"\n        - \"random 4.13.2\"\n      configuration:\n        - \"namespace prod\"\n        - \"version v1.5.2\"\n      server: https://my-webserver.dev/pulumi\n      outputs: outputs.json\n    # Specific environment variables that fit your context (e.g. offline)\n    environment:\n      MY_VAR1: \"my_value\"\n      MY_VAR2:\n        from_secret: MY_VAR2\n```\n\n## How it works\n\nThe following resumes what Victor does for you.\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"res/how-it-works.excalidraw.png\" alt=\"How it works in a GitHub Action workflow or a Drone pipeline\"\u003e\n\u003c/div\u003e\n\nHere are more explanation:\n 1. **Get stack if exist**: Victor create a new Pulumi workspace in your GitHub Action workflow or Drone pipeline, then create a stack, and if the webserver contains a state file, loads it. This enable the following to work properly.\n 2. **Update**: by comparing the existing and actualised resources (does a refresh first) to the target, Victor enable fine-grained continuous deployment of your resources.\n 3. **Push updated stack**: finally, Victor exports the stack state file and uploads it in the webserver such that future iterations will be able to load it, to really do **continuous** deployment.\n\n## Why using it ?\n\nSo why doing it with a GitHub Action or a Drone plugin rather than using multiple steps ?\n\n\u003cp align=\"center\"\u003e✨ \u003cb\u003eSimplicity\u003c/b\u003e ✨\u003c/p\u003e\n\nUsing this plugin, you ease your Continuous Deployments from a GitHub Action workflow or a Drone pipeline, without the need to maintain plugin updates, stack import and export, basic authentication handling...\nYes you can work without it, but why not simplify your job and focus on the **real** business value ?\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fctfer-io%2Fvictor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fctfer-io%2Fvictor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fctfer-io%2Fvictor/lists"}