Skip to content

Commit

Permalink
[FEATURE] Déploiement de maddo à la création/mise à jour des reviews app
Browse files Browse the repository at this point in the history
  • Loading branch information
pix-service-auto-merge authored Feb 7, 2025
2 parents 9e4ed54 + 6fa6170 commit 1d85911
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 28 deletions.
2 changes: 1 addition & 1 deletion build/controllers/github.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ const repositoryToScalingoAppsReview = {
'pix-site': ['pix-site-review', 'pix-pro-review'],
'pix-tutos': ['pix-tutos-review'],
'pix-ui': ['pix-ui-review'],
pix: ['pix-api-review', 'pix-audit-logger-review', 'pix-front-review'],
pix: ['pix-api-review', 'pix-api-maddo-review', 'pix-audit-logger-review', 'pix-front-review'],
pix4pix: ['pix-4pix-front-review', 'pix-4pix-api-review'],
};

Expand Down
6 changes: 5 additions & 1 deletion build/repositories/review-app-repository.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ export const markAsFailed = async function ({ name }) {
};

export const areAllDeployed = async function ({ repository, prNumber }) {
const { count } = await knex('review-apps').count().where({ repository, prNumber, isDeployed: false }).first();
const { count } = await knex('review-apps')
.count()
.where({ repository, prNumber, isDeployed: false })
.whereNot('name', 'like', '%maddo%')
.first();
return count === 0;
};
2 changes: 1 addition & 1 deletion common/services/github.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ function _createOctokit() {
octokit.hook.error('request', async (error) => {
logger.error({
event: 'github',
message: error.response.data,
message: error.response?.data,
});

return error;
Expand Down
43 changes: 30 additions & 13 deletions test/acceptance/build/github_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ describe('Acceptance | Build | Github', function () {
});
expect(res.statusCode).to.equal(StatusCodes.OK);
expect(res.result).to.eql(
'Triggered deployment of RA on app pix-api-review, pix-audit-logger-review, pix-front-review with pr 2',
'Triggered deployment of RA on app pix-api-review, pix-api-maddo-review, pix-audit-logger-review, pix-front-review with pr 2',
);
expect(scalingoAuth.isDone()).to.be.true;
expect(scalingoDeploy1.isDone()).to.be.true;
Expand Down Expand Up @@ -267,10 +267,12 @@ describe('Acceptance | Build | Github', function () {
const scalingoRAExists1 = getAppNock({ reviewAppName: 'pix-front-review-pr2' });
const scalingoRAExists2 = getAppNock({ reviewAppName: 'pix-api-review-pr2' });
const scalingoRAExists3 = getAppNock({ reviewAppName: 'pix-audit-logger-review-pr2' });
const scalingoRAExists4 = getAppNock({ reviewAppName: 'pix-api-maddo-review-pr2' });

const scalingoDeploy1 = getManualDeployNock({ reviewAppName: 'pix-front-review-pr2' });
const scalingoDeploy2 = getManualDeployNock({ reviewAppName: 'pix-api-review-pr2' });
const scalingoDeploy3 = getManualDeployNock({ reviewAppName: 'pix-audit-logger-review-pr2' });
const scalingoDeploy4 = getManualDeployNock({ reviewAppName: 'pix-api-maddo-review-pr2' });

const getPullRequest = getPullRequestNock({ repository: 'pix', prNumber: 2, sha: 'my-sha' });
const addRADeploymentCheck = addRADeploymentCheckNock({ repository: 'pix', sha: 'my-sha', status: 'pending' });
Expand All @@ -286,15 +288,17 @@ describe('Acceptance | Build | Github', function () {
});
expect(res.statusCode).to.equal(200);
expect(res.result).to.eql(
'Triggered deployment of RA on app pix-api-review, pix-audit-logger-review, pix-front-review with pr 2',
'Triggered deployment of RA on app pix-api-review, pix-api-maddo-review, pix-audit-logger-review, pix-front-review with pr 2',
);
expect(scalingoAuth.isDone()).to.be.true;
expect(scalingoRAExists1.isDone()).to.be.true;
expect(scalingoRAExists2.isDone()).to.be.true;
expect(scalingoRAExists3.isDone()).to.be.true;
expect(scalingoRAExists4.isDone()).to.be.true;
expect(scalingoDeploy1.isDone()).to.be.true;
expect(scalingoDeploy2.isDone()).to.be.true;
expect(scalingoDeploy3.isDone()).to.be.true;
expect(scalingoDeploy4.isDone()).to.be.true;
expect(getPullRequest.isDone()).to.be.true;
expect(addRADeploymentCheck.isDone()).to.be.true;
});
Expand Down Expand Up @@ -412,7 +416,7 @@ describe('Acceptance | Build | Github', function () {

expect(res.statusCode).to.equal(200);
expect(res.result).to.eql(
'Triggered deployment of RA on app pix-api-review, pix-audit-logger-review, pix-front-review with pr 2',
'Triggered deployment of RA on app pix-api-review, pix-api-maddo-review, pix-audit-logger-review, pix-front-review with pr 2',
);
expect(scalingoAuth.isDone()).to.be.true;
expect(scalingoRAExists2.isDone()).to.be.true;
Expand Down Expand Up @@ -456,19 +460,23 @@ describe('Acceptance | Build | Github', function () {

describe('when Scalingo deploy API returns an error', function () {
describe('for every deployment', function () {
it('responds with 500 and throws an error', async function () {
it('responds with 200', async function () {
const scalingoAuth = nock('https://auth.scalingo.com').post('/v1/tokens/exchange').reply(201);
const scalingoRAExists1 = getAppNock({ reviewAppName: 'pix-front-review-pr2' });
const scalingoRAExists2 = getAppNock({ reviewAppName: 'pix-api-review-pr2' });
const scalingoRAExists3 = getAppNock({ reviewAppName: 'pix-audit-logger-review-pr2' });
const scalingoRAExists4 = getAppNock({ reviewAppName: 'pix-api-maddo-review-pr2' });

const getPullRequest = getPullRequestNock({ repository: 'pix', prNumber: 2, sha: 'my-sha' });

const scalingoDeploy1 = getManualDeployNock({ reviewAppName: 'pix-front-review-pr2', returnCode: 500 });
const scalingoDeploy2 = getManualDeployNock({ reviewAppName: 'pix-api-review-pr2', returnCode: 500 });
const scalingoDeploy3 = getManualDeployNock({
reviewAppName: 'pix-audit-logger-review-pr2',
returnCode: 500,
});
addRADeploymentCheckNock({ repo: 'pix', sha: 'my-sha' });
const scalingoDeploy4 = getManualDeployNock({ reviewAppName: 'pix-api-maddo-review-pr2', returnCode: 500 });
addRADeploymentCheckNock({ repository: 'pix', sha: 'my-sha', status: 'pending' });

const res = await server.inject({
method: 'POST',
Expand All @@ -481,18 +489,21 @@ describe('Acceptance | Build | Github', function () {
});

expect(scalingoAuth.isDone()).to.be.true;

expect(scalingoRAExists1.isDone()).to.be.true;
expect(scalingoRAExists2.isDone()).to.be.true;
expect(scalingoRAExists3.isDone()).to.be.true;
expect(scalingoRAExists4.isDone()).to.be.true;
expect(scalingoDeploy1.isDone()).to.be.true;
expect(scalingoDeploy2.isDone()).to.be.true;
expect(scalingoDeploy3.isDone()).to.be.true;
expect(res.statusCode).to.equal(500);
expect(res.result).to.eql({
statusCode: 500,
error: 'Internal Server Error',
message: 'An internal server error occurred',
});
expect(scalingoDeploy4.isDone()).to.be.true;
expect(getPullRequest.isDone()).to.be.true;

expect(res.statusCode).to.equal(200);
expect(res.result).to.eql(
'Triggered deployment of RA on app pix-api-review, pix-api-maddo-review, pix-audit-logger-review, pix-front-review with pr 2',
);
});
});

Expand All @@ -501,12 +512,14 @@ describe('Acceptance | Build | Github', function () {
const scalingoRAExists1 = getAppNock({ reviewAppName: 'pix-front-review-pr2' });
const scalingoRAExists2 = getAppNock({ reviewAppName: 'pix-api-review-pr2' });
const scalingoRAExists3 = getAppNock({ reviewAppName: 'pix-audit-logger-review-pr2' });
const scalingoRAExists4 = getAppNock({ reviewAppName: 'pix-api-maddo-review-pr2' });

const scalingoDeploy1 = getManualDeployNock({ reviewAppName: 'pix-front-review-pr2', returnCode: 500 });
const scalingoDeploy2 = getManualDeployNock({ reviewAppName: 'pix-api-review-pr2' });
const scalingoDeploy3 = getManualDeployNock({
reviewAppName: 'pix-audit-logger-review-pr2',
});
const scalingoDeploy4 = getManualDeployNock({ reviewAppName: 'pix-api-maddo-review-pr2' });
const getPullRequest = getPullRequestNock({ repository: 'pix', prNumber: 2, sha: 'my-sha' });
const addRADeploymentCheck = addRADeploymentCheckNock({
repository: 'pix',
Expand All @@ -528,14 +541,16 @@ describe('Acceptance | Build | Github', function () {
expect(scalingoRAExists1.isDone()).to.be.true;
expect(scalingoRAExists2.isDone()).to.be.true;
expect(scalingoRAExists3.isDone()).to.be.true;
expect(scalingoRAExists4.isDone()).to.be.true;
expect(scalingoDeploy1.isDone()).to.be.true;
expect(scalingoDeploy2.isDone()).to.be.true;
expect(scalingoDeploy3.isDone()).to.be.true;
expect(scalingoDeploy4.isDone()).to.be.true;
expect(getPullRequest.isDone()).to.be.true;
expect(addRADeploymentCheck.isDone()).to.be.true;
expect(res.statusCode).to.equal(200);
expect(res.result).to.eql(
'Triggered deployment of RA on app pix-api-review, pix-audit-logger-review, pix-front-review with pr 2',
'Triggered deployment of RA on app pix-api-review, pix-api-maddo-review, pix-audit-logger-review, pix-front-review with pr 2',
);
});
});
Expand All @@ -546,9 +561,11 @@ describe('Acceptance | Build | Github', function () {
// given
nock('https://auth.scalingo.com').post('/v1/tokens/exchange').reply(StatusCodes.OK);
getAppNock({ reviewAppName: 'pix-api-review-pr123', returnCode: StatusCodes.OK });
getAppNock({ reviewAppName: 'pix-api-maddo-review-pr123', returnCode: StatusCodes.OK });
getAppNock({ reviewAppName: 'pix-audit-logger-review-pr123', returnCode: StatusCodes.NOT_FOUND });
getAppNock({ reviewAppName: 'pix-front-review-pr123', returnCode: StatusCodes.OK });
deleteReviewAppNock({ reviewAppName: 'pix-api-review-pr123' });
deleteReviewAppNock({ reviewAppName: 'pix-api-maddo-review-pr123' });
deleteReviewAppNock({ reviewAppName: 'pix-audit-logger-review-pr123', returnCode: StatusCodes.NOT_FOUND });
deleteReviewAppNock({ reviewAppName: 'pix-front-review-pr123' });

Expand Down Expand Up @@ -585,7 +602,7 @@ describe('Acceptance | Build | Github', function () {
});

expect(response.payload).to.equal(
'Closed RA for PR 123 : pix-api-review-pr123, pix-audit-logger-review-pr123 (already closed), pix-front-review-pr123.',
'Closed RA for PR 123 : pix-api-review-pr123, pix-api-maddo-review-pr123, pix-audit-logger-review-pr123 (already closed), pix-front-review-pr123.',
);
});
});
Expand Down
39 changes: 39 additions & 0 deletions test/integration/build/repositories/review-app-repository_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,45 @@ describe('Integration | Build | Repository | Review App', function () {
expect(areAllDeployed).to.be.true;
});

it('should return true when all applications but maddo are deployed', async function () {
// given
const repository = 'pix';
const prNumber = 123;

await reviewAppRepository.create({
name: 'other-repo-review-pr1',
repository: 'other-repo',
prNumber: 1,
parentApp: 'other-repo-review',
});
await reviewAppRepository.create({
name: 'pix-api-review-pr123',
repository,
prNumber,
parentApp: 'pix-api-review',
});
await reviewAppRepository.markAsDeployed({ name: 'pix-api-review-pr123' });
await reviewAppRepository.create({
name: 'pix-front-review-pr123',
repository,
prNumber,
parentApp: 'pix-front-review',
});
await reviewAppRepository.markAsDeployed({ name: 'pix-front-review-pr123' });
await reviewAppRepository.create({
name: 'pix-api-maddo-review-pr123',
repository,
prNumber,
parentApp: 'pix-api-maddo-review',
});
await reviewAppRepository.markAsFailed({ name: 'pix-api-maddo-review-pr123' });

// when
const areAllDeployed = await reviewAppRepository.areAllDeployed({ repository, prNumber });

expect(areAllDeployed).to.be.true;
});

it('should return false when not all applications are deployed', async function () {
// given
const repository = 'pix';
Expand Down
33 changes: 21 additions & 12 deletions test/unit/build/controllers/github_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -638,19 +638,27 @@ Les variables d'environnement seront accessibles sur scalingo https://dashboard.
);

// then
expect(deployReviewAppStub.getCall(1).calledWith('pix-api-maddo-review', 3)).to.be.true;
expect(disableAutoDeployStub.getCall(1).calledWith('pix-api-maddo-review-pr3')).to.be.true;
expect(deployUsingSCMStub.getCall(1).calledWith('pix-api-maddo-review-pr3', 'my-branch')).to.be.true;

expect(deployReviewAppStub.secondCall.calledWith('pix-audit-logger-review', 3)).to.be.true;
expect(disableAutoDeployStub.secondCall.calledWith('pix-audit-logger-review-pr3')).to.be.true;
expect(deployUsingSCMStub.secondCall.calledWith('pix-audit-logger-review-pr3', 'my-branch')).to.be.true;
expect(deployReviewAppStub.getCall(2).calledWith('pix-audit-logger-review', 3)).to.be.true;
expect(disableAutoDeployStub.getCall(2).calledWith('pix-audit-logger-review-pr3')).to.be.true;
expect(deployUsingSCMStub.getCall(2).calledWith('pix-audit-logger-review-pr3', 'my-branch')).to.be.true;

expect(deployReviewAppStub.thirdCall.calledWith('pix-front-review', 3)).to.be.true;
expect(disableAutoDeployStub.thirdCall.calledWith('pix-front-review-pr3')).to.be.true;
expect(deployUsingSCMStub.thirdCall.calledWith('pix-front-review-pr3', 'my-branch')).to.be.true;
expect(deployReviewAppStub.getCall(3).calledWith('pix-front-review', 3)).to.be.true;
expect(disableAutoDeployStub.getCall(3).calledWith('pix-front-review-pr3')).to.be.true;
expect(deployUsingSCMStub.getCall(3).calledWith('pix-front-review-pr3', 'my-branch')).to.be.true;

expect(addMessageToPullRequestStub).to.have.been.calledOnceWithExactly(
{
repositoryName: 'pix',
scalingoReviewApps: ['pix-api-review', 'pix-audit-logger-review', 'pix-front-review'],
scalingoReviewApps: [
'pix-api-review',
'pix-api-maddo-review',
'pix-audit-logger-review',
'pix-front-review',
],
pullRequestId: 3,
},
{ githubService: githubServiceStub },
Expand Down Expand Up @@ -706,12 +714,13 @@ Les variables d'environnement seront accessibles sur scalingo https://dashboard.
parentApp: 'pix-api-review',
}),
).to.be.true;
expect(deployUsingSCMStub.firstCall.calledWith('pix-api-review-pr3', 'my-branch')).to.be.true;
expect(deployUsingSCMStub.secondCall.calledWith('pix-audit-logger-review-pr3', 'my-branch')).to.be.true;
expect(deployUsingSCMStub.thirdCall.calledWith('pix-front-review-pr3', 'my-branch')).to.be.true;
expect(deployUsingSCMStub.getCall(0).calledWith('pix-api-review-pr3', 'my-branch')).to.be.true;
expect(deployUsingSCMStub.getCall(1).calledWith('pix-api-maddo-review-pr3', 'my-branch')).to.be.true;
expect(deployUsingSCMStub.getCall(2).calledWith('pix-audit-logger-review-pr3', 'my-branch')).to.be.true;
expect(deployUsingSCMStub.getCall(3).calledWith('pix-front-review-pr3', 'my-branch')).to.be.true;

expect(response).to.equal(
'Triggered deployment of RA on app pix-api-review, pix-audit-logger-review, pix-front-review with pr 3',
'Triggered deployment of RA on app pix-api-review, pix-api-maddo-review, pix-audit-logger-review, pix-front-review with pr 3',
);
});
});
Expand Down Expand Up @@ -782,7 +791,7 @@ Les variables d'environnement seront accessibles sur scalingo https://dashboard.

// then
expect(response).to.equal(
'Closed RA for PR 3 : pix-api-review-pr3, pix-audit-logger-review-pr3 (already closed), pix-front-review-pr3.',
'Closed RA for PR 3 : pix-api-review-pr3, pix-api-maddo-review-pr3 (already closed), pix-audit-logger-review-pr3 (already closed), pix-front-review-pr3.',
);
});
});
Expand Down

0 comments on commit 1d85911

Please sign in to comment.