@crazyrabbitltc/railway-mcp
Version:
Railway MCP Server - 146+ tools with 100% Railway API coverage, comprehensive MCP testing framework, and real infrastructure management through AI assistants. Enhanced version with enterprise features, based on original work by Jason Tan.
268 lines (267 loc) • 7.75 kB
JavaScript
export class DeploymentAdvancedRepository {
client;
constructor(client) {
this.client = client;
}
async listDeploymentVersions(serviceId, limit = 20) {
const query = `
query listDeploymentVersions($serviceId: String!, $limit: Int!) {
service(id: $serviceId) {
deploymentVersions(first: $limit, orderBy: { createdAt: DESC }) {
edges {
node {
id
serviceId
deploymentId
version
gitSha
gitBranch
buildId
status
environment
buildTime
deployTime
createdAt
activatedAt
deactivatedAt
}
}
}
}
}
`;
const response = await this.client.request(query, { serviceId, limit });
return response.service.deploymentVersions.edges.map(edge => edge.node);
}
async createRollback(serviceId, toVersionId, reason, strategy) {
const query = `
mutation createRollback($serviceId: String!, $toVersionId: String!, $reason: String!, $strategy: RollbackStrategy!) {
rollbackCreate(serviceId: $serviceId, toVersionId: $toVersionId, reason: $reason, strategy: $strategy) {
id
serviceId
fromVersionId
toVersionId
status
reason
triggeredBy
rollbackStrategy
progress
createdAt
}
}
`;
const response = await this.client.request(query, {
serviceId, toVersionId, reason, strategy
});
return response.rollbackCreate;
}
async getRollbackStatus(rollbackId) {
const query = `
query getRollbackStatus($rollbackId: String!) {
rollback(id: $rollbackId) {
id
serviceId
fromVersionId
toVersionId
status
reason
triggeredBy
rollbackStrategy
progress
createdAt
completedAt
errorMessage
}
}
`;
const response = await this.client.request(query, { rollbackId });
return response.rollback;
}
async listRollbacks(serviceId) {
const query = `
query listRollbacks($serviceId: String!) {
service(id: $serviceId) {
rollbacks {
edges {
node {
id
serviceId
fromVersionId
toVersionId
status
reason
triggeredBy
rollbackStrategy
progress
createdAt
completedAt
errorMessage
}
}
}
}
}
`;
const response = await this.client.request(query, { serviceId });
return response.service.rollbacks.edges.map(edge => edge.node);
}
async listBuildJobs(serviceId, limit = 20) {
const query = `
query listBuildJobs($serviceId: String!, $limit: Int!) {
service(id: $serviceId) {
buildJobs(first: $limit, orderBy: { createdAt: DESC }) {
edges {
node {
id
serviceId
status
gitSha
gitBranch
buildConfig {
buildCommand
dockerfilePath
buildArgs
cacheEnabled
}
buildTime
queueTime
logs
artifacts {
type
path
size
}
createdAt
startedAt
completedAt
}
}
}
}
}
`;
const response = await this.client.request(query, { serviceId, limit });
return response.service.buildJobs.edges.map(edge => edge.node);
}
async triggerBuild(serviceId, gitSha, buildConfig) {
const query = `
mutation triggerBuild($serviceId: String!, $gitSha: String, $buildConfig: BuildConfigInput) {
buildTrigger(serviceId: $serviceId, gitSha: $gitSha, buildConfig: $buildConfig) {
id
serviceId
status
gitSha
gitBranch
buildConfig {
buildCommand
dockerfilePath
buildArgs
cacheEnabled
}
queueTime
createdAt
}
}
`;
const response = await this.client.request(query, {
serviceId, gitSha, buildConfig
});
return response.buildTrigger;
}
async cancelBuild(buildId) {
const query = `
mutation cancelBuild($buildId: String!) {
buildCancel(id: $buildId)
}
`;
const response = await this.client.request(query, { buildId });
return response.buildCancel;
}
async getBuildLogs(buildId, lines) {
const query = `
query getBuildLogs($buildId: String!, $lines: Int) {
buildJob(id: $buildId) {
logs(lines: $lines)
}
}
`;
const response = await this.client.request(query, { buildId, lines });
return response.buildJob.logs;
}
async createCanaryDeployment(serviceId, newVersionId, trafficSplit, rules) {
const query = `
mutation createCanaryDeployment($serviceId: String!, $newVersionId: String!, $trafficSplit: Int!, $rules: [CanaryRuleInput!]!) {
canaryDeploymentCreate(serviceId: $serviceId, newVersionId: $newVersionId, trafficSplit: $trafficSplit, rules: $rules) {
id
serviceId
newVersionId
currentVersionId
trafficSplit
status
metrics {
errorRate
responseTime
throughput
}
rules {
metric
threshold
action
}
createdAt
}
}
`;
const response = await this.client.request(query, {
serviceId, newVersionId, trafficSplit, rules
});
return response.canaryDeploymentCreate;
}
async promoteCanaryDeployment(canaryId) {
const query = `
mutation promoteCanaryDeployment($canaryId: String!) {
canaryDeploymentPromote(id: $canaryId) {
id
status
promotedAt
}
}
`;
const response = await this.client.request(query, { canaryId });
return response.canaryDeploymentPromote;
}
async createBlueGreenDeployment(serviceId, newVersionId) {
const query = `
mutation createBlueGreenDeployment($serviceId: String!, $newVersionId: String!) {
blueGreenDeploymentCreate(serviceId: $serviceId, newVersionId: $newVersionId) {
id
serviceId
blueVersionId
greenVersionId
activeSlot
status
createdAt
}
}
`;
const response = await this.client.request(query, {
serviceId, newVersionId
});
return response.blueGreenDeploymentCreate;
}
async switchBlueGreenDeployment(blueGreenId) {
const query = `
mutation switchBlueGreenDeployment($blueGreenId: String!) {
blueGreenDeploymentSwitch(id: $blueGreenId) {
id
activeSlot
status
switchTime
completedAt
}
}
`;
const response = await this.client.request(query, { blueGreenId });
return response.blueGreenDeploymentSwitch;
}
}