{"id":30902814,"url":"https://github.com/code-tool/argocd-helmfile-plugin","last_synced_at":"2026-06-21T18:31:47.705Z","repository":{"id":310936606,"uuid":"1040110264","full_name":"code-tool/argocd-helmfile-plugin","owner":"code-tool","description":"argocd-helmfile-plugin","archived":false,"fork":false,"pushed_at":"2026-05-27T08:17:28.000Z","size":14,"stargazers_count":0,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-27T10:13:19.130Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/code-tool.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-18T13:23:41.000Z","updated_at":"2026-05-27T08:15:17.000Z","dependencies_parsed_at":"2025-08-21T06:35:36.187Z","dependency_job_id":"d662ee3b-5b66-48bb-9825-bb5fca407af0","html_url":"https://github.com/code-tool/argocd-helmfile-plugin","commit_stats":null,"previous_names":["code-tool/argocd-helmfile-plugin"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/code-tool/argocd-helmfile-plugin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code-tool%2Fargocd-helmfile-plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code-tool%2Fargocd-helmfile-plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code-tool%2Fargocd-helmfile-plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code-tool%2Fargocd-helmfile-plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/code-tool","download_url":"https://codeload.github.com/code-tool/argocd-helmfile-plugin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code-tool%2Fargocd-helmfile-plugin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34622271,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-21T02:00:05.568Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":"2025-09-09T08:50:35.731Z","updated_at":"2026-06-21T18:31:47.700Z","avatar_url":"https://github.com/code-tool.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# argocd-helmfile-plugin\n\n![Image](https://img.shields.io/docker/pulls/code-tool/argocd-helmfile-plugin.svg)\n![Image](https://img.shields.io/github/actions/workflow/status/code-tool/argocd-helmfile-plugin/ci.yml?branch=main\u0026style=flat-square)\n\n# Intro\n\nSupport for `helmfile` with `argo-cd`.\n\n`argo-cd` already supports `helm` in 2 distinct ways, why is this useful?\n\n- It helps decouple configuration from chart development\n- It's similar to using a repo type of `helm` but you can still manage\n  configuration with git.\n- Because I like the power afforded using `helmfile`'s features such as\n  `environments`, `selectors`, templates, and being able to use `ENV` vars as\n  conditionals **AND** values.\n- https://github.com/helmfile/helmfile/blob/main/docs/writing-helmfile.md\n- https://github.com/helmfile/helmfile/blob/main/docs/shared-configuration-across-teams.md\n\n# Security\n\nPlease make note that `helmfile` itself allows execution of arbitrary scripts.\nDue to this feature, execution of arbitrary scripts are allowed by this plugin,\nboth explicitly (see `HELMFILE_INIT_SCRIPT_FILE` env below) and implicity.\n\nConsider these implications for your environment and act appropriately.\n\n- https://github.com/roboll/helmfile#templating (`exec` description)\n- https://github.com/helmfile/helmfile/pull/1 (can disable `exec` using env vars)\n- the execution pod/context is the `argocd-repo-server`\n\n# Installation\n\n- https://argo-cd.readthedocs.io/en/stable/operator-manual/config-management-plugins/\n\n## Sidecar\n\nThis shows optional use of sops/age integration. You may add/remove others as necessary.\n\n```yaml\nrepoServer:\n  volumes:\n  ...\n  - name: age-secret-keys\n    secret:\n      secretName: argocd-age-secret-keys\n  - emptyDir: {}\n    name: helmfile-cmp-tmp\n\n  extraContainers:\n  - name: helmfile-plugin\n    image: code-tool/argocd-helmfile-plugin:latest\n    command: [/var/run/argocd/argocd-cmp-server]\n    env:\n    ...\n    - name: SOPS_AGE_KEY_FILE\n      value: /sops/age/keys.txt\n    securityContext:\n      runAsNonRoot: true\n      runAsUser: 999\n    volumeMounts:\n      ...\n      - mountPath: /sops/age\n        name: age-secret-keys\n      - mountPath: /var/run/argocd\n        name: var-files\n      - mountPath: /home/argocd/cmp-server/plugins\n        name: plugins\n      - mountPath: /tmp\n        name: helmfile-cmp-tmp\n```\n\n# Usage\n\nConfigure your `argo-cd` app to use a repo/directory which holds a valid\n`helmfile` configuration. This can be a directory which contains a\n`helmfile.yaml` **OR** `helmfile.yaml.gotmpl` file **OR** a `helmfile.d` directory containing any number of\n`*.yaml` or `*.yaml.gotmpl` files. You cannot have both configurations.\n\nThere are a number of specially handled `ENV` variables which can be set (all\noptional):\n\n- `HELM_BINARY` - custom path to `helm` binary\n- `HELM_TEMPLATE_OPTIONS` - pass-through options for the templating operation\n  `helm template --help`\n- `HELMFILE_BINARY` - custom path to `helmfile` binary\n- `HELMFILE_USE_CONTEXT_NAMESPACE` - do not set helmfile namespace to `ARGOCD_APP_NAMESPACE`,\n  for use with multi-namespace apps\n- `HELMFILE_GLOBAL_OPTIONS` - pass-through options for all `helmfile`\n  operations `helmfile --help`\n- `HELMFILE_TEMPLATE_OPTIONS` - pass-through options for the templating\n  operation `helmfile template --help`\n- `HELMFILE_INIT_SCRIPT_FILE` - path to script to execute during init phase\n- `HELMFILE_HELMFILE` - a complete `helmfile.yaml` or `helmfile.yaml.gotmpl` content\n- `HELMFILE_HELMFILE_STRATEGY` - one of `REPLACE` or `INCLUDE`\n  - `REPLACE` - the default option, only the content of `HELMFILE_HELMFILE` is\n    rendered, if any valid files exist in the repo they are ignored\n  - `INCLUDE` - any valid files in the repo **AND** the content of\n    `HELMFILE_HELMFILE` are rendered, precedence is given to\n    `HELMFILE_HELMFILE` should the same release name be declared in multiple\n    files\n- `HELMFILE_CACHE_CLEANUP` - run helmfile cache cleanup on init\n\nOf the above `ENV` variables, the following do variable expansion on the value:\n\n- `HELMFILE_GLOBAL_OPTIONS`\n- `HELMFILE_TEMPLATE_OPTIONS`\n- `HELM_TEMPLATE_OPTIONS`\n- `HELMFILE_INIT_SCRIPT_FILE`\n- `HELM_DATA_HOME`\n\nMeaning, you can do things like:\n\n- `HELMFILE_GLOBAL_OPTIONS=\"--environment ${ARGOCD_APP_NAME} --selector cluster=${CLUSTER_ID}`\n\nAny of the standard `Build Environment` variables can be used as well as\nvariables declared in the application spec.\n\n- https://argoproj.github.io/argo-cd/user-guide/config-management-plugins/#environment\n- https://argoproj.github.io/argo-cd/user-guide/build-environment/\n\n## Helm Plugins\n\nTo use the various helm plugins the recommended approach is the install the\nplugins using the/an `initContainers` (explicitly set the `HELM_DATA_HOME` env\nvar during the `helm plugin add` command) and simply set the `HELM_DATA_HOME`\nenvironment variable in your application spec (or globally in the pod). This\nprevents the plugin(s) from being downloaded over and over each run.\n\n```yaml\n# repo server deployment\n  volumes:\n  ...\n  - name: helm-data-home\n    emptyDir: {}\n\n# repo-server container\n  volumeMounts:\n  ...\n  - mountPath: /home/argocd/.local/share/helm\n    name: helm-data-home\n\n# init container\n  volumeMounts:\n  ...\n  - mountPath: /helm/data\n    name: helm-data-home\n\n    [[ ! -d \"${HELM_DATA_HOME}/plugins/helm-secrets\" ]] \u0026\u0026 /custom-tools/helm-v3 plugin install https://github.com/jkroepke/helm-secrets --version ${HELM_SECRETS_VERSION}\n    chown -R 999:999 \"${HELM_DATA_HOME}\"\n\n# lastly, in your app definition\n...\nplugin:\n  env:\n  - name: HELM_DATA_HOME\n    value: /home/argocd/.local/share/helm\n```\n\nIf the above is not possible/desired, the recommended approach would be to use\n`HELMFILE_INIT_SCRIPT_FILE` to execute an arbitrary script during the `init`\nphase. Within the script it's desireable to run `helm plugin list` and only\ninstall the plugin only if it's not already installed.\n\n## Custom Init\n\nYou can use the `HELMFILE_INIT_SCRIPT_FILE` feature to do any kind of _init_\nlogic required including installing helm plugins, downloading external files,\netc. The value can be a relative or absolute path and the file itself can be\ninjected using an `initContainers` or stored in the application git repository.\n\n## Development\n```declarative\n# Create fork.\n# Add the original repository as a new remote called \"upstream\" (only once, if not done before)\ngit remote add upstream https://github.com/code-tool/argocd-helmfile-plugin.git\n\n# List all remotes to verify that \"upstream\" exists\ngit remote -v\n\n# 1. Fetch the latest changes from the original repository\ngit fetch upstream\n\n# 2. Switch to your main branch (your fork’s main branch, usually `master` or `main`)\ngit checkout main\n\n# 3. Merge the latest changes from the original repository into your `main`\ngit merge upstream/main\n\n# 4. Push the updated `main` branch to your fork on GitHub\ngit push origin main\n\n# 5. Create a new feature branch from the updated `main` for your next changes\ngit checkout -b new-feature-branch\n\n# (Now you can edit files, commit changes, and push this branch, then open a new pull request)\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcode-tool%2Fargocd-helmfile-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcode-tool%2Fargocd-helmfile-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcode-tool%2Fargocd-helmfile-plugin/lists"}