{"id":19672315,"url":"https://github.com/wcm-io-devops/pippo","last_synced_at":"2025-04-29T01:30:42.264Z","repository":{"id":253784216,"uuid":"844458699","full_name":"wcm-io-devops/pippo","owner":"wcm-io-devops","description":"wcm.io DevOps Cloud Manager API Client","archived":false,"fork":false,"pushed_at":"2025-04-15T07:47:41.000Z","size":783,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-04-15T08:26:46.531Z","etag":null,"topics":["adobeio","aem","aem-tools","cloudmanager","devops","wcm-io"],"latest_commit_sha":null,"homepage":"","language":"Rust","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/wcm-io-devops.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-08-19T09:54:44.000Z","updated_at":"2025-04-15T07:47:38.000Z","dependencies_parsed_at":"2025-03-12T17:23:05.513Z","dependency_job_id":"b53e396c-8d5e-4117-81e6-8dc11fe88f0a","html_url":"https://github.com/wcm-io-devops/pippo","commit_stats":null,"previous_names":["wcm-io-devops/pippo"],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wcm-io-devops%2Fpippo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wcm-io-devops%2Fpippo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wcm-io-devops%2Fpippo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wcm-io-devops%2Fpippo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wcm-io-devops","download_url":"https://codeload.github.com/wcm-io-devops/pippo/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251415595,"owners_count":21585860,"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":["adobeio","aem","aem-tools","cloudmanager","devops","wcm-io"],"created_at":"2024-11-11T17:11:44.559Z","updated_at":"2025-04-29T01:30:41.718Z","avatar_url":"https://github.com/wcm-io-devops.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pippo\n\npippo is a fast CLI tool written in Rust for interacting with Adobe Cloud Manager's REST API.\n\nIt enables you to\n\n * manage pipeline variables\n * manage environment variables\n * start pipelines\n * list pipeline executions\n * invalidate pipeline cache\n * download and tail logs\n * create Domains\n * get an access token which can be reused e.g. by `curl` commands in CI/CD pipelines\n\n## Installation\n\nEither download the version you want from the [releases page](https://github.com/wcm-io-devops/pippo/releases), or install pippo from source:\n\n```bash\ncargo install --locked --path .\n```\n\n## Configuration\n\n\u003e 💡 You can always run `pippo [subcommand] --help`!\n\nTo authenticate with the Adobe Cloud Manager API, pippo expects a JSON config file to retrieve its data from. The\nstructure of this file must be like\n```json\n{\n  \"client_id\": \"XXX\",\n  \"client_secret\": \"XXX\",\n  \"organization_id\": \"XXX@AdobeOrg\",\n  \"private_key\": \"-----BEGIN PRIVATE KEY-----XXX-----END PRIVATE KEY-----\",\n  \"technical_account_id\": \"XXX@techacct.adobe.com\",\n  \"scope\": \"ent_cloudmgr_sdk\",\n  \"auth_strategy\": \"oauth2\"\n}\n```\n\npippo by default looks for a file called `pippo.json` in the directory where it's run from. You can specify the path\nto another file by using `pippo -c yourconfig.json`.\n\n### auth_strategy\n\nAuthentification Strategy is optional and defaults to `oauth`, because `jwt` is deprecated by Adobe to Jan 1, 2025. \n\nThe following options are supported:\n\n* oauth2\n* jwt\n\nThe strategy is used for authentication. To use oauth2, you must configure OAuth server-to-server authentication within the cloudmanager admin console.\n\n### scope\n\nScope is optional and defaults to `ent_cloudmgr_sdk`.\nThe following scopes are supported at the moment:\n\n* ent_cloudmgr_sdk\n* ent_aem_cloud_api\n\nThe scope can be used together with `access-token print` in order to generate an access token for interaction with AEM cloud instances (e.g. package manager)\n\n### Environment variables\n\n| Variable         | Description                                                                                                    |\n|------------------|----------------------------------------------------------------------------------------------------------------|\n| `PIPPO_CRYPTKEY` | A secret string used to encrypt and decrypt variables.\u003cbr\u003e If not provided, pippo uses the `./.cryptkey` file. |\n| `PIPPO_CONFIG`   | Path to the pippo config. If not provided, pippo uses config parameter or the default `pippo.json`.            |\n\n\n## Running pippo on non unix environments\n\n### Mac Security Issues\nPrior first start of the pippo arm64 binary on a mac, \nyou must grant an exception to the privacy settings of your OS,\nbecause the developer of pippo is not verified by apple.\n\n![Error on first launch](doc/pippo-forbidden.jpg)\n\nLeft click the downloaded app once while holding CONTROL and select Open from contextmenu:\n\n![Control left click on app](doc/pipo-controlopen.jpg)\n\nNow you get a new warning: \n\n![Error on first launch](doc/pipo-grant.jpg)\n\nClick Open and allow sudo (Admin by Request) privileges to add an exception to \nthe system settings. After that, pippo works as usual.\n\n### Running the x86 unix app on a mac with arm64\n\nIf you are unable to run the unix binary for some reason, (like you are on ARM64 Mac OS) and you are getting a similar error like this:\n\n`zsh: exec format error: ./pippo`\n\nThen you can try to run it via docker.\n- Create a folder with extracted pippo file.\n- Create Dockerfile with the following instructions:\n\n```\nFROM rust:1.67\n\nCOPY pippo ./pippo\nRUN chmod +x pippo\nCMD [\"sh\", \"-c\", \"./pippo encrypt $SECRET_KEY\"]\n```\nCreate a docker image:\n\n`docker build -t pippo .`\n\nRun the docker image:\n\n`docker run -it -e PIPPO_CRYPTKEY=\"PLACE_PIPPO_SECRET_HERE\" -e SECRET_KEY=\"hello world\" -t pippo`\n\n## Currently implemented\n\n### ACCESS_TOKEN \n\n* Print the retrieved access token (`access-token print`) in order to reuse it for other stuff, like executing `curl` commands.\n\nℹ️ check out the `scope` setting in the [configuration](#configuration) section for scope options.\n\n#### Example usage\n\n```bash\npippo -c \u003cpippo.json\u003e access-token print\n```\n\n### Programs\n\n* List all programs (**GET** /api/programs)\n\n#### Example usage\n\n```bash\npippo -c \u003cpippo.json\u003e program list [program-id]\n```\n\n### Environments\n\n* List all environments of the specified program (**GET** /api/program/{program_id}/environments)\n* List environment variables of the specified environment (**GET** /api/program/{program_id}/environment/{env_id}/variables)\n* Set environment variables via YAML input (**PATCH** /api/program/{program_id}/environment/{env_id}/variables)\n\nℹ️ It is possible to pass the program ID by setting the environment variable `PIPPO_PROGRAM_ID`.\nℹ️ It is possible to pass the environment ID by setting the environment variable `PIPPO_ENVIRONMENT_ID`.\n\n#### Example usage\n\n```bash\npippo -c \u003cpippo.json\u003e -p \u003cprogram-id\u003e env list\npippo -c \u003cpippo.json\u003e -p \u003cprogram-id\u003e -e \u003cenvironment-id\u003e env vars list\npippo -c \u003cpippo.json\u003e env vars set \u003cFILE\u003e\n```\n\nTo set environment variables given a YAML file with the format below, run\n```bash\npippo -c \u003cpippo.json\u003e env vars set \u003cenvironment-variables.yml\u003e\n```\n\nℹ️ In CI environments it is recommended to run `env vars set` in CI mode e.g. `env vars set --ci`. See also [CI Mode](#ci-mode).\n\n```yaml\n---\nprograms:\n  - id: 12345\n    environments:\n      - id: 67890\n        variables:\n          - name: foo\n            value: bar\n            type: string\n          - name: foobar\n            value: 123\n            type: secretString\n            service: author\n```\n\n##### Encrypting secretString variables\n\npippo can encrypt variables for you if you provide an encryption key either via `PIPPO_CRYPTKEY` or the `./.cryptkey` file.\nIt uses the [`magic_crypt`](https://docs.rs/magic-crypt/latest/magic_crypt/) crate for that.\n\n:bulb: You only have to setup the `PIPPO_CRYPTKEY`, no `pippo.json` required for encrypting / decrypting credentials!\n\n```bash\n$ PIPPO_CRYPTKEY='foo!$bar' pippo encrypt \"hello world\"\n8cLHS/BXGOG60nOQnYOpow==\n$ PIPPO_CRYPTKEY='foo!$bar' pippo decrypt 8cLHS/BXGOG60nOQnYOpow==\nhello world\n```\n\nYou can then use the following format to use an encrypted variable in your YAML config:\n```yaml\nprograms:\n  - id: 12345\n    environments:\n      - id: 67890\n        variables:\n          - name: secret\n            value: $enc 8cLHS/BXGOG60nOQnYOpow==\n            type: secretString\n```\n\nPrefixing the value with `$enc` tells pippo that this value is encrypted. It will decrypt it on runtime and push the\ndecrypted value to Cloud Manager.\n\u003e ⚠ You can only use `$enc` with variables of type `secretString`. Using `string` variables will always render the value\n\u003e in plain text.\n\n### Pipelines\n\n* List all pipelines of the specified program (**GET** /api/program/{program_id}/pipelines)\n* List pipeline variables of the specified pipeline (**GET** /api/program/{program_id}/pipeline/{pipeline_id}/variables)\n* Invalidate pipeline cache of a specified pipeline (**DELETE** /api/program/{program_id}/pipeline/{pipeline_id}/cache)\n* Set pipeline variables via YAML input (**PATCH** /api/program/{program_id}/pipeline/{pipeline_id}/variables)\n* Execute a pipeline of a specified program (**PUT** /api/program/{program_id}/pipeline/{pipeline_id}/execution)\n* List last 20 executions of a pipeline of a specified program (**GET** /api/program/{program_id}/pipeline/{pipeline_id}/executions)\n\n\nℹ️ It is possible to pass the program ID by setting the environment variable `PIPPO_PROGRAM_ID`.\nℹ️ It is possible to pass the pipeline ID by setting the environment variable `PIPPO_PIPELINE_ID`.\n\n#### Example usage\n\n```bash\npippo -c \u003cpippo.json\u003e -p \u003cprogram-id\u003e pipeline list\npippo -c \u003cpippo.json\u003e -p \u003cprogram-id\u003e -i \u003cpipeline-id\u003e pipeline vars list\npippo -c \u003cpippo.json\u003e pipeline vars set \u003cFILE\u003e\npippo -c \u003cpippo.json\u003e -p \u003cprogram-id\u003e  -i \u003cpipeline-id\u003e pipeline run\npippo -c \u003cpippo.json\u003e -p \u003cprogram-id\u003e  -i \u003cpipeline-id\u003e pipeline list-executions\npippo -c \u003cpippo.json\u003e -p \u003cprogram-id\u003e  -i \u003cpipeline-id\u003e pipeline invalidate-cache\n```\n\nTo set pipeline variables given a YAML file with the format below, run\n```bash\npippo -c \u003cpippo.json\u003e pipeline vars set \u003cpipeline-variables.yml\u003e\n```\n\nℹ️ In CI environments it is recommended to run `pipeline vars set` in CI mode e.g. `pipeline vars set --ci`. See also [CI Mode](#ci-mode).\n\n```yaml\n---\nprograms:\n  - id: 56712\n    pipelines:\n      - id: 7654321\n        variables:\n          - name: FOO\n            value: bar\n            type: string\n          - name: SECRET_FOO\n            value: $enc muchEncryptedString\n            type: secretString\n```\n\n### Logs\n\n* Download a specific logfile (**GET** /api/program/{program_id}/environment/{env_id}/logs/download)\n* Tail a specific logfile (**GET** /api/program/{program_id}/environment/{env_id}/logs/download)\n\n#### Example usage\n\n```bash\npippo -c \u003cpippo.json\u003e -p \u003cprogram-id\u003e -e \u003cenvironment-id\u003e log save --service \u003csvc\u003e --log \u003clog\u003e --date \u003cYYYY-MM-DD\u003e\npippo -c \u003cpippo.json\u003e -p \u003cprogram-id\u003e -e \u003cenvironment-id\u003e log tail --service \u003csvc\u003e --log \u003clog\u003e\n```\n\n### dry-run mode\n\nYou can pass the flag `--dry-run` on the command line to preview the changes for\n* environment variables\n* pipeline variables\n\n### CI mode\n\nSince updating running pipelines or environments that are currently updating is not possible pippo will normally wait until it is possible.\n\nTo avoid long running jobs in the CI which is waiting for minutes or even hours for a pipeline there is a \"ci mode\" which skips the update of not updatable resources.\n\nThis mode is currently implementes for:\n* pipeline variables\n* environment variables\n\n#### Example usage\n\n```bash\npippo -c \u003cpippo.json\u003e pipeline vars set --ci \u003cFILE\u003e\npippo -c \u003cpippo.json\u003e env vars set --ci \u003cenvironment-variables.yml\u003e\n```\n\n### Domains\n\n* List all Domains (**GET** /api/program/{programId}/domainNames)\n* Create Domains from environment.yml (**POST** /api/program/{programId}/domainNames)\n\nThe current state of implementation is only creating new domains. It will not update nor delete other domains.\nIn case a domain is already there, error ALREADY_IN_USE is shown.\n\n#### List arguments\n\nYou can provide `--start` and limit `--limit` to `domain list` in order to limit / page the results.\n\n#### Example Data\n\n```yaml\n---\nprograms:\n  - id: 56712\n    environments:\n      - id: 7654321\n        domains: \n          - domainname: some.domain.de\n            certificateId: 2345\n```\n\n #### Example usage\n\n```bash\npippo -c \u003cpippo.json\u003e -p \u003cprogram-id\u003e domain list\npippo -c \u003cpippo.json\u003e -p \u003cprogram-id\u003e domain list --start 0 --limit 20 \npippo -c \u003cpippo.json\u003e -p \u003cprogram-id\u003e domain list --start 20 --limit 20\npippo -c \u003cpippo.json\u003e domain create \u003cenvironment-domains.yml\u003e\n```\n\n## Development\n\n## Install Rust and Cargo\n\nOn Linux and macOS systems, this is done as follows:\n\n```bash\ncurl https://sh.rustup.rs -sSf | sh\n```\n\nFor other OS's check https://rustup.rs/\n\n\n### Run application\n\n```bash\ncargo run env vars set \u003cpath\u003e\ncargo run pipeline vars set \u003cpath\u003e\n# ...\n```\n\n### Set log level\n\nPossible values:\n\n* error\n* warn\n* info\n* debug\n* trace\n\n```bash\nexport RUST_LOG=\"debug\" # or\nRUST_LOG=\"trace\"; cargo run\n```\n\n### Apply formatting\n\n```bash\n# apply\nrustfmt --edition 2018 src/main.rs\n# check only\nrustfmt --edition 2018 --check src/main.rs\n```\n\n## Release\n\n1. Goto the releases page, create and publish a new release with a version number following [semantic versioning](https://semver.org/).\n2. Wait until the release workflow is complete, verify that [release workflow](https://github.com/wcm-io-devops/pippo/actions/workflows/release.yml) finished successfully.\n3. Validate that binaries were correctly attached to the new release\n4. Ensure that changelist is correct.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwcm-io-devops%2Fpippo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwcm-io-devops%2Fpippo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwcm-io-devops%2Fpippo/lists"}