forked from ankane/setup-postgres
-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
150 lines (121 loc) · 4.52 KB
/
index.js
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
138
139
140
141
142
143
144
145
146
147
148
149
150
const execSync = require('child_process').execSync;
const fs = require('fs');
const path = require('path');
const spawnSync = require('child_process').spawnSync;
function run(command) {
console.log(command);
execSync(command, {stdio: 'inherit'});
}
function runSafe() {
const args = Array.from(arguments);
console.log(args.join(' '));
const command = args.shift();
// spawn is safer and more lightweight than exec
const ret = spawnSync(command, args, {stdio: 'inherit'});
if (ret.status !== 0) {
throw ret.error;
}
}
function addToPath(newPath) {
fs.appendFileSync(process.env.GITHUB_PATH, `${newPath}\n`);
}
function isMac() {
return process.platform == 'darwin';
}
function isWindows() {
return process.platform == 'win32';
}
// TODO read each line and replace existing value if needed
function setConfig(dir) {
const config = process.env['INPUT_CONFIG'];
if (config) {
const file = path.join(dir, 'postgresql.conf');
if (isMac() || isWindows()) {
fs.appendFileSync(file, config);
} else {
const tmpfile = '/tmp/postgresql.conf';
fs.writeFileSync(tmpfile, config);
execSync(`cat ${tmpfile} | sudo tee -a ${file}`);
}
}
}
function updateHba(dir) {
const contents = `
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
local all all peer
host all $USER 127.0.0.1/32 trust
host all $USER ::1/128 trust
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
`
execSync(`echo "${contents}" | sudo tee ${dir}/pg_hba.conf`);
}
const defaultVersion = 14;
const postgresVersion = parseFloat(process.env['INPUT_POSTGRES-VERSION'] || defaultVersion);
if (![15, 14, 13, 12, 11, 10, 9.6].includes(postgresVersion)) {
throw `Postgres version not supported: ${postgresVersion}`;
}
const database = process.env['INPUT_DATABASE'];
let bin;
if (isMac()) {
bin = `/usr/local/opt/postgresql@${postgresVersion}/bin`;
let dataDir = `/usr/local/var/postgresql@${postgresVersion}`;
if (postgresVersion != 14) {
// remove previous version
run(`brew unlink postgresql@14`);
// update Homebrew if needed
if (process.env['ImageOS'] == 'macos1015' && postgresVersion == 15) {
run(`brew update`);
}
// install new version
run(`brew install postgresql@${postgresVersion}`);
}
setConfig(dataDir);
// start
run(`${bin}/pg_ctl -w -D ${dataDir} start`);
} else if (isWindows()) {
if (postgresVersion != 14) {
throw `Postgres version not supported on Windows: ${postgresVersion}`;
}
setConfig(process.env.PGDATA);
// start
run(`sc config postgresql-x64-14 start=auto`);
run(`net start postgresql-x64-14`);
bin = process.env.PGBIN;
} else {
// removed in https://github.com/actions/virtual-environments/pull/3091
if (!fs.existsSync('/etc/apt/sources.list.d/pgdg.list')) {
// beta versions require extra component
// development snapshots require this and -snapshot after pgdg
// https://wiki.postgresql.org/wiki/Apt/FAQ
const suffix = postgresVersion == 16 ? ` ${postgresVersion}` : "";
run(`curl -s https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/apt.postgresql.org.gpg >/dev/null`)
run(`echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main${suffix}" | sudo tee /etc/apt/sources.list.d/pgdg.list`);
}
if (postgresVersion != 14) {
// remove previous cluster so port 5432 is used
run(`sudo pg_dropcluster 14 main`);
// install new version
run(`sudo apt-get update -o Dir::Etc::sourcelist="sources.list.d/pgdg.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"`);
run(`sudo apt-get install postgresql-${postgresVersion}`);
}
const devFiles = process.env['INPUT_DEV-FILES'];
// maybe support other truthy values in future
if (devFiles == 'true') {
run(`sudo apt-get update`);
run(`sudo apt-get install postgresql-server-dev-${postgresVersion}`);
}
const dataDir = `/etc/postgresql/${postgresVersion}/main`;
setConfig(dataDir);
updateHba(dataDir);
// start
run(`sudo systemctl start postgresql@${postgresVersion}-main`);
// add user
run(`sudo -u postgres createuser -s $USER`);
bin = `/usr/lib/postgresql/${postgresVersion}/bin`;
}
if (database) {
runSafe(path.join(bin, "createdb"), database);
}
addToPath(bin);