Skip to content

Repository files navigation

Helm Action

Deploys a helm chart using GitHub actions. Supports canary deployments and provides a built in helm chart for apps that listen over http to get your ramped up quickly.

View an example repository using this action at github.com/deliverybot/example-helm.

Parameters

Inputs

Inputs below are additionally loaded from the payload of the deployment event payload if the action was triggered by a deployment.

  • release: Helm release name. Will be combined with track if set. (required)
  • namespace: Kubernetes namespace name. (required)
  • chart: Helm chart path. If set to "app" this will use the built in helm chart found in this repository. (required)
  • values: Helm chart values, expected to be a YAML or JSON string.
  • track: Track for the deployment. If the track is not "stable" it activates the canary workflow described below.
  • task: Task name. If the task is "remove" it will remove the configured helm release.
  • dry-run: Helm dry-run option.
  • token: Github repository token. If included and the event is a deployment then the deployment_status event will be fired.
  • value-files: Additional value files to apply to the helm chart. Expects a JSON encoded array or a string.
  • secrets: Secret variables to include in value file interpolation. Expects a JSON encoded map.
  • helm: Helm binary to execute, one of: [helm, helm3].
  • version: Version of the app, usually commit sha works here.
  • timeout: specify a timeout for helm deployment
  • repo: Helm chart repository to be added.
  • repo-alias: Helm repository alias that will be used.
  • repo-username: Helm repository username if authentication is needed.
  • repo-password: Helm repository password if authentication is needed.

Additional parameters: If the action is being triggered by a deployment event and the task parameter in the deployment event is set to "remove" then this action will execute a helm delete $service

Versions

  • helm: v2.16.1
  • helm3: v3.0.0

Environment

  • KUBECONFIG_FILE: Kubeconfig file for Kubernetes cluster access.

Value file interpolation

The following syntax allows variables to be used in value files:

  • ${{ secrets.KEY }}: References secret variables passed in the secrets input.
  • ${{ deployment }}: References the deployment event that triggered this action.

Example

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example canary

If a track is chosen that is equal to canary, this updates the helm chart in a few ways:

  1. Release name is changed to {release}-{track} (eg. myapp-canary).
  2. The service is disabled on the helm chart service.enabled=false
  3. The ingress is disabled on the helm chart ingress.enabled=false

Not enabling the service or ingress allows the stable ingress and service resources to pick up the canary pods and route traffic to them.

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'track: canarynamespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example pr cleanup

If you are creating an environment per pull request with Helm you may have the issue where pull request environments like pr123 sit around in your cluster. By using GitHub actions we can clean those up by listening for pull request close events.

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
# Task remove means to remove the helm release.task: 'remove'release: 'review-myapp-${{ github.event.pull_request.number }}'version: '${{ github.sha }}'track: 'stable'chart: 'app'namespace: 'example-helm'token: '${{ github.token }}'env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example add custom repository

Sometime you may want to add a custom repository, like chartmuseum. For th

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'chartmuseum/app'token: '${{ github.token }}'repo: 'http://chartmuseum.example.com'repo-alias: chartmuseumrepo-username: ${{ secrets.CHARTMUSEUM_USERNAME }}repo-password: ${{ secrets.CHARTMUSEUM_PASSWORD }}env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

About

GitHub action for deploying Helm charts.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - RedRiverSoftware/helm: GitHub action for deploying Helm charts. · GitHub
Skip to content

Repository files navigation

Helm Action

Deploys a helm chart using GitHub actions. Supports canary deployments and provides a built in helm chart for apps that listen over http to get your ramped up quickly.

View an example repository using this action at github.com/deliverybot/example-helm.

Parameters

Inputs

Inputs below are additionally loaded from the payload of the deployment event payload if the action was triggered by a deployment.

  • release: Helm release name. Will be combined with track if set. (required)
  • namespace: Kubernetes namespace name. (required)
  • chart: Helm chart path. If set to "app" this will use the built in helm chart found in this repository. (required)
  • values: Helm chart values, expected to be a YAML or JSON string.
  • track: Track for the deployment. If the track is not "stable" it activates the canary workflow described below.
  • task: Task name. If the task is "remove" it will remove the configured helm release.
  • dry-run: Helm dry-run option.
  • token: Github repository token. If included and the event is a deployment then the deployment_status event will be fired.
  • value-files: Additional value files to apply to the helm chart. Expects a JSON encoded array or a string.
  • secrets: Secret variables to include in value file interpolation. Expects a JSON encoded map.
  • helm: Helm binary to execute, one of: [helm, helm3].
  • version: Version of the app, usually commit sha works here.
  • timeout: specify a timeout for helm deployment
  • repo: Helm chart repository to be added.
  • repo-alias: Helm repository alias that will be used.
  • repo-username: Helm repository username if authentication is needed.
  • repo-password: Helm repository password if authentication is needed.

Additional parameters: If the action is being triggered by a deployment event and the task parameter in the deployment event is set to "remove" then this action will execute a helm delete $service

Versions

  • helm: v2.16.1
  • helm3: v3.0.0

Environment

  • KUBECONFIG_FILE: Kubeconfig file for Kubernetes cluster access.

Value file interpolation

The following syntax allows variables to be used in value files:

  • ${{ secrets.KEY }}: References secret variables passed in the secrets input.
  • ${{ deployment }}: References the deployment event that triggered this action.

Example

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example canary

If a track is chosen that is equal to canary, this updates the helm chart in a few ways:

  1. Release name is changed to {release}-{track} (eg. myapp-canary).
  2. The service is disabled on the helm chart service.enabled=false
  3. The ingress is disabled on the helm chart ingress.enabled=false

Not enabling the service or ingress allows the stable ingress and service resources to pick up the canary pods and route traffic to them.

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'track: canarynamespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example pr cleanup

If you are creating an environment per pull request with Helm you may have the issue where pull request environments like pr123 sit around in your cluster. By using GitHub actions we can clean those up by listening for pull request close events.

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
# Task remove means to remove the helm release.task: 'remove'release: 'review-myapp-${{ github.event.pull_request.number }}'version: '${{ github.sha }}'track: 'stable'chart: 'app'namespace: 'example-helm'token: '${{ github.token }}'env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example add custom repository

Sometime you may want to add a custom repository, like chartmuseum. For th

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'chartmuseum/app'token: '${{ github.token }}'repo: 'http://chartmuseum.example.com'repo-alias: chartmuseumrepo-username: ${{ secrets.CHARTMUSEUM_USERNAME }}repo-password: ${{ secrets.CHARTMUSEUM_PASSWORD }}env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

About

GitHub action for deploying Helm charts.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - RedRiverSoftware/helm: GitHub action for deploying Helm charts. · GitHub
Skip to content

Repository files navigation

Helm Action

Deploys a helm chart using GitHub actions. Supports canary deployments and provides a built in helm chart for apps that listen over http to get your ramped up quickly.

View an example repository using this action at github.com/deliverybot/example-helm.

Parameters

Inputs

Inputs below are additionally loaded from the payload of the deployment event payload if the action was triggered by a deployment.

  • release: Helm release name. Will be combined with track if set. (required)
  • namespace: Kubernetes namespace name. (required)
  • chart: Helm chart path. If set to "app" this will use the built in helm chart found in this repository. (required)
  • values: Helm chart values, expected to be a YAML or JSON string.
  • track: Track for the deployment. If the track is not "stable" it activates the canary workflow described below.
  • task: Task name. If the task is "remove" it will remove the configured helm release.
  • dry-run: Helm dry-run option.
  • token: Github repository token. If included and the event is a deployment then the deployment_status event will be fired.
  • value-files: Additional value files to apply to the helm chart. Expects a JSON encoded array or a string.
  • secrets: Secret variables to include in value file interpolation. Expects a JSON encoded map.
  • helm: Helm binary to execute, one of: [helm, helm3].
  • version: Version of the app, usually commit sha works here.
  • timeout: specify a timeout for helm deployment
  • repo: Helm chart repository to be added.
  • repo-alias: Helm repository alias that will be used.
  • repo-username: Helm repository username if authentication is needed.
  • repo-password: Helm repository password if authentication is needed.

Additional parameters: If the action is being triggered by a deployment event and the task parameter in the deployment event is set to "remove" then this action will execute a helm delete $service

Versions

  • helm: v2.16.1
  • helm3: v3.0.0

Environment

  • KUBECONFIG_FILE: Kubeconfig file for Kubernetes cluster access.

Value file interpolation

The following syntax allows variables to be used in value files:

  • ${{ secrets.KEY }}: References secret variables passed in the secrets input.
  • ${{ deployment }}: References the deployment event that triggered this action.

Example

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example canary

If a track is chosen that is equal to canary, this updates the helm chart in a few ways:

  1. Release name is changed to {release}-{track} (eg. myapp-canary).
  2. The service is disabled on the helm chart service.enabled=false
  3. The ingress is disabled on the helm chart ingress.enabled=false

Not enabling the service or ingress allows the stable ingress and service resources to pick up the canary pods and route traffic to them.

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'track: canarynamespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example pr cleanup

If you are creating an environment per pull request with Helm you may have the issue where pull request environments like pr123 sit around in your cluster. By using GitHub actions we can clean those up by listening for pull request close events.

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
# Task remove means to remove the helm release.task: 'remove'release: 'review-myapp-${{ github.event.pull_request.number }}'version: '${{ github.sha }}'track: 'stable'chart: 'app'namespace: 'example-helm'token: '${{ github.token }}'env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example add custom repository

Sometime you may want to add a custom repository, like chartmuseum. For th

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'chartmuseum/app'token: '${{ github.token }}'repo: 'http://chartmuseum.example.com'repo-alias: chartmuseumrepo-username: ${{ secrets.CHARTMUSEUM_USERNAME }}repo-password: ${{ secrets.CHARTMUSEUM_PASSWORD }}env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

About

GitHub action for deploying Helm charts.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - RedRiverSoftware/helm: GitHub action for deploying Helm charts. · GitHub
Skip to content

Repository files navigation

Helm Action

Deploys a helm chart using GitHub actions. Supports canary deployments and provides a built in helm chart for apps that listen over http to get your ramped up quickly.

View an example repository using this action at github.com/deliverybot/example-helm.

Parameters

Inputs

Inputs below are additionally loaded from the payload of the deployment event payload if the action was triggered by a deployment.

  • release: Helm release name. Will be combined with track if set. (required)
  • namespace: Kubernetes namespace name. (required)
  • chart: Helm chart path. If set to "app" this will use the built in helm chart found in this repository. (required)
  • values: Helm chart values, expected to be a YAML or JSON string.
  • track: Track for the deployment. If the track is not "stable" it activates the canary workflow described below.
  • task: Task name. If the task is "remove" it will remove the configured helm release.
  • dry-run: Helm dry-run option.
  • token: Github repository token. If included and the event is a deployment then the deployment_status event will be fired.
  • value-files: Additional value files to apply to the helm chart. Expects a JSON encoded array or a string.
  • secrets: Secret variables to include in value file interpolation. Expects a JSON encoded map.
  • helm: Helm binary to execute, one of: [helm, helm3].
  • version: Version of the app, usually commit sha works here.
  • timeout: specify a timeout for helm deployment
  • repo: Helm chart repository to be added.
  • repo-alias: Helm repository alias that will be used.
  • repo-username: Helm repository username if authentication is needed.
  • repo-password: Helm repository password if authentication is needed.

Additional parameters: If the action is being triggered by a deployment event and the task parameter in the deployment event is set to "remove" then this action will execute a helm delete $service

Versions

  • helm: v2.16.1
  • helm3: v3.0.0

Environment

  • KUBECONFIG_FILE: Kubeconfig file for Kubernetes cluster access.

Value file interpolation

The following syntax allows variables to be used in value files:

  • ${{ secrets.KEY }}: References secret variables passed in the secrets input.
  • ${{ deployment }}: References the deployment event that triggered this action.

Example

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example canary

If a track is chosen that is equal to canary, this updates the helm chart in a few ways:

  1. Release name is changed to {release}-{track} (eg. myapp-canary).
  2. The service is disabled on the helm chart service.enabled=false
  3. The ingress is disabled on the helm chart ingress.enabled=false

Not enabling the service or ingress allows the stable ingress and service resources to pick up the canary pods and route traffic to them.

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'track: canarynamespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example pr cleanup

If you are creating an environment per pull request with Helm you may have the issue where pull request environments like pr123 sit around in your cluster. By using GitHub actions we can clean those up by listening for pull request close events.

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
# Task remove means to remove the helm release.task: 'remove'release: 'review-myapp-${{ github.event.pull_request.number }}'version: '${{ github.sha }}'track: 'stable'chart: 'app'namespace: 'example-helm'token: '${{ github.token }}'env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example add custom repository

Sometime you may want to add a custom repository, like chartmuseum. For th

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'chartmuseum/app'token: '${{ github.token }}'repo: 'http://chartmuseum.example.com'repo-alias: chartmuseumrepo-username: ${{ secrets.CHARTMUSEUM_USERNAME }}repo-password: ${{ secrets.CHARTMUSEUM_PASSWORD }}env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

About

GitHub action for deploying Helm charts.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - RedRiverSoftware/helm: GitHub action for deploying Helm charts. · GitHub
Skip to content

Repository files navigation

Helm Action

Deploys a helm chart using GitHub actions. Supports canary deployments and provides a built in helm chart for apps that listen over http to get your ramped up quickly.

View an example repository using this action at github.com/deliverybot/example-helm.

Parameters

Inputs

Inputs below are additionally loaded from the payload of the deployment event payload if the action was triggered by a deployment.

  • release: Helm release name. Will be combined with track if set. (required)
  • namespace: Kubernetes namespace name. (required)
  • chart: Helm chart path. If set to "app" this will use the built in helm chart found in this repository. (required)
  • values: Helm chart values, expected to be a YAML or JSON string.
  • track: Track for the deployment. If the track is not "stable" it activates the canary workflow described below.
  • task: Task name. If the task is "remove" it will remove the configured helm release.
  • dry-run: Helm dry-run option.
  • token: Github repository token. If included and the event is a deployment then the deployment_status event will be fired.
  • value-files: Additional value files to apply to the helm chart. Expects a JSON encoded array or a string.
  • secrets: Secret variables to include in value file interpolation. Expects a JSON encoded map.
  • helm: Helm binary to execute, one of: [helm, helm3].
  • version: Version of the app, usually commit sha works here.
  • timeout: specify a timeout for helm deployment
  • repo: Helm chart repository to be added.
  • repo-alias: Helm repository alias that will be used.
  • repo-username: Helm repository username if authentication is needed.
  • repo-password: Helm repository password if authentication is needed.

Additional parameters: If the action is being triggered by a deployment event and the task parameter in the deployment event is set to "remove" then this action will execute a helm delete $service

Versions

  • helm: v2.16.1
  • helm3: v3.0.0

Environment

  • KUBECONFIG_FILE: Kubeconfig file for Kubernetes cluster access.

Value file interpolation

The following syntax allows variables to be used in value files:

  • ${{ secrets.KEY }}: References secret variables passed in the secrets input.
  • ${{ deployment }}: References the deployment event that triggered this action.

Example

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example canary

If a track is chosen that is equal to canary, this updates the helm chart in a few ways:

  1. Release name is changed to {release}-{track} (eg. myapp-canary).
  2. The service is disabled on the helm chart service.enabled=false
  3. The ingress is disabled on the helm chart ingress.enabled=false

Not enabling the service or ingress allows the stable ingress and service resources to pick up the canary pods and route traffic to them.

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'track: canarynamespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example pr cleanup

If you are creating an environment per pull request with Helm you may have the issue where pull request environments like pr123 sit around in your cluster. By using GitHub actions we can clean those up by listening for pull request close events.

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
# Task remove means to remove the helm release.task: 'remove'release: 'review-myapp-${{ github.event.pull_request.number }}'version: '${{ github.sha }}'track: 'stable'chart: 'app'namespace: 'example-helm'token: '${{ github.token }}'env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example add custom repository

Sometime you may want to add a custom repository, like chartmuseum. For th

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'chartmuseum/app'token: '${{ github.token }}'repo: 'http://chartmuseum.example.com'repo-alias: chartmuseumrepo-username: ${{ secrets.CHARTMUSEUM_USERNAME }}repo-password: ${{ secrets.CHARTMUSEUM_PASSWORD }}env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

About

GitHub action for deploying Helm charts.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - RedRiverSoftware/helm: GitHub action for deploying Helm charts. · GitHub
Skip to content

Repository files navigation

Helm Action

Deploys a helm chart using GitHub actions. Supports canary deployments and provides a built in helm chart for apps that listen over http to get your ramped up quickly.

View an example repository using this action at github.com/deliverybot/example-helm.

Parameters

Inputs

Inputs below are additionally loaded from the payload of the deployment event payload if the action was triggered by a deployment.

  • release: Helm release name. Will be combined with track if set. (required)
  • namespace: Kubernetes namespace name. (required)
  • chart: Helm chart path. If set to "app" this will use the built in helm chart found in this repository. (required)
  • values: Helm chart values, expected to be a YAML or JSON string.
  • track: Track for the deployment. If the track is not "stable" it activates the canary workflow described below.
  • task: Task name. If the task is "remove" it will remove the configured helm release.
  • dry-run: Helm dry-run option.
  • token: Github repository token. If included and the event is a deployment then the deployment_status event will be fired.
  • value-files: Additional value files to apply to the helm chart. Expects a JSON encoded array or a string.
  • secrets: Secret variables to include in value file interpolation. Expects a JSON encoded map.
  • helm: Helm binary to execute, one of: [helm, helm3].
  • version: Version of the app, usually commit sha works here.
  • timeout: specify a timeout for helm deployment
  • repo: Helm chart repository to be added.
  • repo-alias: Helm repository alias that will be used.
  • repo-username: Helm repository username if authentication is needed.
  • repo-password: Helm repository password if authentication is needed.

Additional parameters: If the action is being triggered by a deployment event and the task parameter in the deployment event is set to "remove" then this action will execute a helm delete $service

Versions

  • helm: v2.16.1
  • helm3: v3.0.0

Environment

  • KUBECONFIG_FILE: Kubeconfig file for Kubernetes cluster access.

Value file interpolation

The following syntax allows variables to be used in value files:

  • ${{ secrets.KEY }}: References secret variables passed in the secrets input.
  • ${{ deployment }}: References the deployment event that triggered this action.

Example

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example canary

If a track is chosen that is equal to canary, this updates the helm chart in a few ways:

  1. Release name is changed to {release}-{track} (eg. myapp-canary).
  2. The service is disabled on the helm chart service.enabled=false
  3. The ingress is disabled on the helm chart ingress.enabled=false

Not enabling the service or ingress allows the stable ingress and service resources to pick up the canary pods and route traffic to them.

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'track: canarynamespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example pr cleanup

If you are creating an environment per pull request with Helm you may have the issue where pull request environments like pr123 sit around in your cluster. By using GitHub actions we can clean those up by listening for pull request close events.

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
# Task remove means to remove the helm release.task: 'remove'release: 'review-myapp-${{ github.event.pull_request.number }}'version: '${{ github.sha }}'track: 'stable'chart: 'app'namespace: 'example-helm'token: '${{ github.token }}'env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example add custom repository

Sometime you may want to add a custom repository, like chartmuseum. For th

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'chartmuseum/app'token: '${{ github.token }}'repo: 'http://chartmuseum.example.com'repo-alias: chartmuseumrepo-username: ${{ secrets.CHARTMUSEUM_USERNAME }}repo-password: ${{ secrets.CHARTMUSEUM_PASSWORD }}env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

About

GitHub action for deploying Helm charts.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - RedRiverSoftware/helm: GitHub action for deploying Helm charts. · GitHub
Skip to content

Repository files navigation

Helm Action

Deploys a helm chart using GitHub actions. Supports canary deployments and provides a built in helm chart for apps that listen over http to get your ramped up quickly.

View an example repository using this action at github.com/deliverybot/example-helm.

Parameters

Inputs

Inputs below are additionally loaded from the payload of the deployment event payload if the action was triggered by a deployment.

  • release: Helm release name. Will be combined with track if set. (required)
  • namespace: Kubernetes namespace name. (required)
  • chart: Helm chart path. If set to "app" this will use the built in helm chart found in this repository. (required)
  • values: Helm chart values, expected to be a YAML or JSON string.
  • track: Track for the deployment. If the track is not "stable" it activates the canary workflow described below.
  • task: Task name. If the task is "remove" it will remove the configured helm release.
  • dry-run: Helm dry-run option.
  • token: Github repository token. If included and the event is a deployment then the deployment_status event will be fired.
  • value-files: Additional value files to apply to the helm chart. Expects a JSON encoded array or a string.
  • secrets: Secret variables to include in value file interpolation. Expects a JSON encoded map.
  • helm: Helm binary to execute, one of: [helm, helm3].
  • version: Version of the app, usually commit sha works here.
  • timeout: specify a timeout for helm deployment
  • repo: Helm chart repository to be added.
  • repo-alias: Helm repository alias that will be used.
  • repo-username: Helm repository username if authentication is needed.
  • repo-password: Helm repository password if authentication is needed.

Additional parameters: If the action is being triggered by a deployment event and the task parameter in the deployment event is set to "remove" then this action will execute a helm delete $service

Versions

  • helm: v2.16.1
  • helm3: v3.0.0

Environment

  • KUBECONFIG_FILE: Kubeconfig file for Kubernetes cluster access.

Value file interpolation

The following syntax allows variables to be used in value files:

  • ${{ secrets.KEY }}: References secret variables passed in the secrets input.
  • ${{ deployment }}: References the deployment event that triggered this action.

Example

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example canary

If a track is chosen that is equal to canary, this updates the helm chart in a few ways:

  1. Release name is changed to {release}-{track} (eg. myapp-canary).
  2. The service is disabled on the helm chart service.enabled=false
  3. The ingress is disabled on the helm chart ingress.enabled=false

Not enabling the service or ingress allows the stable ingress and service resources to pick up the canary pods and route traffic to them.

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'track: canarynamespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example pr cleanup

If you are creating an environment per pull request with Helm you may have the issue where pull request environments like pr123 sit around in your cluster. By using GitHub actions we can clean those up by listening for pull request close events.

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
# Task remove means to remove the helm release.task: 'remove'release: 'review-myapp-${{ github.event.pull_request.number }}'version: '${{ github.sha }}'track: 'stable'chart: 'app'namespace: 'example-helm'token: '${{ github.token }}'env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example add custom repository

Sometime you may want to add a custom repository, like chartmuseum. For th

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'chartmuseum/app'token: '${{ github.token }}'repo: 'http://chartmuseum.example.com'repo-alias: chartmuseumrepo-username: ${{ secrets.CHARTMUSEUM_USERNAME }}repo-password: ${{ secrets.CHARTMUSEUM_PASSWORD }}env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

About

GitHub action for deploying Helm charts.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - RedRiverSoftware/helm: GitHub action for deploying Helm charts. · GitHub
Skip to content

Repository files navigation

Helm Action

Deploys a helm chart using GitHub actions. Supports canary deployments and provides a built in helm chart for apps that listen over http to get your ramped up quickly.

View an example repository using this action at github.com/deliverybot/example-helm.

Parameters

Inputs

Inputs below are additionally loaded from the payload of the deployment event payload if the action was triggered by a deployment.

  • release: Helm release name. Will be combined with track if set. (required)
  • namespace: Kubernetes namespace name. (required)
  • chart: Helm chart path. If set to "app" this will use the built in helm chart found in this repository. (required)
  • values: Helm chart values, expected to be a YAML or JSON string.
  • track: Track for the deployment. If the track is not "stable" it activates the canary workflow described below.
  • task: Task name. If the task is "remove" it will remove the configured helm release.
  • dry-run: Helm dry-run option.
  • token: Github repository token. If included and the event is a deployment then the deployment_status event will be fired.
  • value-files: Additional value files to apply to the helm chart. Expects a JSON encoded array or a string.
  • secrets: Secret variables to include in value file interpolation. Expects a JSON encoded map.
  • helm: Helm binary to execute, one of: [helm, helm3].
  • version: Version of the app, usually commit sha works here.
  • timeout: specify a timeout for helm deployment
  • repo: Helm chart repository to be added.
  • repo-alias: Helm repository alias that will be used.
  • repo-username: Helm repository username if authentication is needed.
  • repo-password: Helm repository password if authentication is needed.

Additional parameters: If the action is being triggered by a deployment event and the task parameter in the deployment event is set to "remove" then this action will execute a helm delete $service

Versions

  • helm: v2.16.1
  • helm3: v3.0.0

Environment

  • KUBECONFIG_FILE: Kubeconfig file for Kubernetes cluster access.

Value file interpolation

The following syntax allows variables to be used in value files:

  • ${{ secrets.KEY }}: References secret variables passed in the secrets input.
  • ${{ deployment }}: References the deployment event that triggered this action.

Example

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example canary

If a track is chosen that is equal to canary, this updates the helm chart in a few ways:

  1. Release name is changed to {release}-{track} (eg. myapp-canary).
  2. The service is disabled on the helm chart service.enabled=false
  3. The ingress is disabled on the helm chart ingress.enabled=false

Not enabling the service or ingress allows the stable ingress and service resources to pick up the canary pods and route traffic to them.

# .github/workflows/deploy.ymlname: Deployon: ['deployment']jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- uses: actions/checkout@v1
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'track: canarynamespace: 'default'chart: 'app'token: '${{ github.token }}'values: | name: foobarenv:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example pr cleanup

If you are creating an environment per pull request with Helm you may have the issue where pull request environments like pr123 sit around in your cluster. By using GitHub actions we can clean those up by listening for pull request close events.

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
# Task remove means to remove the helm release.task: 'remove'release: 'review-myapp-${{ github.event.pull_request.number }}'version: '${{ github.sha }}'track: 'stable'chart: 'app'namespace: 'example-helm'token: '${{ github.token }}'env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

Example add custom repository

Sometime you may want to add a custom repository, like chartmuseum. For th

# .github/workflows/pr-cleanup.ymlname: PRCleanupon:
pull_request:
types: [closed]jobs:
deployment:
runs-on: 'ubuntu-latest'steps:
- name: 'Deploy'uses: 'deliverybot/helm@v1'with:
release: 'nginx'namespace: 'default'chart: 'chartmuseum/app'token: '${{ github.token }}'repo: 'http://chartmuseum.example.com'repo-alias: chartmuseumrepo-username: ${{ secrets.CHARTMUSEUM_USERNAME }}repo-password: ${{ secrets.CHARTMUSEUM_PASSWORD }}env:
KUBECONFIG_FILE: '${{ secrets.KUBECONFIG }}'

About

GitHub action for deploying Helm charts.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages