Skip to content

Commit 110cd1b

Browse files
authored
fix(api): load vcsInfos on a run without a root app (#5209)
Signed-off-by: Yvonnick Esnault <yvonnick.esnault@corp.ovh.com>
1 parent 79c36e5 commit 110cd1b

File tree

2 files changed

+247
-1
lines changed

2 files changed

+247
-1
lines changed

engine/api/workflow/process_node.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,9 @@ func processNode(ctx context.Context, db gorp.SqlExecutor, store cache.Store, pr
204204
}
205205
}
206206
// Find an ancestor on the same repo
207-
if currentRepo != "" && parentRepo != nil && parentRepo.Value != currentRepo {
207+
if currentRepo != "" && parentRepo == nil {
208+
needVCSInfo = true
209+
} else if currentRepo != "" && parentRepo != nil && parentRepo.Value != currentRepo {
208210
// Try to found a parent on the same repo
209211
found := false
210212
for _, parent := range wr.WorkflowNodeRuns {

engine/api/workflow/process_node_test.go

Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,6 +1187,250 @@ func TestManualRunBuildParameterMultiApplication(t *testing.T) {
11871187
assert.Equal(t, "github", wr.WorkflowNodeRuns[w.WorkflowData.Node.Triggers[0].ChildNode.Triggers[0].ChildNode.ID][0].VCSServer)
11881188
}
11891189

1190+
func TestManualRunBuildParameterNoApplicationOnRoot(t *testing.T) {
1191+
db, cache, end := test.SetupPG(t, bootstrap.InitiliazeDB)
1192+
defer end()
1193+
u, _ := assets.InsertAdminUser(t, db)
1194+
1195+
// Create project
1196+
key := sdk.RandomString(10)
1197+
proj := assets.InsertTestProject(t, db, cache, key, key)
1198+
vcsServer := sdk.ProjectVCSServerLink{
1199+
ProjectID: proj.ID,
1200+
Name: "github",
1201+
}
1202+
vcsServer.Set("token", "foo")
1203+
vcsServer.Set("secret", "bar")
1204+
assert.NoError(t, repositoriesmanager.InsertProjectVCSServerLink(context.TODO(), db, &vcsServer))
1205+
1206+
vcsServer2 := sdk.ProjectVCSServerLink{
1207+
ProjectID: proj.ID,
1208+
Name: "stash",
1209+
}
1210+
vcsServer2.Set("token", "foo")
1211+
vcsServer2.Set("secret", "bar")
1212+
assert.NoError(t, repositoriesmanager.InsertProjectVCSServerLink(context.TODO(), db, &vcsServer2))
1213+
1214+
allSrv, err := services.LoadAll(context.TODO(), db)
1215+
for _, s := range allSrv {
1216+
if err := services.Delete(db, &s); err != nil {
1217+
t.Fatalf("unable to delete service: %v", err)
1218+
}
1219+
}
1220+
1221+
mockVCSSservice, _ := assets.InsertService(t, db, "TestManualRunBuildParameterMultiApplication", services.TypeVCS)
1222+
defer func() {
1223+
services.Delete(db, mockVCSSservice)
1224+
}()
1225+
1226+
//This is a mock for the vcs service
1227+
services.HTTPClient = mock(
1228+
func(r *http.Request) (*http.Response, error) {
1229+
body := new(bytes.Buffer)
1230+
w := new(http.Response)
1231+
enc := json.NewEncoder(body)
1232+
w.Body = ioutil.NopCloser(body)
1233+
1234+
switch r.URL.String() {
1235+
case "/vcs/stash/repos/ovh/cds":
1236+
repo := sdk.VCSRepo{
1237+
URL: "https",
1238+
Name: "cds",
1239+
ID: "123",
1240+
Fullname: "ovh/cds",
1241+
Slug: "ovh",
1242+
HTTPCloneURL: "https://stash.com/ovh/cds.git",
1243+
SSHCloneURL: "git://stash.com/ovh/cds.git",
1244+
}
1245+
if err := enc.Encode(repo); err != nil {
1246+
return writeError(w, err)
1247+
}
1248+
case "/vcs/stash/repos/ovh/cds/branches":
1249+
bs := []sdk.VCSBranch{
1250+
{
1251+
LatestCommit: "defaultCommit",
1252+
DisplayID: "defaultBranch",
1253+
Default: true,
1254+
ID: "1",
1255+
},
1256+
}
1257+
if err := enc.Encode(bs); err != nil {
1258+
return writeError(w, err)
1259+
}
1260+
case "/vcs/stash/repos/ovh/cds/branches/?branch=feat%2Fbranch":
1261+
return writeError(w, sdk.ErrNotFound)
1262+
case "/vcs/github/repos/sguiheux/demo/branches":
1263+
bs := []sdk.VCSBranch{
1264+
{
1265+
LatestCommit: "defaultCommit",
1266+
DisplayID: "defaultBranch",
1267+
Default: true,
1268+
ID: "1",
1269+
},
1270+
}
1271+
if err := enc.Encode(bs); err != nil {
1272+
return writeError(w, err)
1273+
}
1274+
case "/vcs/stash/repos/ovh/cds/commits/defaultCommit":
1275+
c := sdk.VCSCommit{
1276+
Author: sdk.VCSAuthor{
1277+
Name: "john.snow",
1278+
Email: "john.snow@winterfell",
1279+
},
1280+
Hash: "defaultCommit",
1281+
Message: "super default commit",
1282+
Timestamp: time.Now().Unix(),
1283+
}
1284+
if err := enc.Encode(c); err != nil {
1285+
return writeError(w, err)
1286+
}
1287+
// NEED get REPO
1288+
case "/vcs/github/repos/sguiheux/demo":
1289+
repo := sdk.VCSRepo{
1290+
URL: "https",
1291+
Name: "demo",
1292+
ID: "123",
1293+
Fullname: "sguiheux/demo",
1294+
Slug: "sguiheux",
1295+
HTTPCloneURL: "https://github.com/sguiheux/demo.git",
1296+
SSHCloneURL: "git://github.com/sguiheux/demo.git",
1297+
}
1298+
if err := enc.Encode(repo); err != nil {
1299+
return writeError(w, err)
1300+
}
1301+
// NEED GET BRANCH TO GET LATEST COMMIT
1302+
//case "/vcs/github/repos/sguiheux/demo/branches/?branch=feat%2Fbranch":
1303+
case "/vcs/github/repos/sguiheux/demo/branches/?branch=defaultBranch":
1304+
b := sdk.VCSBranch{
1305+
Default: false,
1306+
DisplayID: "defaultBranch",
1307+
LatestCommit: "mylastcommit",
1308+
}
1309+
if err := enc.Encode(b); err != nil {
1310+
return writeError(w, err)
1311+
}
1312+
// NEED GET COMMIT TO GET AUTHOR AND MESSAGE
1313+
case "/vcs/github/repos/sguiheux/demo/commits/mylastcommit":
1314+
c := sdk.VCSCommit{
1315+
Author: sdk.VCSAuthor{
1316+
Name: "steven.guiheux",
1317+
Email: "sg@foo.bar",
1318+
},
1319+
Hash: "mylastcommit",
1320+
Message: "super commit",
1321+
Timestamp: time.Now().Unix(),
1322+
}
1323+
if err := enc.Encode(c); err != nil {
1324+
return writeError(w, err)
1325+
}
1326+
default:
1327+
t.Fatalf("UNKNOWN ROUTE: %s", r.URL.String())
1328+
}
1329+
1330+
return w, nil
1331+
},
1332+
)
1333+
1334+
pip := createEmptyPipeline(t, db, cache, proj, u)
1335+
app1 := createApplication1(t, db, cache, proj, u)
1336+
app2 := createApplication2(t, db, cache, proj, u)
1337+
1338+
// RELOAD PROJECT WITH DEPENDENCIES
1339+
proj.Applications = append(proj.Applications, *app1, *app2)
1340+
proj.Pipelines = append(proj.Pipelines, *pip)
1341+
1342+
// WORKFLOW TO RUN
1343+
w := sdk.Workflow{
1344+
ProjectID: proj.ID,
1345+
ProjectKey: proj.Key,
1346+
Name: sdk.RandomString(10),
1347+
WorkflowData: sdk.WorkflowData{
1348+
Node: sdk.Node{
1349+
Name: "root",
1350+
Type: sdk.NodeTypePipeline,
1351+
Context: &sdk.NodeContext{
1352+
PipelineID: proj.Pipelines[0].ID,
1353+
},
1354+
Triggers: []sdk.NodeTrigger{
1355+
{
1356+
ChildNode: sdk.Node{
1357+
Name: "child1",
1358+
Type: sdk.NodeTypePipeline,
1359+
Context: &sdk.NodeContext{
1360+
PipelineID: proj.Pipelines[0].ID,
1361+
ApplicationID: proj.Applications[1].ID,
1362+
},
1363+
Triggers: []sdk.NodeTrigger{
1364+
{
1365+
ChildNode: sdk.Node{
1366+
Name: "child2",
1367+
Type: sdk.NodeTypePipeline,
1368+
Context: &sdk.NodeContext{
1369+
PipelineID: proj.Pipelines[0].ID,
1370+
ApplicationID: proj.Applications[0].ID,
1371+
},
1372+
},
1373+
},
1374+
},
1375+
},
1376+
},
1377+
},
1378+
},
1379+
},
1380+
Applications: map[int64]sdk.Application{
1381+
proj.Applications[0].ID: proj.Applications[0],
1382+
proj.Applications[1].ID: proj.Applications[1],
1383+
},
1384+
Pipelines: map[int64]sdk.Pipeline{
1385+
proj.Pipelines[0].ID: proj.Pipelines[0],
1386+
},
1387+
}
1388+
1389+
assert.NoError(t, workflow.Insert(context.TODO(), db, cache, *proj, &w))
1390+
1391+
// CREATE RUN
1392+
var manualEvent sdk.WorkflowNodeRunManual
1393+
manualEvent.Payload = map[string]string{
1394+
"git.branch": "feat/branch",
1395+
}
1396+
1397+
opts := &sdk.WorkflowRunPostHandlerOption{
1398+
Manual: &manualEvent,
1399+
}
1400+
wr, err := workflow.CreateRun(db, &w, opts, u)
1401+
assert.NoError(t, err)
1402+
wr.Workflow = w
1403+
1404+
consumer, _ := authentication.LoadConsumerByTypeAndUserID(context.TODO(), db, sdk.ConsumerLocal, u.ID, authentication.LoadConsumerOptions.WithAuthentifiedUser)
1405+
1406+
_, errR := workflow.StartWorkflowRun(context.TODO(), db, cache, *proj, wr, opts, consumer, nil)
1407+
assert.NoError(t, errR)
1408+
1409+
assert.Equal(t, 3, len(wr.WorkflowNodeRuns))
1410+
assert.Equal(t, 1, len(wr.WorkflowNodeRuns[w.WorkflowData.Node.ID]))
1411+
1412+
mapParams := sdk.ParametersToMap(wr.WorkflowNodeRuns[w.WorkflowData.Node.ID][0].BuildParameters)
1413+
assert.Equal(t, "feat/branch", mapParams["git.branch"])
1414+
assert.Equal(t, "", mapParams["git.hash"])
1415+
assert.Equal(t, "", mapParams["git.author"])
1416+
assert.Equal(t, "", mapParams["git.message"])
1417+
1418+
mapParams2 := sdk.ParametersToMap(wr.WorkflowNodeRuns[w.WorkflowData.Node.Triggers[0].ChildNode.ID][0].BuildParameters)
1419+
assert.Equal(t, "defaultBranch", mapParams2["git.branch"])
1420+
assert.Equal(t, "defaultCommit", mapParams2["git.hash"])
1421+
assert.Equal(t, "john.snow", mapParams2["git.author"])
1422+
assert.Equal(t, "super default commit", mapParams2["git.message"])
1423+
assert.Equal(t, "stash", wr.WorkflowNodeRuns[w.WorkflowData.Node.Triggers[0].ChildNode.ID][0].VCSServer)
1424+
1425+
mapParams3 := sdk.ParametersToMap(wr.WorkflowNodeRuns[w.WorkflowData.Node.Triggers[0].ChildNode.Triggers[0].ChildNode.ID][0].BuildParameters)
1426+
assert.Equal(t, "defaultBranch", mapParams3["git.branch"])
1427+
assert.Equal(t, "mylastcommit", mapParams3["git.hash"])
1428+
assert.Equal(t, "steven.guiheux", mapParams3["git.author"])
1429+
assert.Equal(t, "super commit", mapParams3["git.message"])
1430+
assert.Equal(t, "defaultBranch", mapParams3["workflow.child1.git.branch"])
1431+
assert.Equal(t, "github", wr.WorkflowNodeRuns[w.WorkflowData.Node.Triggers[0].ChildNode.Triggers[0].ChildNode.ID][0].VCSServer)
1432+
}
1433+
11901434
// Payload: branch only
11911435
func TestGitParamOnPipelineWithoutApplication(t *testing.T) {
11921436
db, cache, end := test.SetupPG(t, bootstrap.InitiliazeDB)

0 commit comments

Comments
 (0)