Look for new PR with label preview-environment #12421
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Look for new PR with label preview-environment | |
on: | |
workflow_dispatch: | |
schedule: | |
- cron: "*/5 * * * *" | |
concurrency: check_pr | |
jobs: | |
checks: | |
name: Check whether a new PR has label preview-environment | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/setup-node@v3 | |
with: | |
node-version: 16 | |
- name: Helm Installation | |
uses: azure/setup-helm@v3 | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v3 | |
with: | |
platforms: all | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Install kubectl | |
uses: azure/setup-kubectl@v3 | |
- name: install npm packages and kubernetes | |
run: | | |
npm install @kubernetes/client-node nodejs-helm bluebird git-clone | |
mkdir -p ~/.kube | |
echo "$KUBECONFIG_TEXT" > ~/.kube/config | |
chmod 600 ~/.kube/config | |
helm repo add searxng https://charts.searxng.org | |
helm repo update | |
env: | |
KUBECONFIG_TEXT: ${{secrets.KUBECONFIG_TEXT}} | |
- name: Login to Quay.io | |
uses: docker/login-action@v2 | |
with: | |
registry: quay.io | |
username: ${{ secrets.QUAY_USERNAME }} | |
password: ${{ secrets.QUAY_PASSWORD }} | |
- name: Check whether a new PR has label preview-environment | |
uses: actions/github-script@v6 | |
with: | |
github-token: ${{ secrets.GH_PAT }} | |
script: | | |
const k8s = require('@kubernetes/client-node'); | |
const clone = require('git-clone/promise'); | |
let Promise = require("bluebird"); | |
const Helm = require("nodejs-helm").Helm; | |
let helm = Promise.promisifyAll(new Helm({helmCommand: "helm"})); | |
const kc = new k8s.KubeConfig(); | |
kc.loadFromDefault(); | |
const k8sApi = kc.makeApiClient(k8s.CoreV1Api); | |
const pullrequests = await github.rest.pulls.list({ | |
owner: "searxng", | |
repo: "searxng", | |
per_page: 100, | |
state: "open", | |
}) | |
for (const pullrequest of pullrequests.data) { | |
if (pullrequest.labels.some(item => item.name === 'preview-environment') | |
|| pullrequest.labels.some(item => item.name === 'preview-environment-commented')) { | |
const prNumber = pullrequest.number; | |
const prHeadHash = pullrequest.head.sha; | |
const optionsGetReleaseInfo = { | |
releaseName: 'searxng-preview', | |
subCommand: 'all', | |
namespace: `searxng-${prNumber}` | |
} | |
let releaseImageTag = ""; | |
try { | |
const helmReleaseInfo = await helm.getAsync(optionsGetReleaseInfo); | |
releaseImageTag = helmReleaseInfo[0].image.tag; | |
} catch (error) { | |
try { | |
await k8sApi.createNamespace({ | |
metadata: { | |
name: `searxng-${prNumber}`, | |
}, | |
}); | |
} catch (error) { | |
} | |
} | |
if (releaseImageTag == "" || releaseImageTag != prHeadHash) { | |
await clone(pullrequest.head.repo.clone_url, `./searxng-${prNumber}`, {checkout: pullrequest.head.ref }); | |
const optionsExec = { | |
cwd: `./searxng-${prNumber}` | |
} | |
await exec.exec('docker', ["buildx", "build", "--platform", "linux/amd64,linux/arm64", "--push", "--build-arg", "quay_expiration=300d", "-t", `quay.io/searxng/searxng-test-pr:${prHeadHash}`, "-f", "Dockerfile", "."], optionsExec); | |
const optionsInstallRelease = { | |
reuseValues: false, | |
resetValues: true, | |
chartName: "searxng/searxng", | |
releaseName: "searxng-preview", | |
namespace: `searxng-${prNumber}`, | |
install: true, | |
values: { | |
"image.repository": "quay.io/searxng/searxng-test-pr", | |
"image.tag": prHeadHash, | |
"searxng.config.server.secret_key": "secret", | |
"searxng.config.outgoing.proxies.all://[0]": "http://holaproxy-holaproxy.holaproxy.svc.cluster.local:8080", | |
"env.BASE_URL": `https://${prNumber}.testpr.searxng.net`, | |
"env.INSTANCE_NAME": `pr-${prNumber}`, | |
"env.UWSGI_WORKERS": '1', | |
"ingress.main.enabled": true, | |
"ingress.main.hosts[0].host": `${prNumber}.testpr.searxng.net,ingress.main.hosts[0].paths[0].path=/,ingress.main.hosts[0].paths[0].pathType=Prefix`, | |
} | |
}; | |
await helm.upgradeAsync(optionsInstallRelease); | |
} | |
if (!pullrequest.labels.some(item => item.name === 'preview-environment-commented')) { | |
await github.rest.issues.createComment({ | |
issue_number: prNumber, | |
owner: "searxng", | |
repo: "searxng", | |
body: `Preview environment deployed at https://${prNumber}.testpr.searxng.net` | |
}); | |
await github.rest.issues.addLabels({ | |
issue_number: prNumber, | |
owner: "searxng", | |
repo: "searxng", | |
labels: ['preview-environment-commented'] | |
}) | |
await github.rest.issues.removeLabel({ | |
issue_number: prNumber, | |
owner: "searxng", | |
repo: "searxng", | |
name: 'preview-environment' | |
}) | |
} | |
} | |
} | |