326 lines
11 KiB
Markdown
326 lines
11 KiB
Markdown
# Updatecli Deploy Action
|
|
|
|
A Forgejo Action that uses [Updatecli](https://updatecli.io/) to automatically update Helm chart versions and create pull requests for ArgoCD deployments.
|
|
|
|
## Overview
|
|
|
|
This action automates the process of:
|
|
|
|
- Updating the `appVersion` in a Helm chart's `Chart.yaml` with a new application version
|
|
- Incrementing the chart's `version` (minor version bump)
|
|
- Creating a pull request in a Forgejo repository with the changes
|
|
|
|
## Features
|
|
|
|
- 🔄 Automatic Helm chart version management
|
|
- 📈 Semantic versioning with minor version increments
|
|
- 🔀 Automated pull request creation
|
|
- 🎯 Support for different target branches (`main`, `master`, `develop`)
|
|
- 🏷️ Configurable Docker image tag integration
|
|
- 📝 Conventional commit-style PR titles and descriptions
|
|
- ⚙️ Custom Updatecli configuration support
|
|
|
|
## Usage
|
|
|
|
```yaml
|
|
name: Update Helm Chart
|
|
on:
|
|
push:
|
|
branches: [main, develop]
|
|
|
|
jobs:
|
|
update-chart:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Update Helm Chart
|
|
uses: your-org/updatecli-deploy@v1
|
|
with:
|
|
registry-user: ${{ vars.REGISTRY_USER }}
|
|
registry-password: ${{ secrets.REGISTRY_PASSWORD }}
|
|
name: my-application
|
|
ref-name: ${{ forge.ref_name }}
|
|
docker-tag: ${{ forge.sha }}
|
|
```
|
|
|
|
## Inputs
|
|
|
|
| Input | Description | Required | Default |
|
|
| ------------------- | ----------------------------------------------------- | -------- | ----------------------------------------- |
|
|
| `updatecli-config` | Path to custom Updatecli configuration file | No | `${{ forge.action_path }}/updatecli.yaml` |
|
|
| `registry-url` | Registry URL for the Forgejo instance | No | `git.cleverthis.com` |
|
|
| `registry-user` | Username for Forgejo authentication | **Yes** | - |
|
|
| `registry-password` | Password/token for Forgejo authentication | **Yes** | - |
|
|
| `charts-repo-org` | Organization/owner of the charts repository | No | `infra` |
|
|
| `charts-repo-name` | Name of the charts repository | No | `charts` |
|
|
| `name` | Name of the Helm chart/application to update | **Yes** | - |
|
|
| `ref-name` | Git reference name (branch) that triggered the action | **Yes** | - |
|
|
| `docker-tag` | Docker image tag to set as the new app version | **Yes** | - |
|
|
|
|
## Environment Variables
|
|
|
|
The action uses the following environment variables internally:
|
|
|
|
- `REGISTRY_URL`: Constructed from `registry-url` input
|
|
- `REGISTRY_USER`: From `registry-user` input
|
|
- `REGISTRY_PASSWORD`: From `registry-password` input
|
|
- `CHARTS_REPO_ORG`: From `charts-repo-org` input
|
|
- `CHARTS_REPO_NAME`: From `charts-repo-name` input
|
|
- `TARGET_NAME`: From `name` input
|
|
- `NEW_APP_VERSION`: From `docker-tag` input
|
|
- `TARGET_BRANCH`: Determined from `ref-name` input
|
|
|
|
## Branch Mapping
|
|
|
|
The action maps source branches to target branches as follows:
|
|
|
|
- `main` or `master` → `master`
|
|
- `develop` → `develop`
|
|
- Other branches → Action will fail with an error
|
|
|
|
## How It Works
|
|
|
|
### 1. Version Detection
|
|
|
|
- Retrieves the new application version from the `docker-tag` input
|
|
- Reads the current chart version from `Chart.yaml`
|
|
|
|
### 2. Version Updates
|
|
|
|
- Updates the `appVersion` field in `Chart.yaml` with the new application version
|
|
- Increments the chart `version` using semantic versioning (minor bump)
|
|
|
|
### 3. Pull Request Creation
|
|
|
|
- Creates a pull request in the specified Forgejo repository
|
|
- Uses conventional commit-style titles: `chore(app-name): bump chart version and set app version to X.X.X`
|
|
- Includes a detailed description with change summary
|
|
|
|
## Example Scenarios
|
|
|
|
### Scenario 1: Main Branch Deployment
|
|
|
|
```yaml
|
|
- name: Update Production Chart
|
|
uses: your-org/updatecli-deploy@v1
|
|
with:
|
|
registry-user: ${{ vars.REGISTRY_USER }}
|
|
registry-password: ${{ secrets.REGISTRY_PASSWORD }}
|
|
name: web-app
|
|
ref-name: main
|
|
docker-tag: v2.1.0
|
|
```
|
|
|
|
This will:
|
|
|
|
- Update `web-app/Chart.yaml` in the `master` branch
|
|
- Set `appVersion` to `v2.1.0`
|
|
- Increment the chart version (e.g., `1.2.3` → `1.3.0`)
|
|
|
|
### Scenario 2: Development Branch
|
|
|
|
```yaml
|
|
- name: Update Development Chart
|
|
uses: your-org/updatecli-deploy@v1
|
|
with:
|
|
registry-user: ${{ vars.REGISTRY_USER }}
|
|
registry-password: ${{ secrets.REGISTRY_PASSWORD }}
|
|
name: api-service
|
|
ref-name: develop
|
|
docker-tag: ${{ forge.sha }}
|
|
```
|
|
|
|
This will target the `develop` branch and use the commit SHA as the app version.
|
|
|
|
### Scenario 3: Custom Configuration
|
|
|
|
```yaml
|
|
- name: Update Chart with Custom Config
|
|
uses: your-org/updatecli-deploy@v1
|
|
with:
|
|
updatecli-config: .forgejo/workflows/custom-updatecli.yaml
|
|
registry-user: ${{ vars.REGISTRY_USER }}
|
|
registry-password: ${{ secrets.REGISTRY_PASSWORD }}
|
|
name: microservice
|
|
ref-name: main
|
|
docker-tag: v1.2.3
|
|
```
|
|
|
|
This allows you to use a custom Updatecli configuration file instead of the default one, enabling:
|
|
|
|
- Custom version increment strategies (patch, minor, major)
|
|
- Different target files or repositories
|
|
- Custom pull request templates
|
|
- Additional sources and transformations
|
|
|
|
## Configuration Files
|
|
|
|
### Default updatecli.yaml
|
|
|
|
By default, the action uses the built-in `updatecli.yaml` configuration file that defines:
|
|
|
|
- **Sources**: Where to get version information
|
|
- **Targets**: What files to update and how
|
|
- **Actions**: How to create pull requests
|
|
- **Transformers**: How to modify versions (semantic version increment)
|
|
|
|
### Custom Configuration with `updatecli-config`
|
|
|
|
The `updatecli-config` input allows you to override the default configuration with your own custom Updatecli configuration file. This enables advanced customization scenarios:
|
|
|
|
#### When to Use Custom Configuration
|
|
|
|
- **Different version increment strategies**: Use patch, major, or custom increment logic instead of minor
|
|
- **Multiple chart updates**: Update multiple charts or files in a single run
|
|
- **Custom PR templates**: Use different pull request titles, descriptions, or labels
|
|
- **Additional transformations**: Apply custom version transformations or filters
|
|
- **Different target repositories**: Update charts in different repositories
|
|
- **Complex workflows**: Implement multi-step update processes
|
|
|
|
#### Example Custom Configuration
|
|
|
|
Create a custom configuration file (e.g., `.forgejo/workflows/custom-updatecli.yaml`):
|
|
|
|
```yaml
|
|
name: Custom Helm Chart Updates
|
|
|
|
scms:
|
|
helm-chart:
|
|
kind: gitea
|
|
spec:
|
|
url: '{{ requiredEnv "REGISTRY_URL" }}'
|
|
username: '{{ requiredEnv "REGISTRY_USER" }}'
|
|
token: '{{ requiredEnv "REGISTRY_PASSWORD" }}'
|
|
owner: '{{ requiredEnv "CHARTS_REPO_ORG" }}'
|
|
repository: '{{ requiredEnv "CHARTS_REPO_NAME" }}'
|
|
branch: '{{ requiredEnv "TARGET_BRANCH" }}'
|
|
|
|
sources:
|
|
appVersion:
|
|
name: Get new app version from environment
|
|
kind: shell
|
|
spec:
|
|
command: echo "$NEW_APP_VERSION"
|
|
environments:
|
|
- name: NEW_APP_VERSION
|
|
|
|
currentChartVersion:
|
|
scmid: helm-chart
|
|
name: Get current chart version
|
|
kind: yaml
|
|
spec:
|
|
file: '{{ requiredEnv "TARGET_NAME" }}/Chart.yaml'
|
|
key: $.version
|
|
|
|
targets:
|
|
updateAppVersion:
|
|
scmid: helm-chart
|
|
name: Update appVersion in Chart.yaml
|
|
kind: yaml
|
|
sourceid: appVersion
|
|
spec:
|
|
file: '{{ requiredEnv "TARGET_NAME" }}/Chart.yaml'
|
|
key: $.appVersion
|
|
|
|
updateChartVersion:
|
|
scmid: helm-chart
|
|
name: Increment chart version
|
|
kind: yaml
|
|
sourceid: currentChartVersion
|
|
spec:
|
|
file: '{{ requiredEnv "TARGET_NAME" }}/Chart.yaml'
|
|
key: $.version
|
|
transformers:
|
|
# Custom: Use patch increment instead of minor
|
|
- semverinc: "patch"
|
|
|
|
actions:
|
|
pullrequest:
|
|
kind: gitea/pullrequest
|
|
scmid: helm-chart
|
|
spec:
|
|
url: '{{ requiredEnv "SERVER_URL" }}'
|
|
owner: '{{ requiredEnv "REPO_OWNER" }}'
|
|
repository: '{{ requiredEnv "REPO_NAME" }}'
|
|
username: '{{ requiredEnv "REGISTRY_USER" }}'
|
|
token: '{{ requiredEnv "REGISTRY_PASSWORD" }}'
|
|
# Custom PR title
|
|
title: 'feat({{ requiredEnv "TARGET_NAME" }}): update to {{ source "appVersion" }}'
|
|
# Custom PR body
|
|
body: |
|
|
## 🚀 Automated Update
|
|
|
|
This PR updates the **{{ requiredEnv "TARGET_NAME" }}** chart with the latest version.
|
|
|
|
### Changes
|
|
- App version: `{{ source "appVersion" }}`
|
|
- Chart version: patch increment
|
|
|
|
### Checklist
|
|
- [x] Version updated automatically
|
|
- [ ] Manual review required
|
|
- [ ] Deploy to staging first
|
|
|
|
---
|
|
*Generated by Updatecli with custom configuration*
|
|
```
|
|
|
|
#### Environment Variables Available
|
|
|
|
When using custom configurations, all the same environment variables are available:
|
|
|
|
- `REGISTRY_URL`: Forgejo registry URL
|
|
- `REGISTRY_USER`: Authentication username
|
|
- `REGISTRY_PASSWORD`: Authentication token
|
|
- `CHARTS_REPO_ORG`: Charts repository organization
|
|
- `CHARTS_REPO_NAME`: Charts repository name
|
|
- `TARGET_NAME`: Chart/application name
|
|
- `NEW_APP_VERSION`: New application version
|
|
- `TARGET_BRANCH`: Target branch (master/develop)
|
|
- `SERVER_URL`: Forgejo server URL (derived from REGISTRY_URL)
|
|
- `REPO_OWNER`: Repository owner (same as CHARTS_REPO_ORG)
|
|
- `REPO_NAME`: Repository name (same as CHARTS_REPO_NAME)
|
|
|
|
### Chart.yaml Structure
|
|
|
|
Expected Helm chart structure:
|
|
|
|
```yaml
|
|
apiVersion: v2
|
|
name: my-app
|
|
version: 1.2.3 # Will be incremented
|
|
appVersion: v1.0.0 # Will be updated with new version
|
|
description: My application Helm chart
|
|
```
|
|
|
|
## Security Considerations
|
|
|
|
- Store Forgejo credentials in Forgejo Secrets
|
|
- Use tokens with minimal required permissions
|
|
- Ensure the `registry-password` has access to:
|
|
- Read the charts repository
|
|
- Create pull requests
|
|
- Push to branches
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
1. **Authentication Failed**
|
|
- Verify `registry-user` and `registry-password` are correct
|
|
- Ensure the token has sufficient permissions
|
|
|
|
2. **Chart Not Found**
|
|
- Check that `name` matches the directory name in the charts repository
|
|
- Verify `charts-repo-org` and `charts-repo-name` are correct
|
|
|
|
3. **Branch Mapping Error**
|
|
- Ensure `ref-name` is one of: `main`, `master`, or `develop`
|
|
- Check that the target branch exists in the repository
|
|
|
|
4. **Version Format Issues**
|
|
- Ensure the current chart version follows semantic versioning
|
|
- Verify `Chart.yaml` has valid YAML syntax
|