Skip to content

Look for new PR with label preview-environment #12439

Look for new PR with label preview-environment

Look for new PR with label preview-environment #12439

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'
})
}
}
}