-
Notifications
You must be signed in to change notification settings - Fork 0
138 lines (132 loc) · 5.84 KB
/
look-new-pr-test.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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'
})
}
}
}