-
Notifications
You must be signed in to change notification settings - Fork 20
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
638 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
<!-- Thank you for submitting a PR to Zowe! To help us understand, test, and give feedback on your code, please fill in the details below. --> | ||
|
||
## Proposed changes | ||
<!-- Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request. If it fixes a bug or resolves a feature request, be sure to link to that issue. --> | ||
|
||
This PR addresses Issue: [*Link to Github issue within https://github.com/zowe/zlux/issues* if any] | ||
|
||
This PR depends upon the following PRs: | ||
|
||
## Type of change | ||
Please delete options that are not relevant. | ||
- [ ] Bug fix (non-breaking change which fixes an issue) | ||
- [ ] New feature (non-breaking change which adds functionality) | ||
- [ ] Change in a documentation | ||
- [ ] Refactor the code | ||
- [ ] Chore, repository cleanup, updates the dependencies. | ||
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) | ||
|
||
## PR Checklist | ||
Please delete options that are not relevant. | ||
- [ ] If the changes in this PR are meant for the next release / mainline, this PR targets the "staging" branch. | ||
- [ ] My code follows the style guidelines of this project (see: [Contributing guideline](https://github.com/zowe/zlux/blob/master/CONTRIBUTING.md)) | ||
- [ ] I have commented my code, particularly in hard-to-understand areas | ||
- [ ] I have made corresponding changes to the documentation | ||
- [ ] New and existing unit tests pass locally with my changes | ||
- [ ] video or image is included if visual changes are made | ||
- [ ] Relevant update to CHANGELOG.md | ||
- [ ] My changes generate no new warnings | ||
- [ ] I have added tests that prove my fix is effective or that my feature works, or describe a test method below | ||
|
||
## Testing | ||
<!-- Describe how this code should be tested. I've you've added an automated or unit test, then describe how to run it. Otherwise, describe how you have tested it and how others should test it. --> | ||
|
||
## Further comments | ||
<!-- If this is a relatively large or complex change, kick off the discussion by explaining why you chose the solution you did and what alternatives you considered, or if there are follow-up tasks and TODOs etc... --> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,361 @@ | ||
#!groovy | ||
|
||
/** | ||
* This program and the accompanying materials are | ||
* made available under the terms of the Eclipse Public License v2.0 which accompanies | ||
* this distribution, and is available at https://www.eclipse.org/legal/epl-v20.html | ||
* | ||
* SPDX-License-Identifier: EPL-2.0 | ||
* | ||
* Copyright Contributors to the Zowe Project. | ||
*/ | ||
|
||
/* | ||
* zluxParameters is a map with key and value, if the value is empty it will automatically use staging for the key. | ||
* To build a specific pull request just add the pull request number to the value of the repository you want to build. | ||
*/ | ||
|
||
def zluxParameters = [ | ||
"PR_ZLUX_APP_MANAGER" : "", | ||
"PR_ZLUX_APP_SERVER" : "", | ||
"PR_ZLUX_PLATFORM" : "", | ||
"PR_ZLUX_SERVER_FRAMEWORK" : "", | ||
"PR_ZLUX_SHARED" : "", | ||
"PR_ZLUX_BUILD" : "" | ||
] | ||
|
||
properties([ | ||
parameters(zluxParameters) | ||
]) | ||
|
||
|
||
import org.jenkinsci.plugins.workflow.steps.FlowInterruptedException | ||
|
||
|
||
JENKINS_NODE = "zlux-agent" | ||
GITHUB_PROJECT = "zowe" | ||
GITHUB_TOKEN = "zowe-robot-github" | ||
GITHUB_SSH_KEY = "zlux-jenkins" | ||
|
||
ZLUX_CORE_PLUGINS = [ | ||
"zlux-app-manager", | ||
"zlux-app-server", | ||
"zlux-build", | ||
"zlux-platform", | ||
"zlux-server-framework", | ||
"zlux-shared" | ||
] | ||
DEFAULT_BRANCH = "staging" | ||
ZOWE_MANIFEST_URL = \ | ||
"https://raw.githubusercontent.com/zowe/zowe-install-packaging/staging/manifest.json.template" | ||
ARTIFACTORY_SERVER = "zoweArtifactory" | ||
ARTIFACTORY_REPO = "libs-snapshot-local/org/zowe/zlux" | ||
PAX_HOSTNAME = "zzow01.zowe.marist.cloud" | ||
PAX_SSH_PORT = 22 | ||
PAX_CREDENTIALS = "ssh-marist-server-zzow01" | ||
NODE_VERSION = "v12.16.1" | ||
USER_EMAIL = "[email protected]" | ||
USER_NAME = "Zowe Robot" | ||
|
||
NODE_HOME = "/ZOWE/node/node-${NODE_VERSION}-os390-s390x" | ||
NODE_ENV_VARS = "_TAG_REDIR_ERR=txt _TAG_REDIR_IN=txt _TAG_REDIR_OUT=txt __UNTAGGED_READ_MODE=V6" | ||
|
||
def setGithubStatus(authToken, pullRequests, status, description) { | ||
pullRequests.each { | ||
repoName, pullRequest -> | ||
def response = httpRequest \ | ||
authentication: authToken, httpMode: "POST", | ||
url: "https://api.github.com/repos/${GITHUB_PROJECT}/${repoName}/" + | ||
"statuses/${pullRequest['head']['sha']}", | ||
requestBody: \ | ||
""" | ||
{ | ||
"state": "${status}", | ||
"target_url": "${env.RUN_DISPLAY_URL}", | ||
"description": "${description}", | ||
"context": "continuous-integration/jenkins/pr-merge" | ||
} | ||
""" | ||
} | ||
} | ||
|
||
|
||
def getPullRequest(authToken, repoName, prNumber) { | ||
def response = httpRequest \ | ||
authentication: authToken, httpMode: 'GET', | ||
url: "https://api.github.com/repos/${GITHUB_PROJECT}/${repoName}/pulls/${prNumber}", | ||
validResponseContent: 'head' | ||
return readJSON(text: response.content) | ||
} | ||
|
||
|
||
def getZoweVersion() { | ||
def response = httpRequest url: ZOWE_MANIFEST_URL | ||
echo "Zowe manifest template:\n${response.content}" | ||
return (response.content =~ /"version"\s*:\s*"(.*)"/)[0][1] | ||
} | ||
|
||
|
||
def pullRequests = [:] | ||
def zoweVersion = null | ||
def paxPackageDir = "/ZOWE/tmp/~${env.BUILD_TAG}" | ||
def mergedComponent = null | ||
def branchName = "-"+DEFAULT_BRANCH | ||
def zluxbuildpr = null | ||
|
||
node(JENKINS_NODE) { | ||
currentBuild.result = "SUCCESS" | ||
try { | ||
|
||
stage("Prepare") { | ||
zoweVersion = getZoweVersion() | ||
zluxbuildpr = env.BRANCH_NAME | ||
if (zluxbuildpr.startsWith("PR-")){ | ||
pullRequests['zlux-build'] = getPullRequest(GITHUB_TOKEN, 'zlux-build', zluxbuildpr.drop(3)) | ||
} else { | ||
echo "building staging" | ||
} | ||
|
||
zluxParameters.each { | ||
key, value -> | ||
if (key.startsWith("PR_")) { | ||
if (value) { | ||
def repoName = key[3..-1].toLowerCase().replaceAll('_', '-') | ||
pullRequests[repoName] = getPullRequest(GITHUB_TOKEN, repoName, value) | ||
} | ||
|
||
} | ||
} | ||
|
||
setGithubStatus(GITHUB_TOKEN, pullRequests, "pending", "This commit is being built") | ||
|
||
} | ||
sshagent(credentials: [GITHUB_SSH_KEY]) { | ||
stage("Checkout") { | ||
sh \ | ||
""" | ||
mkdir zlux | ||
git config --global user.email ${USER_EMAIL} | ||
git config --global user.name ${USER_NAME} | ||
""" | ||
ZLUX_CORE_PLUGINS.each { | ||
sh \ | ||
""" | ||
cd zlux | ||
git clone https://github.com/zowe/${it}.git | ||
cd ${it} | ||
git checkout ${DEFAULT_BRANCH} | ||
""" | ||
} | ||
pullRequests.each { | ||
repoName, pullRequest -> | ||
sh \ | ||
""" | ||
cd zlux/${repoName} | ||
git fetch origin pull/${pullRequest['number']}/head:pr | ||
git merge pr | ||
""" | ||
} | ||
} | ||
stage("Set version") { | ||
def (majorVersion, minorVersion, microVersion) = zoweVersion.tokenize(".") | ||
sh \ | ||
""" | ||
cd zlux/zlux-build | ||
sed -i -e "s/MAJOR_VERSION=0/MAJOR_VERSION=${majorVersion}/" \\ | ||
-e "s/MINOR_VERSION=8/MINOR_VERSION=${minorVersion}/" \\ | ||
-e "s/REVISION=4/REVISION=${microVersion}/" \\ | ||
version.properties | ||
echo "Set version to:" | ||
cat version.properties | ||
cd ../zlux-app-server | ||
if [ -e "manifest.yaml" ]; then | ||
export commit_hash=\$(git rev-parse --verify HEAD) | ||
export current_timestamp=\$(date +%s%3N) | ||
export zlux_version="${majorVersion}.${minorVersion}.${microVersion}" | ||
sed -i -e "s|{{build\\.branch}}|${BRANCH_NAME}|g" \\ | ||
-e "s|{{build\\.number}}|${BUILD_NUMBER}|g" \\ | ||
-e "s|{{build\\.commitHash}}|\${commit_hash}|g" \\ | ||
-e "s|{{build\\.timestamp}}|\${current_timestamp}|g" \\ | ||
-e "s|{{build\\.version}}|\${zlux_version}|g" \\ | ||
"manifest.yaml" | ||
echo "manifest is:" | ||
cat manifest.yaml | ||
fi | ||
""" | ||
} | ||
stage("Build") { | ||
sh "bash -c 'cd zlux/zlux-build && set -o pipefail && ant testing 2>&1 | grep -vE \"^\\s+\\[exec\\]\\s+0\\% compiling\"'" | ||
} | ||
stage("Test") { | ||
pullRequests.each { | ||
repoName, pullRequest -> | ||
if (repoName != "zlux-app-server") { | ||
sh \ | ||
""" | ||
cd dist | ||
packages=\$(find ./${repoName} -name package.json | { grep -v node_modules || true; }) | ||
for package in \$packages | ||
do | ||
sh -c "cd `dirname \$package` && npm run test --if-present" | ||
done | ||
""" | ||
} | ||
} | ||
setGithubStatus(GITHUB_TOKEN, pullRequests, "success", "This commit looks good") | ||
sh "cd zlux/zlux-build && ant -Dcapstone=../../dist removeSource" | ||
} | ||
stage("Package") { | ||
sh \ | ||
""" | ||
chmod +x dist/zlux-build/*.sh | ||
cd dist | ||
tar cf ../zlux.tar -H ustar * | ||
cd .. | ||
git clone -b feature/tag-script https://github.com/1000TurquoisePogs/zowe-install-packaging.git | ||
""" | ||
withCredentials([usernamePassword( | ||
credentialsId: PAX_CREDENTIALS, | ||
usernameVariable: "PAX_USERNAME", | ||
passwordVariable: "PAX_PASSWORD" | ||
)]) { | ||
def PAX_SERVER = [ | ||
name : PAX_HOSTNAME, | ||
host : PAX_HOSTNAME, | ||
port : PAX_SSH_PORT, | ||
user : PAX_USERNAME, | ||
password : PAX_PASSWORD, | ||
allowAnyHosts: true | ||
] | ||
sshCommand remote: PAX_SERVER, command: \ | ||
"rm -rf ${paxPackageDir} && mkdir -p ${paxPackageDir}" | ||
sshPut remote: PAX_SERVER, from: "zlux.tar", into: "${paxPackageDir}/" | ||
sshPut remote: PAX_SERVER, from: "zowe-install-packaging/scripts/tag-files.sh", into: "${paxPackageDir}/" | ||
sshCommand remote: PAX_SERVER, command: \ | ||
""" | ||
export _BPXK_AUTOCVT=ON && | ||
cd ${paxPackageDir} && | ||
chtag -tc iso8859-1 tag-files.sh && | ||
chmod +x tag-files.sh && | ||
mkdir -p zlux/share && cd zlux && | ||
mkdir bin && cd share && | ||
tar xpoUf ../../zlux.tar && | ||
../../tag-files.sh . && | ||
cd zlux-server-framework && | ||
rm -rf node_modules && | ||
${NODE_ENV_VARS} PATH=${NODE_HOME}/bin:$PATH npm install && | ||
cd .. && | ||
iconv -f iso8859-1 -t 1047 zlux-app-server/defaults/serverConfig/server.json > zlux-app-server/defaults/serverConfig/server.json.1047 && | ||
mv zlux-app-server/defaults/serverConfig/server.json.1047 zlux-app-server/defaults/serverConfig/server.json && | ||
chtag -tc 1047 zlux-app-server/defaults/serverConfig/server.json && | ||
cd zlux-app-server/bin && | ||
cp start.sh configure.sh ../../../bin && | ||
if [ -e "validate.sh" ]; then | ||
cp validate.sh ../../../bin | ||
fi | ||
cd .. | ||
if [ -e "manifest.yaml" ]; then | ||
cp manifest.yaml ../../ | ||
fi | ||
cd ../../ | ||
pax -x os390 -pp -wf ../zlux.pax * | ||
""" | ||
sshGet remote: PAX_SERVER, from: "${paxPackageDir}/zlux.pax", into: "zlux.pax" | ||
if (mergedComponent) { | ||
sshCommand remote: PAX_SERVER, command: \ | ||
""" | ||
cd ${paxPackageDir} && | ||
cd zlux && | ||
pax -x os390 -pp -wf ../${mergedComponent}.pax ${mergedComponent} | ||
""" | ||
sshGet remote: PAX_SERVER, from: "${paxPackageDir}/${mergedComponent}.pax", into: "${mergedComponent}.pax" | ||
} | ||
sshCommand remote: PAX_SERVER, command: "rm -rf ${paxPackageDir}" | ||
} | ||
|
||
} | ||
stage("Deploy") { | ||
def artifactoryServer = Artifactory.server ARTIFACTORY_SERVER | ||
def timestamp = (new Date()).format("yyyyMMdd.HHmmss") | ||
def target = null | ||
if (mergedComponent) { | ||
target = "${ARTIFACTORY_REPO}/${mergedComponent}/" + | ||
"${zoweVersion}${branchName.toUpperCase()}/" + | ||
"${mergedComponent}-${zoweVersion}-${timestamp}" | ||
["tar", "pax"].each { | ||
def uploadSpec = """{"files": [{"pattern": "${mergedComponent}.${it}", "target": "${target}.${it}"}]}""" | ||
def buildInfo = Artifactory.newBuildInfo() | ||
artifactoryServer.upload spec: uploadSpec, buildInfo: buildInfo | ||
artifactoryServer.publishBuildInfo buildInfo | ||
} | ||
} | ||
|
||
target = "${ARTIFACTORY_REPO}/zlux-core/" + | ||
"${zoweVersion}${branchName.toUpperCase()}/" + | ||
"zlux-core-${zoweVersion}-${timestamp}" | ||
["tar", "pax"].each { | ||
def uploadSpec = """{"files": [{"pattern": "zlux.${it}", "target": "${target}.${it}"}]}""" | ||
def buildInfo = Artifactory.newBuildInfo() | ||
artifactoryServer.upload spec: uploadSpec, buildInfo: buildInfo | ||
artifactoryServer.publishBuildInfo buildInfo | ||
} | ||
target = "${ARTIFACTORY_REPO}/${mergedComponent}/" + | ||
"${zoweVersion}${branchName.toUpperCase()}/" + | ||
"${mergedComponent}-${zoweVersion}-${timestamp}" | ||
["tar", "pax"].each { | ||
def uploadSpec = """{"files": [{"pattern": "${mergedComponent}.${it}", "target": "${target}.${it}"}]}""" | ||
def buildInfo = Artifactory.newBuildInfo() | ||
artifactoryServer.upload spec: uploadSpec, buildInfo: buildInfo | ||
artifactoryServer.publishBuildInfo buildInfo | ||
} | ||
} | ||
} | ||
} catch (FlowInterruptedException e) { | ||
setGithubStatus( | ||
GITHUB_TOKEN, pullRequests, "failure", "The build of this commit was aborted" | ||
) | ||
currentBuild.result = "ABORTED" | ||
throw e | ||
} catch (e) { | ||
if (e.getMessage() != 'nothing to build') { | ||
currentBuild.result = "FAILURE" | ||
setGithubStatus(GITHUB_TOKEN, pullRequests, "failure", "This commit cannot be built") | ||
throw e | ||
} | ||
} finally { | ||
stage("Report") { | ||
def prettyParams = "" | ||
if (pullRequests) { | ||
pullRequests.each{ | ||
repoName, pullRequest -> | ||
prettyParams += "<br/> <a href=\"${pullRequest['html_url']}" + | ||
"\">${repoName} PR #${pullRequest["number"]}</a>" | ||
} | ||
} else { | ||
prettyParams = "n/a" | ||
} | ||
emailext \ | ||
subject: """${env.JOB_NAME} [${env.BUILD_NUMBER}]: ${currentBuild.result}""", | ||
attachLog: true, | ||
mimeType: "text/html", | ||
recipientProviders: [ | ||
[$class: "RequesterRecipientProvider"], | ||
[$class: "CulpritsRecipientProvider"], | ||
[$class: "DevelopersRecipientProvider"], | ||
[$class: "UpstreamComitterRecipientProvider"] | ||
], | ||
body: \ | ||
""" | ||
<p><b>${currentBuild.result}</b></p> | ||
<hr/> | ||
<ul> | ||
<li>Duration: ${currentBuild.durationString[0..-14]}</li> | ||
<li>Build link: <a href="${env.RUN_DISPLAY_URL}"> | ||
${env.JOB_NAME} [${env.BUILD_NUMBER}]</a></li> | ||
<li>Pull requests: ${prettyParams}</li> | ||
</ul> | ||
<hr/> | ||
""" | ||
} | ||
} | ||
} |
Oops, something went wrong.