@@ -3,8 +3,10 @@ const github = require("@actions/github");
3
3
const exec = require ( "@actions/exec" ) ;
4
4
const fs = require ( "fs" ) ;
5
5
const util = require ( "util" ) ;
6
+ const Mustache = require ( "mustache" ) ;
6
7
7
8
const writeFile = util . promisify ( fs . writeFile ) ;
9
+ const readFile = util . promisify ( fs . readFile ) ;
8
10
const required = { required : true } ;
9
11
10
12
/**
@@ -62,6 +64,33 @@ function getValues(values) {
62
64
return values ;
63
65
}
64
66
67
+ function getSecrets ( secrets ) {
68
+ if ( typeof secrets === "string" ) {
69
+ try {
70
+ return JSON . stringify ( secrets ) ;
71
+ } catch ( err ) {
72
+ return secrets ;
73
+ }
74
+ }
75
+ return secrets ;
76
+ }
77
+
78
+ function getValueFiles ( files ) {
79
+ let fileList ;
80
+ if ( typeof files === "string" ) {
81
+ try {
82
+ fileList = JSON . parse ( files ) ;
83
+ } catch ( err ) {
84
+ // Assume it's a single string.
85
+ fileList = [ files ] ;
86
+ }
87
+ }
88
+ if ( ! Array . isArray ( fileList ) ) {
89
+ return [ ] ;
90
+ }
91
+ return fileList ;
92
+ }
93
+
65
94
function getInput ( name , options ) {
66
95
const context = github . context ;
67
96
const deployment = context . payload . deployment ;
@@ -79,23 +108,43 @@ function getInput(name, options) {
79
108
return val ;
80
109
}
81
110
82
- function render ( ) { }
111
+ /**
112
+ * Render files renders data into the list of provided files.
113
+ * @param {Array<string> } files
114
+ * @param {any } data
115
+ */
116
+ function renderFiles ( files , data ) {
117
+ core . debug (
118
+ `rendering value files [${ files . join ( "," ) } ] with: ${ JSON . stringify ( data ) } `
119
+ ) ;
120
+ const tags = [ "${{" , "}}" ] ;
121
+ const promises = files . map ( async file => {
122
+ const content = await readFile ( file , { encoding : "utf8" } ) ;
123
+ const rendered = Mustache . render ( content , data , { } , tags ) ;
124
+ await writeFile ( file , rendered ) ;
125
+ } ) ;
126
+ return Promise . all ( promises ) ;
127
+ }
83
128
84
129
/**
85
130
* Run executes the helm deployment.
86
131
*/
87
132
async function run ( ) {
88
133
try {
134
+ const context = github . context ;
89
135
await status ( "pending" ) ;
90
136
91
137
const track = getInput ( "track" ) || "stable" ;
92
138
const release = releaseName ( getInput ( "release" , required ) , track ) ;
93
139
const namespace = getInput ( "namespace" , required ) ;
94
140
const chart = chartName ( getInput ( "chart" , required ) ) ;
95
141
const values = getValues ( getInput ( "values" ) ) ;
96
- const dryRun = getInput ( "dry_run" ) ;
97
142
const task = getInput ( "task" ) ;
98
143
const version = getInput ( "version" ) ;
144
+ const valueFiles = getValueFiles ( getInput ( "value_files" ) ) ;
145
+
146
+ const dryRun = core . getInput ( "dry-run" ) ;
147
+ const secrets = getSecrets ( core . getInput ( "secrets" ) ) ;
99
148
100
149
core . debug ( `param: track = "${ track } "` ) ;
101
150
core . debug ( `param: release = "${ release } "` ) ;
@@ -105,6 +154,8 @@ async function run() {
105
154
core . debug ( `param: dryRun = "${ dryRun } "` ) ;
106
155
core . debug ( `param: task = "${ task } "` ) ;
107
156
core . debug ( `param: version = "${ version } "` ) ;
157
+ core . debug ( `param: secrets = "${ secrets } "` ) ;
158
+ core . debug ( `param: valueFiles = "${ valueFiles } "` ) ;
108
159
109
160
// Setup command options and arguments.
110
161
const opts = { env : { } } ;
@@ -136,6 +187,12 @@ async function run() {
136
187
137
188
core . debug ( `env: KUBECONFIG="${ opts . env . KUBECONFIG } "` ) ;
138
189
190
+ // Render value files using github variables.
191
+ await renderFiles ( valueFiles . concat ( [ "./values.yml" ] ) , {
192
+ secrets,
193
+ deployment : context . payload . deployment ,
194
+ } ) ;
195
+
139
196
// Actually execute the deployment here.
140
197
if ( task === "remove" ) {
141
198
await exec . exec ( "helm" , [ "delete" , release , "--purge" ] , {
0 commit comments