From 21efe121ab4a7c2e9548d8fe256f9d39daf973e8 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 6 Jun 2023 15:59:40 -0500 Subject: [PATCH 001/113] test jenkinsfile --- Jenkinsfile | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..e29aa62 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,38 @@ +pipeline { + agent { + node { + label 'docker-agent-alpine' + } + } + triggers { + pollSCM('H/5 * * * *') // poll the SCM every 5 minutes + } + + stages { + stage('Clone the repo') { + steps { + echo 'Cloning Forked CPSWT-Core..' + sh 'rm -rf cpswt-core' + sh 'git clone https://github.com/justinyeh1995/cpswt-core.git' + } + } + stage('Build') { + steps { + echo 'Building projects..' + sh 'echo "doing test stuff.."' + } + } + stage('Test') { + steps { + echo 'Testing....' + sh 'echo "doing test stuff.."' + } + } + stage('Report') { + steps { + echo 'Report the results through emails....' + sh 'echo "doing test stuff.."' + } + } + } +} From b46c853baf51b6f32b823a6aaf17da91471ec4c6 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 6 Jun 2023 16:14:21 -0500 Subject: [PATCH 002/113] test jenkinsfile --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index e29aa62..96eda04 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,7 +1,7 @@ pipeline { agent { node { - label 'docker-agent-alpine' + label 'docker-agent-latest' } } triggers { From 97b703ea28616ebe54a4c424e1266316fa34dc1f Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 6 Jun 2023 16:17:06 -0500 Subject: [PATCH 003/113] test pipeline --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e843274..97c05cf 100644 --- a/README.md +++ b/README.md @@ -79,3 +79,6 @@ This project contains the Java classes that implement the FederationManager, whi ## cpswt-core/utils This project contains various utility classes used by other projects. + +## jenkins support +Ref: [youtube video](https://www.youtube.com/watch?v=6YZvp2GwT0A&t=457s) From 0a01debef2bf9c5859dc9049d9927022080c477e Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 6 Jun 2023 16:57:53 -0500 Subject: [PATCH 004/113] test pipeline --- Jenkinsfile | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 96eda04..d9d6587 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -4,9 +4,9 @@ pipeline { label 'docker-agent-latest' } } - triggers { - pollSCM('H/5 * * * *') // poll the SCM every 5 minutes - } + //triggers { + // pollSCM('H/5 * * * *') // poll the SCM every 5 minutes + //} stages { stage('Clone the repo') { @@ -34,5 +34,28 @@ pipeline { sh 'echo "doing test stuff.."' } } + options { + //Configure GitHub Webhook SCM polling + scm { + git { + remote { + url 'https://github.com/justinyeh1995/cpswt-core.git' + credentials('github') + } + branch('*/develop') + extensions { + webhook('http://172.18.0.2:8080/github-webhook/') + } + } + } + } + post { + always { + echo 'This will always run' + emailext body: "${DEFAULT_CONTENT}", + recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + subject: "${DEFAULT_SUBJECT}" + } + } } } From 07741b9ab05709467edf81727adb33c1067a1af0 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 6 Jun 2023 17:03:07 -0500 Subject: [PATCH 005/113] test pipeline --- Jenkinsfile | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index d9d6587..6720238 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -34,28 +34,28 @@ pipeline { sh 'echo "doing test stuff.."' } } - options { - //Configure GitHub Webhook SCM polling - scm { - git { - remote { - url 'https://github.com/justinyeh1995/cpswt-core.git' - credentials('github') - } - branch('*/develop') - extensions { - webhook('http://172.18.0.2:8080/github-webhook/') - } - } - } - } - post { - always { - echo 'This will always run' - emailext body: "${DEFAULT_CONTENT}", - recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - subject: "${DEFAULT_SUBJECT}" - } - } } + options { + //Configure GitHub Webhook SCM polling + scm { + git { + remote { + url 'https://github.com/justinyeh1995/cpswt-core.git' + credentials('github') + } + branch('*/develop') + extensions { + webhook('http://172.18.0.2:8080/github-webhook/') + } + } + } + } + post { + always { + echo 'This will always run' + emailext body: "${DEFAULT_CONTENT}", + recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + subject: "${DEFAULT_SUBJECT}" + } +} } From a3b33f4e1ad2d4bddf7069203f06bb9f231c23ac Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 6 Jun 2023 17:04:34 -0500 Subject: [PATCH 006/113] test pipeline --- Jenkinsfile | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6720238..ba55b4c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -35,21 +35,7 @@ pipeline { } } } - options { - //Configure GitHub Webhook SCM polling - scm { - git { - remote { - url 'https://github.com/justinyeh1995/cpswt-core.git' - credentials('github') - } - branch('*/develop') - extensions { - webhook('http://172.18.0.2:8080/github-webhook/') - } - } - } - } + post { always { echo 'This will always run' @@ -57,5 +43,5 @@ pipeline { recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], subject: "${DEFAULT_SUBJECT}" } -} + } } From 5ed49bda76260e058f4f8ba91593df1df9000733 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 6 Jun 2023 17:13:08 -0500 Subject: [PATCH 007/113] test trigger & post action - email --- Jenkinsfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index ba55b4c..de21c62 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -4,9 +4,9 @@ pipeline { label 'docker-agent-latest' } } - //triggers { - // pollSCM('H/5 * * * *') // poll the SCM every 5 minutes - //} + triggers { + pollSCM('H/3 * * * *') // poll the SCM every 5 minutes + } stages { stage('Clone the repo') { From e6c4daf137910834880e01ce89c733a944a7544f Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 6 Jun 2023 17:18:48 -0500 Subject: [PATCH 008/113] test trigger & post action - email --- Jenkinsfile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index de21c62..2477612 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -39,9 +39,12 @@ pipeline { post { always { echo 'This will always run' - emailext body: "${DEFAULT_CONTENT}", - recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - subject: "${DEFAULT_SUBJECT}" + emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}" + //emailext body: "${DEFAULT_CONTENT}", + //recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + //subject: "${DEFAULT_SUBJECT}" } } } From 228c78097278df7cd748789136e3440f8d69ceef Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 6 Jun 2023 17:36:07 -0500 Subject: [PATCH 009/113] test trigger & post action - email --- Jenkinsfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 2477612..562cb5e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -41,7 +41,9 @@ pipeline { echo 'This will always run' emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}" + to: emailextrecipients([[$class: 'DevelopersRecipientProvider'],[$class: 'CulpritsRecipientProvider']]), + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", + attachLog: true //emailext body: "${DEFAULT_CONTENT}", //recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], //subject: "${DEFAULT_SUBJECT}" From 80fe60a53574993868af64b9e46d6a565de0334d Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 6 Jun 2023 17:38:29 -0500 Subject: [PATCH 010/113] test trigger & post action - email --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 562cb5e..1cd87a6 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -41,7 +41,7 @@ pipeline { echo 'This will always run' emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - to: emailextrecipients([[$class: 'DevelopersRecipientProvider'],[$class: 'CulpritsRecipientProvider']]), + to: "justinyeh1995@gmail.com", subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", attachLog: true //emailext body: "${DEFAULT_CONTENT}", From 6efba48659e71d146b111acc8592d983f3bc86bd Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 14:58:27 -0500 Subject: [PATCH 011/113] test email notifications --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 1cd87a6..5e6bf08 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -41,7 +41,7 @@ pipeline { echo 'This will always run' emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - to: "justinyeh1995@gmail.com", + to: "chihtingyeh1995@gmail.com", subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", attachLog: true //emailext body: "${DEFAULT_CONTENT}", From d90df8735af067cd90f951ceae7f9381bdaebe10 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 15:03:46 -0500 Subject: [PATCH 012/113] test email notifications --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5e6bf08..65a7ba9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -41,7 +41,7 @@ pipeline { echo 'This will always run' emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - to: "chihtingyeh1995@gmail.com", + //to: "chihtingyeh1995@gmail.com", subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", attachLog: true //emailext body: "${DEFAULT_CONTENT}", From 6730abba7e6c1a34c296b19d24144f266e295cc8 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 15:10:29 -0500 Subject: [PATCH 013/113] test email notifications --- Jenkinsfile | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 65a7ba9..b594306 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -39,14 +39,13 @@ pipeline { post { always { echo 'This will always run' - emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + mail to: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + //emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + //recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], //to: "chihtingyeh1995@gmail.com", subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", attachLog: true - //emailext body: "${DEFAULT_CONTENT}", - //recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - //subject: "${DEFAULT_SUBJECT}" } } } From 803237d35583b64e6b5459f60c6d8dc06f7f518f Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 15:13:56 -0500 Subject: [PATCH 014/113] test email notifications --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index b594306..0f37ae1 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -39,7 +39,7 @@ pipeline { post { always { echo 'This will always run' - mail to: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + mail to: "justinyeh1995@gmail.com" body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", //emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", //recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], From 94142977296bf1576524e83e6ed9618ffc4762ce Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 15:15:36 -0500 Subject: [PATCH 015/113] test email notifications --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 0f37ae1..c1b81c0 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -39,7 +39,7 @@ pipeline { post { always { echo 'This will always run' - mail to: "justinyeh1995@gmail.com" + mail to: "justinyeh1995@gmail.com", body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", //emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", //recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], From f7a7ef78ed7d50964e16075e4230b5fa3ec07d96 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 15:16:59 -0500 Subject: [PATCH 016/113] test email notifications --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index c1b81c0..6c8b51e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -44,8 +44,8 @@ pipeline { //emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", //recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], //to: "chihtingyeh1995@gmail.com", - subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", - attachLog: true + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}" + //attachLog: true } } } From cee0bfee2f77358ae2b04825983ef7ad5c13d224 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 15:20:51 -0500 Subject: [PATCH 017/113] test email notifications --- Jenkinsfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6c8b51e..f20747b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,7 +5,7 @@ pipeline { } } triggers { - pollSCM('H/3 * * * *') // poll the SCM every 5 minutes + pollSCM('H/1 * * * *') // poll the SCM every 5 minutes } stages { @@ -40,11 +40,13 @@ pipeline { always { echo 'This will always run' mail to: "justinyeh1995@gmail.com", - body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + body: "Test", + subject: "Test" + //body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", //emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", //recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], //to: "chihtingyeh1995@gmail.com", - subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}" + //subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}" //attachLog: true } } From 9206f8d9a792bb70543f82553fc04b8932c8ef9a Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 15:26:04 -0500 Subject: [PATCH 018/113] test email notifications --- Jenkinsfile | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index f20747b..df9b209 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -39,15 +39,12 @@ pipeline { post { always { echo 'This will always run' - mail to: "justinyeh1995@gmail.com", - body: "Test", - subject: "Test" + //mail to: "justinyeh1995@gmail.com", //body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - //emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - //recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - //to: "chihtingyeh1995@gmail.com", - //subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}" - //attachLog: true + emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}" + attachLog: true } } } From 82eb6f09cb5550482dd088a4eb633e67f846a57d Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 15:28:00 -0500 Subject: [PATCH 019/113] test email notifications --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index df9b209..2f25729 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -43,7 +43,7 @@ pipeline { //body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}" + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", attachLog: true } } From 7b563b8742ce4952b32f4a2ed65515f20d626355 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 15:30:34 -0500 Subject: [PATCH 020/113] test email notifications --- Jenkinsfile | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 2f25729..8a505d7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -39,12 +39,13 @@ pipeline { post { always { echo 'This will always run' - //mail to: "justinyeh1995@gmail.com", - //body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", - attachLog: true + mail to: "justinyeh1995@gmail.com", + body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}" + //emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + //recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + //subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", + //attachLog: true } } } From 6bf574b81e4249e31cfb78cb5fc92b70a9fe3020 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 15:37:32 -0500 Subject: [PATCH 021/113] test email notifications --- Jenkinsfile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 8a505d7..c5e8788 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,9 +1,10 @@ pipeline { - agent { - node { - label 'docker-agent-latest' - } - } + agent any + //agent { + // node { + // label 'docker-agent-latest' + // } + //} triggers { pollSCM('H/1 * * * *') // poll the SCM every 5 minutes } From 21e727ffcd088d20116b04d34228d63902a7d2f2 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 15:39:55 -0500 Subject: [PATCH 022/113] test email notifications --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index c5e8788..c2ab068 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -40,7 +40,7 @@ pipeline { post { always { echo 'This will always run' - mail to: "justinyeh1995@gmail.com", + mail to: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}" //emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", From 2708d7bf7a0f94d43a476e6f5ca2998675914da5 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 15:44:42 -0500 Subject: [PATCH 023/113] test email notifications --- Jenkinsfile | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index c2ab068..0a4296c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -40,13 +40,13 @@ pipeline { post { always { echo 'This will always run' - mail to: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}" - //emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - //recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - //subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", - //attachLog: true + //mail to: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + //body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + //subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}" + emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", + attachLog: true } } } From a7c6fcacb87caf2a7dbc16039609379867e32f79 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 16:28:19 -0500 Subject: [PATCH 024/113] test email notifications --- Jenkinsfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 0a4296c..f5a2850 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -40,9 +40,6 @@ pipeline { post { always { echo 'This will always run' - //mail to: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - //body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - //subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}" emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", From 4960bee4b5f0c6e8ba1af05b1e1230aae0721a90 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 16:57:03 -0500 Subject: [PATCH 025/113] on to the build stage --- Jenkinsfile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index f5a2850..8feb653 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -18,9 +18,14 @@ pipeline { } } stage('Build') { + //agent { + // node { + // label 'docker-agent-latest'// should be able to support the environment for the docker container in this stage + // } + //} steps { echo 'Building projects..' - sh 'echo "doing test stuff.."' + sh 'echo "Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server.."' } } stage('Test') { From f11b40c8a6ea1462fbdbfd18f0411c25531766ec Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 7 Jun 2023 17:00:45 -0500 Subject: [PATCH 026/113] pollSCM time change --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 8feb653..476b7a1 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -6,7 +6,7 @@ pipeline { // } //} triggers { - pollSCM('H/1 * * * *') // poll the SCM every 5 minutes + pollSCM('*/1 * * * *') // poll the SCM every 5 minutes } stages { From 068b81694b29eab49d00b8134f70878fa87a16d7 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 8 Jun 2023 14:34:15 -0500 Subject: [PATCH 027/113] add deckerfile template --- Dockerfile | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..07f4027 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,6 @@ +FROM ubuntu:20.04 + +# Update the package lists and install any updates +RUN apt-get update && apt-get upgrade -y + +# Install the required packages From d78e0037208cb9344f75d52b9ebc2c03fa4ad79d Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 8 Jun 2023 15:36:36 -0500 Subject: [PATCH 028/113] extend dockerfile --- Dockerfile | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 07f4027..97ad856 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,56 @@ FROM ubuntu:20.04 -# Update the package lists and install any updates -RUN apt-get update && apt-get upgrade -y +# Install necessary packages +RUN apt-get update && apt-get install -y \ + apt-transport-https bison build-essential ca-certificates clang curl \ + doxygen flex gcc gdb git gradle graphviz libboost1.71-all-dev \ + libcppunit-dev libjsoncpp-dev libosgearth-dev libqt5opengl5-dev \ + libwebkit2gtk-4.0-37 libxml2-dev lld make mongodb mpi-default-dev \ + openjdk-8-jdk openscenegraph-plugin-osgearth perl python2 python3 \ + python3-pip python-is-python2 qt5-qmake qtbase5-dev \ + qtbase5-dev-tools qtchooser software-properties-common wget xterm zlib1g-dev -# Install the required packages +# Install Python packages +RUN python3 -m pip install --system --upgrade jinja2 matplotlib numpy \ + pandas posix_ipc scipy seaborn webgme-bindings + +# Set up Java +RUN update-java-alternatives -s java-1.8.0-openjdk-amd64 +ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 + +# Download and extract portico +WORKDIR /home +RUN wget -O portico.tar.gz https://master.dl.sourceforge.net/project/portico/Portico/portico-2.1.0/portico-2.1.0-linux64.tar.gz?viasf=1 && \ + tar xf portico.tar.gz && \ + rm portico.tar.gz +ENV RTI_HOME="/home/portico-2.1.0" + +# Download and set up Apache Archiva +WORKDIR /opt +RUN wget -O archiva.tar.gz https://archive.apache.org/dist/archiva/2.2.5/binaries/apache-archiva-2.2.5-bin.tar.gz && \ + tar xf archiva.tar.gz && \ + rm archiva.tar.gz +COPY archiva.service /etc/systemd/system/ +RUN systemctl enable archiva && \ + systemctl start archiva + +# Set up Gradle +RUN mkdir /home/.gradle +COPY gradle.properties /home/.gradle/ + +# Clone and build CPSWT packages +RUN mkdir /home/cpswt +WORKDIR /home/cpswt +RUN git clone git@github.com:SimIntToolkit/cpswt-core.git && \ + cd cpswt-core/cpswt-core && \ + gradle wrapper --gradle-version=7.3 && \ + ./gradlew :utils:publish && \ + ./gradlew :root:publish && \ + ./gradlew :base-events:publish && \ + ./gradlew :coa:publish && \ + ./gradlew :config:publish && \ + ./gradlew :federate-base:publish && \ + ./gradlew :federation-manager:publish && \ + ./gradlew :fedmanager-host:publish + +CMD ["/bin/bash"] From 0def7608415f99acd0e1ec63fe7787ad28d8a234 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Fri, 9 Jun 2023 17:36:02 -0500 Subject: [PATCH 029/113] need to resolve archiva part --- Dockerfile | 96 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 80 insertions(+), 16 deletions(-) diff --git a/Dockerfile b/Dockerfile index 97ad856..aaefa36 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,62 @@ +# Base image: Ubuntu 20.04 FROM ubuntu:20.04 # Install necessary packages RUN apt-get update && apt-get install -y \ - apt-transport-https bison build-essential ca-certificates clang curl \ - doxygen flex gcc gdb git gradle graphviz libboost1.71-all-dev \ - libcppunit-dev libjsoncpp-dev libosgearth-dev libqt5opengl5-dev \ - libwebkit2gtk-4.0-37 libxml2-dev lld make mongodb mpi-default-dev \ - openjdk-8-jdk openscenegraph-plugin-osgearth perl python2 python3 \ - python3-pip python-is-python2 qt5-qmake qtbase5-dev \ - qtbase5-dev-tools qtchooser software-properties-common wget xterm zlib1g-dev + apt-transport-https \ + bison \ + build-essential \ + ca-certificates \ + clang \ + curl \ + doxygen \ + flex \ + gcc \ + gdb \ + git \ + gradle \ + graphviz \ + libboost1.71-all-dev \ + libcppunit-dev \ + libjsoncpp-dev \ + libosgearth-dev \ + libqt5opengl5-dev \ + libwebkit2gtk-4.0-37 \ + libxml2-dev \ + lld \ + make \ + mongodb \ + mpi-default-dev \ + openjdk-8-jdk \ + openscenegraph-plugin-osgearth \ + perl \ + python2 \ + python3 \ + python3-pip \ + python-is-python2 \ + qt5-qmake \ + qtbase5-dev \ + qtbase5-dev-tools \ + qtchooser \ + software-properties-common \ + wget \ + xterm \ + zlib1g-dev # Install Python packages -RUN python3 -m pip install --system --upgrade jinja2 matplotlib numpy \ - pandas posix_ipc scipy seaborn webgme-bindings +RUN python3 -m pip install --system --upgrade \ + jinja2 \ + matplotlib \ + numpy \ + pandas \ + posix_ipc \ + scipy \ + seaborn \ + webgme-bindings -# Set up Java -RUN update-java-alternatives -s java-1.8.0-openjdk-amd64 -ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 +# Set up Java 8 (do we need this?) +# RUN update-java-alternatives -s java-1.8.0-openjdk-amd64 +# ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 # Download and extract portico WORKDIR /home @@ -25,14 +65,27 @@ RUN wget -O portico.tar.gz https://master.dl.sourceforge.net/project/portico/Por rm portico.tar.gz ENV RTI_HOME="/home/portico-2.1.0" + +# Set environment variables +ENV ARCHIVA_VERSION=2.2.5 \ + ARCHIVA_BASE=/opt/apache-archiva + # Download and set up Apache Archiva +# USER root WORKDIR /opt RUN wget -O archiva.tar.gz https://archive.apache.org/dist/archiva/2.2.5/binaries/apache-archiva-2.2.5-bin.tar.gz && \ tar xf archiva.tar.gz && \ rm archiva.tar.gz -COPY archiva.service /etc/systemd/system/ -RUN systemctl enable archiva && \ - systemctl start archiva + +# Copy Archiva files from the local machine to the container +COPY archiva-files /opt/apache-archiva + +# COPY archiva.service /etc/systemd/system/ +# RUN systemctl enable archiva && \ +# systemctl start archiva + +# Expose the Archiva port +EXPOSE 8080 # Set up Gradle RUN mkdir /home/.gradle @@ -53,4 +106,15 @@ RUN git clone git@github.com:SimIntToolkit/cpswt-core.git && \ ./gradlew :federation-manager:publish && \ ./gradlew :fedmanager-host:publish -CMD ["/bin/bash"] +# CMD ["/bin/bash"] + +#Set the working directory +WORKDIR ${ARCHIVA_BASE} + +# Start Archiva +CMD ["./bin/archiva", "run"] + +WORKDIR /home/cpswt/cpswt-core +RUN ./gradlew + + From ac6bbf0bdea94a7affcfaac3d620e60d09b60ab7 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Mon, 12 Jun 2023 15:54:07 -0500 Subject: [PATCH 030/113] for first build systemd settings --- archiva.service | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 archiva.service diff --git a/archiva.service b/archiva.service new file mode 100644 index 0000000..7eae47a --- /dev/null +++ b/archiva.service @@ -0,0 +1,14 @@ +[Unit] +Description=Archiva Server +Documentation=https://archiva.apache.org/docs/2.2.5/ +After=network.target + +[Service] +Type=forking +PIDFile=/opt/apache-archiva-2.2.5/logs/archiva.pid +WorkingDirectory=/opt/apache-archiva-2.2.5 +ExecStart=/opt/apache-archiva-2.2.5/bin/archiva start +ExecStop=/opt/apache-archiva-2.2.5/bin/archiva stop + +[Install] +WantedBy=multi-user.target From 1231995ca5737828751f06358ef922fafc1c8357 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Mon, 12 Jun 2023 15:54:20 -0500 Subject: [PATCH 031/113] update dockerfile --- Dockerfile | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/Dockerfile b/Dockerfile index aaefa36..f0d272d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -65,11 +65,6 @@ RUN wget -O portico.tar.gz https://master.dl.sourceforge.net/project/portico/Por rm portico.tar.gz ENV RTI_HOME="/home/portico-2.1.0" - -# Set environment variables -ENV ARCHIVA_VERSION=2.2.5 \ - ARCHIVA_BASE=/opt/apache-archiva - # Download and set up Apache Archiva # USER root WORKDIR /opt @@ -77,12 +72,9 @@ RUN wget -O archiva.tar.gz https://archive.apache.org/dist/archiva/2.2.5/binarie tar xf archiva.tar.gz && \ rm archiva.tar.gz -# Copy Archiva files from the local machine to the container -COPY archiva-files /opt/apache-archiva - -# COPY archiva.service /etc/systemd/system/ -# RUN systemctl enable archiva && \ -# systemctl start archiva +COPY archiva.service /etc/systemd/system/ +RUN systemctl enable archiva && \ + systemctl start archiva # Expose the Archiva port EXPOSE 8080 @@ -106,15 +98,7 @@ RUN git clone git@github.com:SimIntToolkit/cpswt-core.git && \ ./gradlew :federation-manager:publish && \ ./gradlew :fedmanager-host:publish -# CMD ["/bin/bash"] - -#Set the working directory -WORKDIR ${ARCHIVA_BASE} - -# Start Archiva -CMD ["./bin/archiva", "run"] - WORKDIR /home/cpswt/cpswt-core RUN ./gradlew - + From 0fdd4ed7794b0b588713eac866608d271ef14b15 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Mon, 12 Jun 2023 16:01:53 -0500 Subject: [PATCH 032/113] for first build gradle settings --- gradle.properties | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 gradle.properties diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..896d22f --- /dev/null +++ b/gradle.properties @@ -0,0 +1,9 @@ +archivaUser=admin +archivaPassword=adminpass123 +archivaHostId=localhost +archivaPort=8080 +version=0.7.0-SNAPSHOT + +org.gradle.console=plain + +omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file From 4ec4995b3b07cd8449787ce1e01ec89c0cd333b6 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Mon, 12 Jun 2023 17:02:51 -0500 Subject: [PATCH 033/113] keep updating dockerfile --- Dockerfile | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index f0d272d..7eab279 100644 --- a/Dockerfile +++ b/Dockerfile @@ -55,8 +55,6 @@ RUN python3 -m pip install --system --upgrade \ webgme-bindings # Set up Java 8 (do we need this?) -# RUN update-java-alternatives -s java-1.8.0-openjdk-amd64 -# ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 # Download and extract portico WORKDIR /home @@ -99,6 +97,13 @@ RUN git clone git@github.com:SimIntToolkit/cpswt-core.git && \ ./gradlew :fedmanager-host:publish WORKDIR /home/cpswt/cpswt-core -RUN ./gradlew +RUN ./gradlew :utils && \ + ./gradlew :root && \ + ./gradlew :base-events && \ + ./gradlew :coa && \ + ./gradlew :config && \ + ./gradlew :federate-base && \ + ./gradlew :federation-manager && \ + ./gradlew :fedmanager-host From 78e8b0353e4ab2f7d46512b4d3d1219463b61d2b Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Mon, 12 Jun 2023 19:34:12 -0500 Subject: [PATCH 034/113] keep updating Dockerfile --- Dockerfile | 60 ++++++++++------------------------------------ build.experient.sh | 12 ++++++++++ 2 files changed, 24 insertions(+), 48 deletions(-) create mode 100644 build.experient.sh diff --git a/Dockerfile b/Dockerfile index 7eab279..e8d7a9a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,47 +1,11 @@ # Base image: Ubuntu 20.04 FROM ubuntu:20.04 +ARG DEBIAN_FRONTEND=noninteractive + # Install necessary packages -RUN apt-get update && apt-get install -y \ - apt-transport-https \ - bison \ - build-essential \ - ca-certificates \ - clang \ - curl \ - doxygen \ - flex \ - gcc \ - gdb \ - git \ - gradle \ - graphviz \ - libboost1.71-all-dev \ - libcppunit-dev \ - libjsoncpp-dev \ - libosgearth-dev \ - libqt5opengl5-dev \ - libwebkit2gtk-4.0-37 \ - libxml2-dev \ - lld \ - make \ - mongodb \ - mpi-default-dev \ - openjdk-8-jdk \ - openscenegraph-plugin-osgearth \ - perl \ - python2 \ - python3 \ - python3-pip \ - python-is-python2 \ - qt5-qmake \ - qtbase5-dev \ - qtbase5-dev-tools \ - qtchooser \ - software-properties-common \ - wget \ - xterm \ - zlib1g-dev +RUN apt-get update +RUN apt-get install -y apt-transport-https bison build-essential ca-certificates clang curl doxygen flex gcc gdb git gradle graphviz libboost1.71-all-dev libcppunit-dev libjsoncpp-dev libosgearth-dev libqt5opengl5-dev libwebkit2gtk-4.0-37 libxml2-dev lld make mongodb mpi-default-dev openjdk-8-jdk openscenegraph-plugin-osgearth perl python2 python3 python3-pip python-is-python2 qt5-qmake qtbase5-dev qtbase5-dev-tools qtchooser software-properties-common wget xterm zlib1g-dev # Install Python packages RUN python3 -m pip install --system --upgrade \ @@ -97,13 +61,13 @@ RUN git clone git@github.com:SimIntToolkit/cpswt-core.git && \ ./gradlew :fedmanager-host:publish WORKDIR /home/cpswt/cpswt-core -RUN ./gradlew :utils && \ - ./gradlew :root && \ - ./gradlew :base-events && \ - ./gradlew :coa && \ - ./gradlew :config && \ - ./gradlew :federate-base && \ - ./gradlew :federation-manager && \ - ./gradlew :fedmanager-host +RUN ./gradlew :utils:build && \ + ./gradlew :root:build && \ + ./gradlew :base-events:build && \ + ./gradlew :coa:build && \ + ./gradlew :config:build && \ + ./gradlew :federate-base:build && \ + ./gradlew :federation-manager:build && \ + ./gradlew :fedmanager-host:build diff --git a/build.experient.sh b/build.experient.sh new file mode 100644 index 0000000..ffe1811 --- /dev/null +++ b/build.experient.sh @@ -0,0 +1,12 @@ +docker run \ + --name cpswt-core \ + --restart=on-failure \ + --detach \ + --network cpswt-core \ + --env DOCKER_HOST=tcp://docker:2376 \ + --env DOCKER_CERT_PATH=/certs/client \ + --env DOCKER_TLS_VERIFY=1 \ + --publish 9090:8080 \ + --volume cpswt-core-data:/var/cpswt-core_home \ + --volume cpswt-core-docker-certs:/certs/client:ro \ + cpswt-core:latest \ No newline at end of file From 02cc2b8018f42e4a8355b701837be893fe880214 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 12:52:39 -0500 Subject: [PATCH 035/113] testing docker containers --- cpswt-core/settings.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cpswt-core/settings.gradle.kts b/cpswt-core/settings.gradle.kts index 525ed79..0af0016 100644 --- a/cpswt-core/settings.gradle.kts +++ b/cpswt-core/settings.gradle.kts @@ -30,9 +30,9 @@ rootProject.name = "cpswt-core" -val archivaHostId: String by settings -val archivaPort: String by settings -val version: String by settings +val archivaHostId: localhost +val archivaPort: 8080 +val version: 0.7.0-SNAPSHOT pluginManagement { repositories { From 366064022bc9685f6691542257698653efd25d48 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 13:00:27 -0500 Subject: [PATCH 036/113] testing docker containers --- cpswt-core/settings.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cpswt-core/settings.gradle.kts b/cpswt-core/settings.gradle.kts index 0af0016..525ed79 100644 --- a/cpswt-core/settings.gradle.kts +++ b/cpswt-core/settings.gradle.kts @@ -30,9 +30,9 @@ rootProject.name = "cpswt-core" -val archivaHostId: localhost -val archivaPort: 8080 -val version: 0.7.0-SNAPSHOT +val archivaHostId: String by settings +val archivaPort: String by settings +val version: String by settings pluginManagement { repositories { From c98b9d0da5db581c846853213f81393b2081457b Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 13:02:31 -0500 Subject: [PATCH 037/113] testing docker containers --- cpswt-core/settings.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpswt-core/settings.gradle.kts b/cpswt-core/settings.gradle.kts index 525ed79..c2ac217 100644 --- a/cpswt-core/settings.gradle.kts +++ b/cpswt-core/settings.gradle.kts @@ -49,8 +49,8 @@ dependencyResolutionManagement { maven { isAllowInsecureProtocol = true - val internalRepoUrl = "http://$archivaHostId:$archivaPort/repository/internal" - val snapshotsRepoUrl = "http://$archivaHostId:$archivaPort/repository/snapshots" + val internalRepoUrl = "http://localhost:8080/repository/internal" + val snapshotsRepoUrl = "http://localhost:8080/repository/snapshots" url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else internalRepoUrl) } } From 9eb3f22518a29a275cda854259a5b671db856c47 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 13:04:38 -0500 Subject: [PATCH 038/113] testing docker containers --- cpswt-core/settings.gradle.kts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cpswt-core/settings.gradle.kts b/cpswt-core/settings.gradle.kts index c2ac217..9c025cd 100644 --- a/cpswt-core/settings.gradle.kts +++ b/cpswt-core/settings.gradle.kts @@ -49,8 +49,11 @@ dependencyResolutionManagement { maven { isAllowInsecureProtocol = true - val internalRepoUrl = "http://localhost:8080/repository/internal" - val snapshotsRepoUrl = "http://localhost:8080/repository/snapshots" + val archivaHostId = "localhost" + val archivaPort = "8080" + val version = "0.7.0-SNAPSHOT" + val internalRepoUrl = "http://$archivaHostId:$archivaPort/repository/internal" + val snapshotsRepoUrl = "http://$archivaHostId:$archivaPort/repository/snapshots" url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else internalRepoUrl) } } From e53a08fde9b4cb35f9772f1a6d652f02ca398913 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 13:19:46 -0500 Subject: [PATCH 039/113] testing docker containers --- cpswt-core/settings.gradle.kts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/cpswt-core/settings.gradle.kts b/cpswt-core/settings.gradle.kts index 9c025cd..bbb3e71 100644 --- a/cpswt-core/settings.gradle.kts +++ b/cpswt-core/settings.gradle.kts @@ -49,12 +49,9 @@ dependencyResolutionManagement { maven { isAllowInsecureProtocol = true - val archivaHostId = "localhost" - val archivaPort = "8080" - val version = "0.7.0-SNAPSHOT" - val internalRepoUrl = "http://$archivaHostId:$archivaPort/repository/internal" - val snapshotsRepoUrl = "http://$archivaHostId:$archivaPort/repository/snapshots" - url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else internalRepoUrl) + val internalRepoUrl = "http://localhost:8080/repository/internal" + val snapshotsRepoUrl = "http://localhost:8080/repository/snapshots" + url = uri(snapshotsRepoUrl) } } } From e0792c42ea8b6c2b5cfa0b8ce0c1223251859c3e Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 13:23:54 -0500 Subject: [PATCH 040/113] testing docker containers --- cpswt-core/settings.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cpswt-core/settings.gradle.kts b/cpswt-core/settings.gradle.kts index bbb3e71..525ed79 100644 --- a/cpswt-core/settings.gradle.kts +++ b/cpswt-core/settings.gradle.kts @@ -49,9 +49,9 @@ dependencyResolutionManagement { maven { isAllowInsecureProtocol = true - val internalRepoUrl = "http://localhost:8080/repository/internal" - val snapshotsRepoUrl = "http://localhost:8080/repository/snapshots" - url = uri(snapshotsRepoUrl) + val internalRepoUrl = "http://$archivaHostId:$archivaPort/repository/internal" + val snapshotsRepoUrl = "http://$archivaHostId:$archivaPort/repository/snapshots" + url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else internalRepoUrl) } } } From 1b820af67591cdb4a240b4200271fb7648f5e685 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 16:09:21 -0500 Subject: [PATCH 041/113] test --- cpswt-core/base-events/build.gradle.kts | 7 +++---- cpswt-core/settings.gradle.kts | 6 +++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/cpswt-core/base-events/build.gradle.kts b/cpswt-core/base-events/build.gradle.kts index 176e11d..9ed20a3 100644 --- a/cpswt-core/base-events/build.gradle.kts +++ b/cpswt-core/base-events/build.gradle.kts @@ -71,10 +71,9 @@ publishing { repositories { maven { name = "base-eventsPublish" - val internalRepoUrl = "http://$archivaHostId:$archivaPort/repository/internal" - val snapshotsRepoUrl = "http://$archivaHostId:$archivaPort/repository/snapshots" - url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else internalRepoUrl) - + val internalRepoUrl = "http://localhost:8080/repository/internal" + val snapshotsRepoUrl = "http://localhost:8080/repository/snapshots" + url = uri(snapshotsRepoUrl) logger.info("URL = \"$url\"") isAllowInsecureProtocol = true authentication { diff --git a/cpswt-core/settings.gradle.kts b/cpswt-core/settings.gradle.kts index 525ed79..bbb3e71 100644 --- a/cpswt-core/settings.gradle.kts +++ b/cpswt-core/settings.gradle.kts @@ -49,9 +49,9 @@ dependencyResolutionManagement { maven { isAllowInsecureProtocol = true - val internalRepoUrl = "http://$archivaHostId:$archivaPort/repository/internal" - val snapshotsRepoUrl = "http://$archivaHostId:$archivaPort/repository/snapshots" - url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else internalRepoUrl) + val internalRepoUrl = "http://localhost:8080/repository/internal" + val snapshotsRepoUrl = "http://localhost:8080/repository/snapshots" + url = uri(snapshotsRepoUrl) } } } From 2d19cd2d3e35506afd581c93c7f81c8f56536627 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 16:11:23 -0500 Subject: [PATCH 042/113] test --- cpswt-core/base-events/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpswt-core/base-events/build.gradle.kts b/cpswt-core/base-events/build.gradle.kts index 9ed20a3..089c198 100644 --- a/cpswt-core/base-events/build.gradle.kts +++ b/cpswt-core/base-events/build.gradle.kts @@ -80,8 +80,8 @@ publishing { create("basic") } credentials { - username = archivaUser - password = archivaPassword + username = admin + password = adminpass123 } } } From bb719f1dbe478bf53f62228ba3d0e99244e152d2 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 16:13:26 -0500 Subject: [PATCH 043/113] test --- cpswt-core/base-events/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpswt-core/base-events/build.gradle.kts b/cpswt-core/base-events/build.gradle.kts index 089c198..ae89cb3 100644 --- a/cpswt-core/base-events/build.gradle.kts +++ b/cpswt-core/base-events/build.gradle.kts @@ -80,8 +80,8 @@ publishing { create("basic") } credentials { - username = admin - password = adminpass123 + username = "admin" + password = "adminpass123" } } } From 36d419dc59be28ec9e338af2b1e30c5c03808d73 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 16:24:42 -0500 Subject: [PATCH 044/113] testing --- cpswt-core/coa/build.gradle.kts | 10 +++++----- cpswt-core/config/build.gradle.kts | 12 ++++++------ cpswt-core/federate-base/gradle.properties | 9 +++++++++ cpswt-core/federation-manager/gradle.properties | 9 +++++++++ cpswt-core/fedmanager-host/gradle.properties | 9 +++++++++ 5 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 cpswt-core/federation-manager/gradle.properties create mode 100644 cpswt-core/fedmanager-host/gradle.properties diff --git a/cpswt-core/coa/build.gradle.kts b/cpswt-core/coa/build.gradle.kts index 3193f4e..d470cd9 100644 --- a/cpswt-core/coa/build.gradle.kts +++ b/cpswt-core/coa/build.gradle.kts @@ -72,9 +72,9 @@ publishing { repositories { maven { name = "coaPublish" - val internalRepoUrl = "http://$archivaHostId:$archivaPort/repository/internal" - val snapshotsRepoUrl = "http://$archivaHostId:$archivaPort/repository/snapshots" - url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else internalRepoUrl) + val internalRepoUrl = "http://localhost:8080/repository/internal" + val snapshotsRepoUrl = "http://localhost:8080/repository/snapshots" + url = uri(snapshotsRepoUrl) logger.info("URL = \"$url\"") isAllowInsecureProtocol = true @@ -82,8 +82,8 @@ publishing { create("basic") } credentials { - username = archivaUser - password = archivaPassword + username = "admin" + password = "adminpass123" } } } diff --git a/cpswt-core/config/build.gradle.kts b/cpswt-core/config/build.gradle.kts index f5a701f..3c609dc 100644 --- a/cpswt-core/config/build.gradle.kts +++ b/cpswt-core/config/build.gradle.kts @@ -67,18 +67,18 @@ publishing { repositories { maven { name = "configPublish" - val internalRepoUrl = "http://$archivaHostId:$archivaPort/repository/internal" - val snapshotsRepoUrl = "http://$archivaHostId:$archivaPort/repository/snapshots" - url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else internalRepoUrl) - + val internalRepoUrl = "http://localhost:8080/repository/internal" + val snapshotsRepoUrl = "http://localhost:8080/repository/snapshots" + url = uri(snapshotsRepoUrl) + logger.info("URL = \"$url\"") isAllowInsecureProtocol = true authentication { create("basic") } credentials { - username = archivaUser - password = archivaPassword + username = "admin" + password = "adminpass123" } } } diff --git a/cpswt-core/federate-base/gradle.properties b/cpswt-core/federate-base/gradle.properties index e69de29..896d22f 100644 --- a/cpswt-core/federate-base/gradle.properties +++ b/cpswt-core/federate-base/gradle.properties @@ -0,0 +1,9 @@ +archivaUser=admin +archivaPassword=adminpass123 +archivaHostId=localhost +archivaPort=8080 +version=0.7.0-SNAPSHOT + +org.gradle.console=plain + +omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file diff --git a/cpswt-core/federation-manager/gradle.properties b/cpswt-core/federation-manager/gradle.properties new file mode 100644 index 0000000..896d22f --- /dev/null +++ b/cpswt-core/federation-manager/gradle.properties @@ -0,0 +1,9 @@ +archivaUser=admin +archivaPassword=adminpass123 +archivaHostId=localhost +archivaPort=8080 +version=0.7.0-SNAPSHOT + +org.gradle.console=plain + +omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file diff --git a/cpswt-core/fedmanager-host/gradle.properties b/cpswt-core/fedmanager-host/gradle.properties new file mode 100644 index 0000000..896d22f --- /dev/null +++ b/cpswt-core/fedmanager-host/gradle.properties @@ -0,0 +1,9 @@ +archivaUser=admin +archivaPassword=adminpass123 +archivaHostId=localhost +archivaPort=8080 +version=0.7.0-SNAPSHOT + +org.gradle.console=plain + +omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file From 23bd08dfd2d33c9d9ea2c856a574b7e8b91c5889 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 16:27:41 -0500 Subject: [PATCH 045/113] testing --- cpswt-core/coa/gradle.properties | 1 + cpswt-core/config/gradle.properties | 1 + cpswt-core/root/gradle.properties | 1 + cpswt-core/utils/gradle.properties | 1 + 4 files changed, 4 insertions(+) create mode 100644 cpswt-core/coa/gradle.properties create mode 100644 cpswt-core/config/gradle.properties create mode 100644 cpswt-core/root/gradle.properties create mode 100644 cpswt-core/utils/gradle.properties diff --git a/cpswt-core/coa/gradle.properties b/cpswt-core/coa/gradle.properties new file mode 100644 index 0000000..65a82a4 --- /dev/null +++ b/cpswt-core/coa/gradle.properties @@ -0,0 +1 @@ +version=0.8.0-SNAPSHOT diff --git a/cpswt-core/config/gradle.properties b/cpswt-core/config/gradle.properties new file mode 100644 index 0000000..65a82a4 --- /dev/null +++ b/cpswt-core/config/gradle.properties @@ -0,0 +1 @@ +version=0.8.0-SNAPSHOT diff --git a/cpswt-core/root/gradle.properties b/cpswt-core/root/gradle.properties new file mode 100644 index 0000000..65a82a4 --- /dev/null +++ b/cpswt-core/root/gradle.properties @@ -0,0 +1 @@ +version=0.8.0-SNAPSHOT diff --git a/cpswt-core/utils/gradle.properties b/cpswt-core/utils/gradle.properties new file mode 100644 index 0000000..65a82a4 --- /dev/null +++ b/cpswt-core/utils/gradle.properties @@ -0,0 +1 @@ +version=0.8.0-SNAPSHOT From 6899be5dfaf805ffede93dd94ea3eae10e2a9961 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 16:43:56 -0500 Subject: [PATCH 046/113] testing --- cpswt-core/root/gradle.properties | 10 +++++++++- cpswt-core/utils/gradle.properties | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/cpswt-core/root/gradle.properties b/cpswt-core/root/gradle.properties index 65a82a4..896d22f 100644 --- a/cpswt-core/root/gradle.properties +++ b/cpswt-core/root/gradle.properties @@ -1 +1,9 @@ -version=0.8.0-SNAPSHOT +archivaUser=admin +archivaPassword=adminpass123 +archivaHostId=localhost +archivaPort=8080 +version=0.7.0-SNAPSHOT + +org.gradle.console=plain + +omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file diff --git a/cpswt-core/utils/gradle.properties b/cpswt-core/utils/gradle.properties index 65a82a4..7159e7b 100644 --- a/cpswt-core/utils/gradle.properties +++ b/cpswt-core/utils/gradle.properties @@ -1 +1,9 @@ -version=0.8.0-SNAPSHOT +archivaUser=admin +archivaPassword=adminpass123 +archivaHostId=localhost +archivaPort=8080 +version=0.7.0-SNAPSHOT + +org.gradle.console=plain + +omnetppHome=/opt/omnetpp-5.6.2 From 924449171da6d7bb77df10c7e2d4376f790ca1b4 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 16:46:12 -0500 Subject: [PATCH 047/113] testing --- cpswt-core/base-events/build.gradle.kts | 11 ++++++----- cpswt-core/coa/build.gradle.kts | 10 +++++----- cpswt-core/config/gradle.properties | 10 +++++++++- cpswt-core/settings.gradle.kts | 6 +++--- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/cpswt-core/base-events/build.gradle.kts b/cpswt-core/base-events/build.gradle.kts index ae89cb3..176e11d 100644 --- a/cpswt-core/base-events/build.gradle.kts +++ b/cpswt-core/base-events/build.gradle.kts @@ -71,17 +71,18 @@ publishing { repositories { maven { name = "base-eventsPublish" - val internalRepoUrl = "http://localhost:8080/repository/internal" - val snapshotsRepoUrl = "http://localhost:8080/repository/snapshots" - url = uri(snapshotsRepoUrl) + val internalRepoUrl = "http://$archivaHostId:$archivaPort/repository/internal" + val snapshotsRepoUrl = "http://$archivaHostId:$archivaPort/repository/snapshots" + url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else internalRepoUrl) + logger.info("URL = \"$url\"") isAllowInsecureProtocol = true authentication { create("basic") } credentials { - username = "admin" - password = "adminpass123" + username = archivaUser + password = archivaPassword } } } diff --git a/cpswt-core/coa/build.gradle.kts b/cpswt-core/coa/build.gradle.kts index d470cd9..3193f4e 100644 --- a/cpswt-core/coa/build.gradle.kts +++ b/cpswt-core/coa/build.gradle.kts @@ -72,9 +72,9 @@ publishing { repositories { maven { name = "coaPublish" - val internalRepoUrl = "http://localhost:8080/repository/internal" - val snapshotsRepoUrl = "http://localhost:8080/repository/snapshots" - url = uri(snapshotsRepoUrl) + val internalRepoUrl = "http://$archivaHostId:$archivaPort/repository/internal" + val snapshotsRepoUrl = "http://$archivaHostId:$archivaPort/repository/snapshots" + url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else internalRepoUrl) logger.info("URL = \"$url\"") isAllowInsecureProtocol = true @@ -82,8 +82,8 @@ publishing { create("basic") } credentials { - username = "admin" - password = "adminpass123" + username = archivaUser + password = archivaPassword } } } diff --git a/cpswt-core/config/gradle.properties b/cpswt-core/config/gradle.properties index 65a82a4..896d22f 100644 --- a/cpswt-core/config/gradle.properties +++ b/cpswt-core/config/gradle.properties @@ -1 +1,9 @@ -version=0.8.0-SNAPSHOT +archivaUser=admin +archivaPassword=adminpass123 +archivaHostId=localhost +archivaPort=8080 +version=0.7.0-SNAPSHOT + +org.gradle.console=plain + +omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file diff --git a/cpswt-core/settings.gradle.kts b/cpswt-core/settings.gradle.kts index bbb3e71..525ed79 100644 --- a/cpswt-core/settings.gradle.kts +++ b/cpswt-core/settings.gradle.kts @@ -49,9 +49,9 @@ dependencyResolutionManagement { maven { isAllowInsecureProtocol = true - val internalRepoUrl = "http://localhost:8080/repository/internal" - val snapshotsRepoUrl = "http://localhost:8080/repository/snapshots" - url = uri(snapshotsRepoUrl) + val internalRepoUrl = "http://$archivaHostId:$archivaPort/repository/internal" + val snapshotsRepoUrl = "http://$archivaHostId:$archivaPort/repository/snapshots" + url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else internalRepoUrl) } } } From 2bc75c6460feb7871021166024654f37280d8241 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 16:48:19 -0500 Subject: [PATCH 048/113] testing --- cpswt-core/gradle.properties | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cpswt-core/gradle.properties b/cpswt-core/gradle.properties index 65a82a4..7159e7b 100644 --- a/cpswt-core/gradle.properties +++ b/cpswt-core/gradle.properties @@ -1 +1,9 @@ -version=0.8.0-SNAPSHOT +archivaUser=admin +archivaPassword=adminpass123 +archivaHostId=localhost +archivaPort=8080 +version=0.7.0-SNAPSHOT + +org.gradle.console=plain + +omnetppHome=/opt/omnetpp-5.6.2 From f80d263c3d678e4bfd3c171ba19efb5570b8e120 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 18:13:19 -0500 Subject: [PATCH 049/113] archiva accessible through localhost:8081 on host machine but service 503 --- Dockerfile | 91 +++++++++++++++++++++++++++---------------- build.experient.sh | 8 ++-- experiment_wrapper.sh | 26 +++++++++++++ 3 files changed, 88 insertions(+), 37 deletions(-) create mode 100644 experiment_wrapper.sh diff --git a/Dockerfile b/Dockerfile index e8d7a9a..85f2aa9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,53 @@ # Base image: Ubuntu 20.04 FROM ubuntu:20.04 +LABEL maintainer="CPSWT Team" +# Set it to noninteractive mode ARG DEBIAN_FRONTEND=noninteractive # Install necessary packages -RUN apt-get update -RUN apt-get install -y apt-transport-https bison build-essential ca-certificates clang curl doxygen flex gcc gdb git gradle graphviz libboost1.71-all-dev libcppunit-dev libjsoncpp-dev libosgearth-dev libqt5opengl5-dev libwebkit2gtk-4.0-37 libxml2-dev lld make mongodb mpi-default-dev openjdk-8-jdk openscenegraph-plugin-osgearth perl python2 python3 python3-pip python-is-python2 qt5-qmake qtbase5-dev qtbase5-dev-tools qtchooser software-properties-common wget xterm zlib1g-dev +RUN apt-get update && \ + apt-get install -y \ + apt-transport-https \ + bison \ + build-essential \ + ca-certificates \ + clang \ + curl \ + doxygen \ + flex \ + gcc \ + gdb \ + git \ + gradle \ + graphviz \ + libboost1.71-all-dev \ + libcppunit-dev \ + libjsoncpp-dev \ + libosgearth-dev \ + libqt5opengl5-dev \ + libwebkit2gtk-4.0-37 \ + libxml2-dev \ + lld \ + make \ + mongodb \ + mpi-default-dev \ + openjdk-8-jdk \ + openscenegraph-plugin-osgearth \ + perl \ + python2 \ + python3 \ + python3-pip \ + python-is-python2 \ + qt5-qmake \ + qtbase5-dev \ + qtbase5-dev-tools \ + qtchooser \ + software-properties-common \ + wget \ + xterm \ + zlib1g-dev \ + supervisor # Install Python packages RUN python3 -m pip install --system --upgrade \ @@ -28,46 +70,29 @@ RUN wget -O portico.tar.gz https://master.dl.sourceforge.net/project/portico/Por ENV RTI_HOME="/home/portico-2.1.0" # Download and set up Apache Archiva -# USER root WORKDIR /opt RUN wget -O archiva.tar.gz https://archive.apache.org/dist/archiva/2.2.5/binaries/apache-archiva-2.2.5-bin.tar.gz && \ tar xf archiva.tar.gz && \ rm archiva.tar.gz - -COPY archiva.service /etc/systemd/system/ -RUN systemctl enable archiva && \ - systemctl start archiva +COPY wrapper-linux-aarch64-64 /opt/apache-archiva-2.2.5/bin/./ +RUN chmod +x /opt/apache-archiva-2.2.5/bin/wrapper-linux-aarch64-64 # Expose the Archiva port -EXPOSE 8080 +EXPOSE 8080/tcp + +# Use SIGINT for stopping +STOPSIGNAL SIGINT # Set up Gradle -RUN mkdir /home/.gradle -COPY gradle.properties /home/.gradle/ +# RUN mkdir /home/gradle/ && \ +# mkdir /home/gradle/.gradle/ +COPY gradle.properties /root/.gradle/gradle.properties -# Clone and build CPSWT packages +# # Clone and build CPSWT packages RUN mkdir /home/cpswt -WORKDIR /home/cpswt -RUN git clone git@github.com:SimIntToolkit/cpswt-core.git && \ - cd cpswt-core/cpswt-core && \ - gradle wrapper --gradle-version=7.3 && \ - ./gradlew :utils:publish && \ - ./gradlew :root:publish && \ - ./gradlew :base-events:publish && \ - ./gradlew :coa:publish && \ - ./gradlew :config:publish && \ - ./gradlew :federate-base:publish && \ - ./gradlew :federation-manager:publish && \ - ./gradlew :fedmanager-host:publish +COPY experiment_wrapper.sh /home/cpswt -WORKDIR /home/cpswt/cpswt-core -RUN ./gradlew :utils:build && \ - ./gradlew :root:build && \ - ./gradlew :base-events:build && \ - ./gradlew :coa:build && \ - ./gradlew :config:build && \ - ./gradlew :federate-base:build && \ - ./gradlew :federation-manager:build && \ - ./gradlew :fedmanager-host:build - +WORKDIR /home/cpswt +# Start Archiva +CMD [ "/usr/bin/bash", "experiment_wrapper.sh" ] diff --git a/build.experient.sh b/build.experient.sh index ffe1811..75c4177 100644 --- a/build.experient.sh +++ b/build.experient.sh @@ -1,12 +1,12 @@ +# docker network create cpswt-core docker run \ --name cpswt-core \ - --restart=on-failure \ + --restart=always \ --detach \ --network cpswt-core \ --env DOCKER_HOST=tcp://docker:2376 \ --env DOCKER_CERT_PATH=/certs/client \ --env DOCKER_TLS_VERIFY=1 \ - --publish 9090:8080 \ - --volume cpswt-core-data:/var/cpswt-core_home \ - --volume cpswt-core-docker-certs:/certs/client:ro \ + --publish 8081:8080 \ + -v /var/run/docker.sock:/var/run/docker.sock \ cpswt-core:latest \ No newline at end of file diff --git a/experiment_wrapper.sh b/experiment_wrapper.sh new file mode 100644 index 0000000..c816e1c --- /dev/null +++ b/experiment_wrapper.sh @@ -0,0 +1,26 @@ +# this script is used to build cpswt-core and its dependencies in the docker container +/opt/apache-archiva-2.2.5/bin/archiva start +cd /home/cpswt +git clone https://github.com/justinyeh1995/cpswt-core.git +cd cpswt-core/cpswt-core + +gradle wrapper --gradle-version=7.3 + +./gradlew :utils:publish +./gradlew :root:publish +./gradlew :base-events:publish +./gradlew :coa:publish +./gradlew :config:publish +./gradlew :federate-base:publish +./gradlew :federation-manager:publish +./gradlew :fedmanager-host:publish + +cd /home/cpswt/cpswt-core +./gradlew :utils:build +./gradlew :root:build +./gradlew :base-events:build +./gradlew :coa:build +./gradlew :config:build +./gradlew :federate-base:build +./gradlew :federation-manager:build +./gradlew :fedmanager-host:build \ No newline at end of file From 662a5519cf9ffb851e7445b7cb71391c3eb5fad4 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 18:14:19 -0500 Subject: [PATCH 050/113] alternative exe file for aarch64 machine to run archiva --- wrapper-linux-aarch64-64 | Bin 0 -> 430680 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 wrapper-linux-aarch64-64 diff --git a/wrapper-linux-aarch64-64 b/wrapper-linux-aarch64-64 new file mode 100644 index 0000000000000000000000000000000000000000..9d6101930e4b4f789b3b222a74209c8a02f4c3a8 GIT binary patch literal 430680 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%0A}g!FY9 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 literal 0 HcmV?d00001 From 2c74c3a86a92d147ff01498b46cb940f202fc5f4 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 18:50:31 -0500 Subject: [PATCH 051/113] always -> on-failure --- build.experient.sh | 2 +- experiment_wrapper.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.experient.sh b/build.experient.sh index 75c4177..d447204 100644 --- a/build.experient.sh +++ b/build.experient.sh @@ -1,7 +1,7 @@ # docker network create cpswt-core docker run \ --name cpswt-core \ - --restart=always \ + --restart=on-failure \ --detach \ --network cpswt-core \ --env DOCKER_HOST=tcp://docker:2376 \ diff --git a/experiment_wrapper.sh b/experiment_wrapper.sh index c816e1c..f85eeb1 100644 --- a/experiment_wrapper.sh +++ b/experiment_wrapper.sh @@ -1,5 +1,5 @@ # this script is used to build cpswt-core and its dependencies in the docker container -/opt/apache-archiva-2.2.5/bin/archiva start +/opt/apache-archiva-2.2.5/bin/archiva console cd /home/cpswt git clone https://github.com/justinyeh1995/cpswt-core.git cd cpswt-core/cpswt-core From fe5a120b30927e09e36fbb4ece30393746551edc Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 18:50:51 -0500 Subject: [PATCH 052/113] it runs now --- experiment_wrapper.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/experiment_wrapper.sh b/experiment_wrapper.sh index f85eeb1..e1ad292 100644 --- a/experiment_wrapper.sh +++ b/experiment_wrapper.sh @@ -1,5 +1,5 @@ # this script is used to build cpswt-core and its dependencies in the docker container -/opt/apache-archiva-2.2.5/bin/archiva console +/opt/apache-archiva-2.2.5/bin/archiva start cd /home/cpswt git clone https://github.com/justinyeh1995/cpswt-core.git cd cpswt-core/cpswt-core @@ -15,7 +15,6 @@ gradle wrapper --gradle-version=7.3 ./gradlew :federation-manager:publish ./gradlew :fedmanager-host:publish -cd /home/cpswt/cpswt-core ./gradlew :utils:build ./gradlew :root:build ./gradlew :base-events:build From dc15c5d25b1b3c3c22b9d9a2ac04a2d9327bdf15 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 18:51:16 -0500 Subject: [PATCH 053/113] the image generate running containers --- Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Dockerfile b/Dockerfile index 85f2aa9..ee715b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -83,6 +83,9 @@ EXPOSE 8080/tcp # Use SIGINT for stopping STOPSIGNAL SIGINT +ENV JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-arm64" +ENV PATH="$JAVA_HOME/bin:$PATH" + # Set up Gradle # RUN mkdir /home/gradle/ && \ # mkdir /home/gradle/.gradle/ From 2b73448b65edd99a58452d844f270bc580c02e05 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 14 Jun 2023 18:52:17 -0500 Subject: [PATCH 054/113] the image generate running containers --- Dockerfile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index ee715b9..7a86346 100644 --- a/Dockerfile +++ b/Dockerfile @@ -60,7 +60,9 @@ RUN python3 -m pip install --system --upgrade \ seaborn \ webgme-bindings -# Set up Java 8 (do we need this?) +# Set up Java 8 (do we need this?) -> YES +ENV JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-arm64" +ENV PATH="$JAVA_HOME/bin:$PATH" # Download and extract portico WORKDIR /home @@ -83,9 +85,6 @@ EXPOSE 8080/tcp # Use SIGINT for stopping STOPSIGNAL SIGINT -ENV JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-arm64" -ENV PATH="$JAVA_HOME/bin:$PATH" - # Set up Gradle # RUN mkdir /home/gradle/ && \ # mkdir /home/gradle/.gradle/ From 7c530ecffc972f5644c1ec857cd07e084c5306a8 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 15 Jun 2023 12:28:34 -0500 Subject: [PATCH 055/113] the image generate running containers --- experiment_wrapper.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/experiment_wrapper.sh b/experiment_wrapper.sh index e1ad292..a13e82e 100644 --- a/experiment_wrapper.sh +++ b/experiment_wrapper.sh @@ -1,5 +1,5 @@ # this script is used to build cpswt-core and its dependencies in the docker container -/opt/apache-archiva-2.2.5/bin/archiva start +/home/testuser/apache-archiva-2.2.5/bin/archiva start cd /home/cpswt git clone https://github.com/justinyeh1995/cpswt-core.git cd cpswt-core/cpswt-core @@ -22,4 +22,8 @@ gradle wrapper --gradle-version=7.3 ./gradlew :config:build ./gradlew :federate-base:build ./gradlew :federation-manager:build -./gradlew :fedmanager-host:build \ No newline at end of file +./gradlew :fedmanager-host:build + +cd /home/cpswt/examples/HelloWorldJava +gradle wrapper --gradle-version=7.4 +./gradlew :runFederation \ No newline at end of file From 4fabe15f1a5182cfccaf9aac3cfdb7edc904b165 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 15 Jun 2023 12:39:48 -0500 Subject: [PATCH 056/113] the image generate running containers --- cpswt-core/coa/gradle.properties | 1 - 1 file changed, 1 deletion(-) delete mode 100644 cpswt-core/coa/gradle.properties diff --git a/cpswt-core/coa/gradle.properties b/cpswt-core/coa/gradle.properties deleted file mode 100644 index 65a82a4..0000000 --- a/cpswt-core/coa/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -version=0.8.0-SNAPSHOT From c37e62afaf61909bf9efde20ba5201cf587ade0a Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Fri, 16 Jun 2023 17:00:14 -0500 Subject: [PATCH 057/113] updated archiva.xml --- Dockerfile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7a86346..6c4d66c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -46,8 +46,7 @@ RUN apt-get update && \ software-properties-common \ wget \ xterm \ - zlib1g-dev \ - supervisor + zlib1g-dev # Install Python packages RUN python3 -m pip install --system --upgrade \ @@ -77,6 +76,7 @@ RUN wget -O archiva.tar.gz https://archive.apache.org/dist/archiva/2.2.5/binarie tar xf archiva.tar.gz && \ rm archiva.tar.gz COPY wrapper-linux-aarch64-64 /opt/apache-archiva-2.2.5/bin/./ +COPY archiva.xml /opt/apache-archiva-2.2.5/conf/ RUN chmod +x /opt/apache-archiva-2.2.5/bin/wrapper-linux-aarch64-64 # Expose the Archiva port @@ -86,9 +86,10 @@ EXPOSE 8080/tcp STOPSIGNAL SIGINT # Set up Gradle -# RUN mkdir /home/gradle/ && \ -# mkdir /home/gradle/.gradle/ -COPY gradle.properties /root/.gradle/gradle.properties +RUN mkdir /home/testuser/ && \ + mkdir /home/testuser/.gradle/ +ENV HOME="/home/testuser" +COPY gradle.properties ${HOME}/.gradle/gradle.properties # # Clone and build CPSWT packages RUN mkdir /home/cpswt From 781a92318236e03d6e0b6b36cc759e08a9de53f2 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Fri, 16 Jun 2023 17:00:53 -0500 Subject: [PATCH 058/113] build container --- build.experient.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.experient.sh b/build.experient.sh index d447204..b728b9d 100644 --- a/build.experient.sh +++ b/build.experient.sh @@ -1,12 +1,12 @@ # docker network create cpswt-core docker run \ - --name cpswt-core \ + --name cpswt-core2 \ --restart=on-failure \ --detach \ --network cpswt-core \ --env DOCKER_HOST=tcp://docker:2376 \ --env DOCKER_CERT_PATH=/certs/client \ --env DOCKER_TLS_VERIFY=1 \ - --publish 8081:8080 \ + --publish 8082:8080 \ -v /var/run/docker.sock:/var/run/docker.sock \ - cpswt-core:latest \ No newline at end of file + cpswt-core:latest2 \ No newline at end of file From ca18780cfa66e4ae20c6d65549f19f0a1c17f48b Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Fri, 16 Jun 2023 17:01:13 -0500 Subject: [PATCH 059/113] actually experiment script --- experiment_wrapper.sh | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/experiment_wrapper.sh b/experiment_wrapper.sh index a13e82e..b764ed9 100644 --- a/experiment_wrapper.sh +++ b/experiment_wrapper.sh @@ -1,5 +1,23 @@ # this script is used to build cpswt-core and its dependencies in the docker container -/home/testuser/apache-archiva-2.2.5/bin/archiva start +/opt/apache-archiva-2.2.5/bin/archiva start +# localhost=$(hostname -I | awk '{print $1}') +curl --no-progress-meter -X POST -H "Content-Type: application/json" -H "Origin: http://localhost:8080" -d @- \ + http://localhost:8080/restServices/redbackServices/userService/createAdminUser <<'TERMINUS' +{ + "username": "admin", + "password": "adminpass123", + "email": "admin@archiva-test.org", + "fullName": "Admin", + "locked": false, + "passwordChangeRequired": false, + "permanent": false, + "readOnly": false, + "validated": true, + "confirmPassword": "adminpass123" +} +TERMINUS + +# clone cpswt-core and build it cd /home/cpswt git clone https://github.com/justinyeh1995/cpswt-core.git cd cpswt-core/cpswt-core @@ -24,6 +42,6 @@ gradle wrapper --gradle-version=7.3 ./gradlew :federation-manager:build ./gradlew :fedmanager-host:build -cd /home/cpswt/examples/HelloWorldJava +cd /home/cpswt/cpswt-core/examples/HelloWorldJava gradle wrapper --gradle-version=7.4 ./gradlew :runFederation \ No newline at end of file From cff98bb8134a21465d305c10d4fa7cd16b94b02a Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Fri, 16 Jun 2023 17:01:36 -0500 Subject: [PATCH 060/113] csrf=false --- archiva.xml | 317 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 317 insertions(+) create mode 100644 archiva.xml diff --git a/archiva.xml b/archiva.xml new file mode 100644 index 0000000..0cd1495 --- /dev/null +++ b/archiva.xml @@ -0,0 +1,317 @@ + +3 + + + +artifacts + +**/*.pom +**/*.jar +**/*.ear +**/*.war +**/*.car +**/*.sar +**/*.mar +**/*.rar +**/*.dtd +**/*.tld +**/*.tar.gz +**/*.tar.bz2 +**/*.zip + + + +indexable-content + +**/*.txt +**/*.TXT +**/*.block +**/*.config +**/*.pom +**/*.xml +**/*.xsd +**/*.dtd +**/*.tld + + + +auto-remove + +**/*.bak +**/*~ +**/*- + + + +ignored + +**/.htaccess +**/KEYS +**/*.rb +**/*.sh +**/.svn/** +**/.DAV/** +.index/** +.indexer/** + + + + +create-missing-checksums +validate-checksum +validate-signature +index-content +auto-remove +auto-rename +metadata-updater +create-archiva-metadata +duplicate-artifacts + + +update-db-bad-content + + + + +true +true +false +false + + + +true + + +true + +-1 +false +com.sun.jndi.ldap.LdapCtxFactory +false +false +false + +true + +14400 +14400 +1000 +0 + + +jdo + + +jdo + + + + + + + +false + + +true + + +1 +true + + +24 +1 +true + + +true +1 + + +true + + +true + + + +6 + + +true +90 + + + + +10 + + + + + + + +/ + +false +365 +true + + +30 + + + + + + + +cn + +inetOrgPerson + + +givenName +userPassword +mail + + + + +0 + + + +true + +cn + +uniqueMember +groupOfUniqueNames + + +uid + +distinguishedName + + + + +true +false + +true + + + + + + +2880 +Welcome to Archiva +true + + + + + + +guest + + +admin + + + + + + +true + + +2700 +1800 +1000 +0 + + + + +./repositories/internal +true +true +false +true +30 +false +false +false +internal +Archiva Managed Internal Repository +./repositories/internal/.indexer + + +./repositories/snapshots +false +false +true +true +0 0\,30 * * * ? +30 +false +false +false +snapshots +Archiva Managed Snapshot Repository +./repositories/snapshots/.indexer + + + + +https://repo.maven.apache.org/maven2 +false +false +central +Central Repository + + + + +1 +internal +central + + +**/* + + +once +fix +never +yes + +false + + + + +jaxen/jars/jaxen-1.0-FCS-full.jar +jaxen:jaxen:1.0-FCS:full:jar + + + + + +http://download.oracle.com/maven +com/sleepycat/je/license.txt + + +https://download.oracle.com/maven +com/sleepycat/je/license.txt + + + + \ No newline at end of file From 327dcab4da00b2781a39f13be5aed9015a3b15e4 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Fri, 16 Jun 2023 17:17:11 -0500 Subject: [PATCH 061/113] csrf=false --- archiva.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archiva.xml b/archiva.xml index 0cd1495..d61a6a3 100644 --- a/archiva.xml +++ b/archiva.xml @@ -200,7 +200,7 @@ -true +false false true From 355b435f2c1cd296d3d341c7ee06e757a4c0580d Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Fri, 16 Jun 2023 17:18:50 -0500 Subject: [PATCH 062/113] add sleep 10 to wait archiva --- experiment_wrapper.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/experiment_wrapper.sh b/experiment_wrapper.sh index b764ed9..c9fa61d 100644 --- a/experiment_wrapper.sh +++ b/experiment_wrapper.sh @@ -1,5 +1,6 @@ # this script is used to build cpswt-core and its dependencies in the docker container /opt/apache-archiva-2.2.5/bin/archiva start +sleep 10 # localhost=$(hostname -I | awk '{print $1}') curl --no-progress-meter -X POST -H "Content-Type: application/json" -H "Origin: http://localhost:8080" -d @- \ http://localhost:8080/restServices/redbackServices/userService/createAdminUser <<'TERMINUS' From a28dfdd652efd680ba24a9a8468ab282c19e05c5 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Fri, 16 Jun 2023 18:35:46 -0500 Subject: [PATCH 063/113] archiva admin issue solved --- Dockerfile | 10 +- archiva.xml | 317 ---------------------------------------------------- 2 files changed, 5 insertions(+), 322 deletions(-) delete mode 100644 archiva.xml diff --git a/Dockerfile b/Dockerfile index 6c4d66c..e564f18 100644 --- a/Dockerfile +++ b/Dockerfile @@ -76,7 +76,6 @@ RUN wget -O archiva.tar.gz https://archive.apache.org/dist/archiva/2.2.5/binarie tar xf archiva.tar.gz && \ rm archiva.tar.gz COPY wrapper-linux-aarch64-64 /opt/apache-archiva-2.2.5/bin/./ -COPY archiva.xml /opt/apache-archiva-2.2.5/conf/ RUN chmod +x /opt/apache-archiva-2.2.5/bin/wrapper-linux-aarch64-64 # Expose the Archiva port @@ -86,11 +85,12 @@ EXPOSE 8080/tcp STOPSIGNAL SIGINT # Set up Gradle -RUN mkdir /home/testuser/ && \ - mkdir /home/testuser/.gradle/ -ENV HOME="/home/testuser" +# RUN mkdir /home/testuser/ && \ +# mkdir /home/testuser/.gradle/ +ENV HOME="/root" +RUN mkdir ${HOME}/.gradle/ COPY gradle.properties ${HOME}/.gradle/gradle.properties - +RUN chmod 600 ${HOME}/.gradle/gradle.properties # # Clone and build CPSWT packages RUN mkdir /home/cpswt COPY experiment_wrapper.sh /home/cpswt diff --git a/archiva.xml b/archiva.xml deleted file mode 100644 index d61a6a3..0000000 --- a/archiva.xml +++ /dev/null @@ -1,317 +0,0 @@ - -3 - - - -artifacts - -**/*.pom -**/*.jar -**/*.ear -**/*.war -**/*.car -**/*.sar -**/*.mar -**/*.rar -**/*.dtd -**/*.tld -**/*.tar.gz -**/*.tar.bz2 -**/*.zip - - - -indexable-content - -**/*.txt -**/*.TXT -**/*.block -**/*.config -**/*.pom -**/*.xml -**/*.xsd -**/*.dtd -**/*.tld - - - -auto-remove - -**/*.bak -**/*~ -**/*- - - - -ignored - -**/.htaccess -**/KEYS -**/*.rb -**/*.sh -**/.svn/** -**/.DAV/** -.index/** -.indexer/** - - - - -create-missing-checksums -validate-checksum -validate-signature -index-content -auto-remove -auto-rename -metadata-updater -create-archiva-metadata -duplicate-artifacts - - -update-db-bad-content - - - - -true -true -false -false - - - -true - - -true - --1 -false -com.sun.jndi.ldap.LdapCtxFactory -false -false -false - -true - -14400 -14400 -1000 -0 - - -jdo - - -jdo - - - - - - - -false - - -true - - -1 -true - - -24 -1 -true - - -true -1 - - -true - - -true - - - -6 - - -true -90 - - - - -10 - - - - - - - -/ - -false -365 -true - - -30 - - - - - - - -cn - -inetOrgPerson - - -givenName -userPassword -mail - - - - -0 - - - -true - -cn - -uniqueMember -groupOfUniqueNames - - -uid - -distinguishedName - - - - -false -false - -true - - - - - - -2880 -Welcome to Archiva -true - - - - - - -guest - - -admin - - - - - - -true - - -2700 -1800 -1000 -0 - - - - -./repositories/internal -true -true -false -true -30 -false -false -false -internal -Archiva Managed Internal Repository -./repositories/internal/.indexer - - -./repositories/snapshots -false -false -true -true -0 0\,30 * * * ? -30 -false -false -false -snapshots -Archiva Managed Snapshot Repository -./repositories/snapshots/.indexer - - - - -https://repo.maven.apache.org/maven2 -false -false -central -Central Repository - - - - -1 -internal -central - - -**/* - - -once -fix -never -yes - -false - - - - -jaxen/jars/jaxen-1.0-FCS-full.jar -jaxen:jaxen:1.0-FCS:full:jar - - - - - -http://download.oracle.com/maven -com/sleepycat/je/license.txt - - -https://download.oracle.com/maven -com/sleepycat/je/license.txt - - - - \ No newline at end of file From 08a0d14f05ac476550326eba08ecc87354d7dae9 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 20 Jun 2023 13:31:54 -0500 Subject: [PATCH 064/113] testing for now --- examples/HelloWorldJava/gradle.properties | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/examples/HelloWorldJava/gradle.properties b/examples/HelloWorldJava/gradle.properties index 65a82a4..896d22f 100644 --- a/examples/HelloWorldJava/gradle.properties +++ b/examples/HelloWorldJava/gradle.properties @@ -1 +1,9 @@ -version=0.8.0-SNAPSHOT +archivaUser=admin +archivaPassword=adminpass123 +archivaHostId=localhost +archivaPort=8080 +version=0.7.0-SNAPSHOT + +org.gradle.console=plain + +omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file From 3cee4140ac74be39186c1fdb6478d279e2732ca0 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 20 Jun 2023 14:02:21 -0500 Subject: [PATCH 065/113] update exp wrapper --- experiment_wrapper.sh | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/experiment_wrapper.sh b/experiment_wrapper.sh index c9fa61d..e01be61 100644 --- a/experiment_wrapper.sh +++ b/experiment_wrapper.sh @@ -1,7 +1,8 @@ # this script is used to build cpswt-core and its dependencies in the docker container /opt/apache-archiva-2.2.5/bin/archiva start -sleep 10 -# localhost=$(hostname -I | awk '{print $1}') +# nc -zv localhost 8080 +sleep 20 +# create admin user curl --no-progress-meter -X POST -H "Content-Type: application/json" -H "Origin: http://localhost:8080" -d @- \ http://localhost:8080/restServices/redbackServices/userService/createAdminUser <<'TERMINUS' { @@ -25,14 +26,14 @@ cd cpswt-core/cpswt-core gradle wrapper --gradle-version=7.3 -./gradlew :utils:publish +./gradlew :utils:publish ./gradlew :root:publish -./gradlew :base-events:publish -./gradlew :coa:publish +./gradlew :base-events:publish +./gradlew :coa:publish ./gradlew :config:publish -./gradlew :federate-base:publish -./gradlew :federation-manager:publish -./gradlew :fedmanager-host:publish +./gradlew :federate-base:publish +./gradlew :federation-manager:publish +./gradlew :fedmanager-host:publish ./gradlew :utils:build ./gradlew :root:build @@ -40,8 +41,8 @@ gradle wrapper --gradle-version=7.3 ./gradlew :coa:build ./gradlew :config:build ./gradlew :federate-base:build -./gradlew :federation-manager:build -./gradlew :fedmanager-host:build +./gradlew :federation-manager:build +./gradlew :fedmanager-host:build cd /home/cpswt/cpswt-core/examples/HelloWorldJava gradle wrapper --gradle-version=7.4 From b0c9d85a24637813da72f4bc156719577942e8be Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 20 Jun 2023 14:03:29 -0500 Subject: [PATCH 066/113] integrate the lifecycle of the actual exp --- Jenkinsfile | 57 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 476b7a1..a8184c8 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,10 +1,5 @@ pipeline { agent any - //agent { - // node { - // label 'docker-agent-latest' - // } - //} triggers { pollSCM('*/1 * * * *') // poll the SCM every 5 minutes } @@ -17,27 +12,48 @@ pipeline { sh 'git clone https://github.com/justinyeh1995/cpswt-core.git' } } - stage('Build') { - //agent { - // node { - // label 'docker-agent-latest'// should be able to support the environment for the docker container in this stage - // } - //} + stage('Build the image') { steps { - echo 'Building projects..' - sh 'echo "Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server.."' + echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' + sh 'cd cpswt-core && docker build -t cpswt-core:latest -f Dockerfile .' } } - stage('Test') { + stage('Check docker network') { steps { - echo 'Testing....' - sh 'echo "doing test stuff.."' + echo 'Checking if cpswt-core network is in docker network....' + sh 'docker network ls | grep cpswt-core' + sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' } } - stage('Report') { + stage('Run the container') { steps { - echo 'Report the results through emails....' - sh 'echo "doing test stuff.."' + echo 'Run the Docker Container....' + sh 'echo "run the container."' + sh 'docker run \ + --name cpswt-core \ + --restart=on-failure \ + --detach \ + --network cpswt-core \ + --env DOCKER_HOST=tcp://docker:2376 \ + --env DOCKER_CERT_PATH=/certs/client \ + --env DOCKER_TLS_VERIFY=1 \ + --publish 8081:8080 \ + -v /var/run/docker.sock:/var/run/docker.sock \ + cpswt-core:latest' + } + } + stage('Archive loggings') { + steps { + echo 'Archiving the results...' + sh 'docker logs cpswt-core > cpswt-core.log' + archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true + } + } + stage('Tear down the Docker Container') { + steps { + echo 'Tearing Down the image & container....' + sh 'docker rm -f cpswt-core' + sh 'docker rmi cpswt-core:latest' } } } @@ -48,7 +64,8 @@ pipeline { emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", - attachLog: true + attachLog: true, + attachmentsPattern: 'cpswt-core.log' } } } From e57943e38acb22b3ec6f45237454c706d320a882 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 20 Jun 2023 14:05:45 -0500 Subject: [PATCH 067/113] integrate the lifecycle of the actual exp --- Jenkinsfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index a8184c8..fbfd6b9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -35,7 +35,6 @@ pipeline { --detach \ --network cpswt-core \ --env DOCKER_HOST=tcp://docker:2376 \ - --env DOCKER_CERT_PATH=/certs/client \ --env DOCKER_TLS_VERIFY=1 \ --publish 8081:8080 \ -v /var/run/docker.sock:/var/run/docker.sock \ From 2e61c95e1d72997a2b40d1ef4d4f15b516e2580e Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 20 Jun 2023 15:05:07 -0500 Subject: [PATCH 068/113] integrate the lifecycle of the actual exp --- Jenkinsfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index fbfd6b9..23d088c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -35,7 +35,6 @@ pipeline { --detach \ --network cpswt-core \ --env DOCKER_HOST=tcp://docker:2376 \ - --env DOCKER_TLS_VERIFY=1 \ --publish 8081:8080 \ -v /var/run/docker.sock:/var/run/docker.sock \ cpswt-core:latest' From 6d4e5dd04bc96b35470504da5c0933f63121d3aa Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 21 Jun 2023 13:58:34 -0500 Subject: [PATCH 069/113] try docker pipeline plugin groovy syntax --- Jenkinsfile | 148 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 117 insertions(+), 31 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 23d088c..3081369 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,53 +1,139 @@ +// pipeline { +// agent any +// triggers { +// pollSCM('*/1 * * * *') // poll the SCM every 1 minutes +// } + +// stages { +// stage('Clone repository') { +// steps { +// echo 'Cloning Forked CPSWT-Core..' +// sh 'rm -rf cpswt-core' +// git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' +// } +// } +// stage('Build image') { +// steps { +// echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' +// sh 'cd cpswt-core' +// sh 'docker build -t cpswt-core:latest -f Dockerfile .' +// } +// } +// stage('Check network') { +// steps { +// echo 'Checking if cpswt-core network is in docker network....' +// sh 'docker network ls | grep cpswt-core' +// sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' +// } +// } +// stage('Deploy image') { +// steps { +// echo 'Run the Docker Container....' +// sh 'docker run \ +// --name cpswt-core \ +// --restart=on-failure \ +// --detach \ +// --network cpswt-core \ +// --env DOCKER_HOST=tcp://docker:2376 \ +// --env DOCKER_CERT_PATH=/certs/client \ +// --env DOCKER_TLS_VERIFY=1 \ +// --publish 8081:8080 \ +// -v /var/run/docker.sock:/var/run/docker.sock \ +// cpswt-core:latest' +// } +// } +// stage('Archive loggings') { +// steps { +// echo 'Archiving the results...' +// sh 'docker logs cpswt-core > cpswt-core.log' +// archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true +// } +// } +// stage('Clean up') { +// steps { +// echo 'Tearing Down the image & container....' +// sh 'docker rm -f cpswt-core' +// sh 'docker rmi cpswt-core:latest' +// } +// } +// } + +// post { +// always { +// echo 'This will always run' +// emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", +// recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], +// subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", +// attachLog: true, +// attachmentsPattern: 'cpswt-core.log' +// } +// } +// } pipeline { agent any triggers { - pollSCM('*/1 * * * *') // poll the SCM every 5 minutes + pollSCM('*/1 * * * *') // poll the SCM every 1 minute } stages { - stage('Clone the repo') { + stage('Clone repository') { steps { echo 'Cloning Forked CPSWT-Core..' - sh 'rm -rf cpswt-core' - sh 'git clone https://github.com/justinyeh1995/cpswt-core.git' + deleteDir() // Delete workspace before cloning + git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' } } - stage('Build the image') { + stage('Build image') { steps { - echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' - sh 'cd cpswt-core && docker build -t cpswt-core:latest -f Dockerfile .' + echo 'Start a Docker Container for this experiment, which should start the experiment and an Archiva server, an Inet server, and an OMNeT++ server..' + dir('cpswt-core') { + docker.build('cpswt-core:latest') + } } } - stage('Check docker network') { + stage('Check network') { steps { - echo 'Checking if cpswt-core network is in docker network....' - sh 'docker network ls | grep cpswt-core' - sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' + echo 'Checking if cpswt-core network is in Docker network....' + script { + def networkExists = sh(script: 'docker network ls | grep cpswt-core', returnStatus: true) + if (networkExists == 0) { + echo "cpswt-core network exists" + } else { + sh 'docker network create cpswt-core' + } + } } } - stage('Run the container') { + stage('Deploy image') { steps { echo 'Run the Docker Container....' - sh 'echo "run the container."' - sh 'docker run \ - --name cpswt-core \ - --restart=on-failure \ - --detach \ - --network cpswt-core \ - --env DOCKER_HOST=tcp://docker:2376 \ - --publish 8081:8080 \ - -v /var/run/docker.sock:/var/run/docker.sock \ - cpswt-core:latest' + script { + docker.image('cpswt-core:latest').withRun('--name cpswt-core \ + --restart=on-failure \ + --detach \ + --network cpswt-core \ + --env DOCKER_HOST=tcp://docker:2376 \ + --env DOCKER_CERT_PATH=/certs/client \ + --env DOCKER_TLS_VERIFY=1 \ + --publish 8081:8080 \ + -v /var/run/docker.sock:/var/run/docker.sock') { + // Additional setup or commands inside the container if needed + } + } } } stage('Archive loggings') { steps { echo 'Archiving the results...' - sh 'docker logs cpswt-core > cpswt-core.log' + script { + docker.image('cpswt-core:latest').inside('-v $PWD:/app') { + sh 'docker logs cpswt-core > cpswt-core.log' + } + } archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true } } - stage('Tear down the Docker Container') { + stage('Clean up') { steps { echo 'Tearing Down the image & container....' sh 'docker rm -f cpswt-core' @@ -58,12 +144,12 @@ pipeline { post { always { - echo 'This will always run' - emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", - attachLog: true, - attachmentsPattern: 'cpswt-core.log' + echo 'This will always run' + emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", + attachLog: true, + attachmentsPattern: 'cpswt-core.log' } - } + } } From 283f0363b8956d8dbd626b7e63b5e8b8b7757cbe Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 21 Jun 2023 14:00:57 -0500 Subject: [PATCH 070/113] try docker pipeline plugin groovy syntax --- Jenkinsfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 3081369..205bd58 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -80,7 +80,8 @@ pipeline { steps { echo 'Cloning Forked CPSWT-Core..' deleteDir() // Delete workspace before cloning - git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' + // git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' + sh 'git clone https://github.com/justinyeh1995/cpswt-core.git' } } stage('Build image') { From 70e3ec219cbca34b58e37031d17a3955344cfe8b Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 21 Jun 2023 14:01:57 -0500 Subject: [PATCH 071/113] try docker pipeline plugin groovy syntax --- Jenkinsfile | 227 ++++++++++++++++++++++++++-------------------------- 1 file changed, 114 insertions(+), 113 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 205bd58..9b1574f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,136 +1,51 @@ -// pipeline { -// agent any -// triggers { -// pollSCM('*/1 * * * *') // poll the SCM every 1 minutes -// } - -// stages { -// stage('Clone repository') { -// steps { -// echo 'Cloning Forked CPSWT-Core..' -// sh 'rm -rf cpswt-core' -// git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' -// } -// } -// stage('Build image') { -// steps { -// echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' -// sh 'cd cpswt-core' -// sh 'docker build -t cpswt-core:latest -f Dockerfile .' -// } -// } -// stage('Check network') { -// steps { -// echo 'Checking if cpswt-core network is in docker network....' -// sh 'docker network ls | grep cpswt-core' -// sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' -// } -// } -// stage('Deploy image') { -// steps { -// echo 'Run the Docker Container....' -// sh 'docker run \ -// --name cpswt-core \ -// --restart=on-failure \ -// --detach \ -// --network cpswt-core \ -// --env DOCKER_HOST=tcp://docker:2376 \ -// --env DOCKER_CERT_PATH=/certs/client \ -// --env DOCKER_TLS_VERIFY=1 \ -// --publish 8081:8080 \ -// -v /var/run/docker.sock:/var/run/docker.sock \ -// cpswt-core:latest' -// } -// } -// stage('Archive loggings') { -// steps { -// echo 'Archiving the results...' -// sh 'docker logs cpswt-core > cpswt-core.log' -// archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true -// } -// } -// stage('Clean up') { -// steps { -// echo 'Tearing Down the image & container....' -// sh 'docker rm -f cpswt-core' -// sh 'docker rmi cpswt-core:latest' -// } -// } -// } - -// post { -// always { -// echo 'This will always run' -// emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", -// recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], -// subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", -// attachLog: true, -// attachmentsPattern: 'cpswt-core.log' -// } -// } -// } pipeline { agent any triggers { - pollSCM('*/1 * * * *') // poll the SCM every 1 minute + pollSCM('*/1 * * * *') // poll the SCM every 1 minutes } stages { stage('Clone repository') { steps { echo 'Cloning Forked CPSWT-Core..' - deleteDir() // Delete workspace before cloning - // git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' - sh 'git clone https://github.com/justinyeh1995/cpswt-core.git' + sh 'rm -rf cpswt-core' + git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' } } stage('Build image') { steps { - echo 'Start a Docker Container for this experiment, which should start the experiment and an Archiva server, an Inet server, and an OMNeT++ server..' - dir('cpswt-core') { - docker.build('cpswt-core:latest') - } + echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' + sh 'cd cpswt-core' + sh 'docker build -t cpswt-core:latest -f Dockerfile .' } } stage('Check network') { steps { - echo 'Checking if cpswt-core network is in Docker network....' - script { - def networkExists = sh(script: 'docker network ls | grep cpswt-core', returnStatus: true) - if (networkExists == 0) { - echo "cpswt-core network exists" - } else { - sh 'docker network create cpswt-core' - } - } + echo 'Checking if cpswt-core network is in docker network....' + sh 'docker network ls | grep cpswt-core' + sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' } } stage('Deploy image') { steps { echo 'Run the Docker Container....' - script { - docker.image('cpswt-core:latest').withRun('--name cpswt-core \ - --restart=on-failure \ - --detach \ - --network cpswt-core \ - --env DOCKER_HOST=tcp://docker:2376 \ - --env DOCKER_CERT_PATH=/certs/client \ - --env DOCKER_TLS_VERIFY=1 \ - --publish 8081:8080 \ - -v /var/run/docker.sock:/var/run/docker.sock') { - // Additional setup or commands inside the container if needed - } - } + sh 'docker run \ + --name cpswt-core \ + --restart=on-failure \ + --detach \ + --network cpswt-core \ + --env DOCKER_HOST=tcp://docker:2376 \ + --env DOCKER_CERT_PATH=/certs/client \ + --env DOCKER_TLS_VERIFY=1 \ + --publish 8081:8080 \ + -v /var/run/docker.sock:/var/run/docker.sock \ + cpswt-core:latest' } } stage('Archive loggings') { steps { echo 'Archiving the results...' - script { - docker.image('cpswt-core:latest').inside('-v $PWD:/app') { - sh 'docker logs cpswt-core > cpswt-core.log' - } - } + sh 'docker logs cpswt-core > cpswt-core.log' archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true } } @@ -145,12 +60,98 @@ pipeline { post { always { - echo 'This will always run' - emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", - attachLog: true, - attachmentsPattern: 'cpswt-core.log' + echo 'This will always run' + emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", + attachLog: true, + attachmentsPattern: 'cpswt-core.log' } - } + } } + +// pipeline { +// agent any +// triggers { +// pollSCM('*/1 * * * *') // poll the SCM every 1 minute +// } + +// stages { +// stage('Clone repository') { +// steps { +// echo 'Cloning Forked CPSWT-Core..' +// deleteDir() // Delete workspace before cloning +// // git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' +// sh 'git clone https://github.com/justinyeh1995/cpswt-core.git' +// } +// } +// stage('Build image') { +// steps { +// echo 'Start a Docker Container for this experiment, which should start the experiment and an Archiva server, an Inet server, and an OMNeT++ server..' +// dir('cpswt-core') { +// docker.build('cpswt-core:latest') +// } +// } +// } +// stage('Check network') { +// steps { +// echo 'Checking if cpswt-core network is in Docker network....' +// script { +// def networkExists = sh(script: 'docker network ls | grep cpswt-core', returnStatus: true) +// if (networkExists == 0) { +// echo "cpswt-core network exists" +// } else { +// sh 'docker network create cpswt-core' +// } +// } +// } +// } +// stage('Deploy image') { +// steps { +// echo 'Run the Docker Container....' +// script { +// docker.image('cpswt-core:latest').withRun('--name cpswt-core \ +// --restart=on-failure \ +// --detach \ +// --network cpswt-core \ +// --env DOCKER_HOST=tcp://docker:2376 \ +// --env DOCKER_CERT_PATH=/certs/client \ +// --env DOCKER_TLS_VERIFY=1 \ +// --publish 8081:8080 \ +// -v /var/run/docker.sock:/var/run/docker.sock') { +// // Additional setup or commands inside the container if needed +// } +// } +// } +// } +// stage('Archive loggings') { +// steps { +// echo 'Archiving the results...' +// script { +// docker.image('cpswt-core:latest').inside('-v $PWD:/app') { +// sh 'docker logs cpswt-core > cpswt-core.log' +// } +// } +// archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true +// } +// } +// stage('Clean up') { +// steps { +// echo 'Tearing Down the image & container....' +// sh 'docker rm -f cpswt-core' +// sh 'docker rmi cpswt-core:latest' +// } +// } +// } + +// post { +// always { +// echo 'This will always run' +// emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", +// recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], +// subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", +// attachLog: true, +// attachmentsPattern: 'cpswt-core.log' +// } +// } +// } From 608e3cd8619ea74e1c0666d47a1dab0ab032d50c Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 21 Jun 2023 14:06:22 -0500 Subject: [PATCH 072/113] try docker pipeline plugin groovy syntax --- Jenkinsfile | 225 ++++++++++++++++++++++++++-------------------------- 1 file changed, 112 insertions(+), 113 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 9b1574f..a468fcb 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,51 +1,136 @@ +// pipeline { +// agent any +// triggers { +// pollSCM('*/1 * * * *') // poll the SCM every 1 minutes +// } + +// stages { +// stage('Clone repository') { +// steps { +// echo 'Cloning Forked CPSWT-Core..' +// sh 'rm -rf cpswt-core' +// git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' +// } +// } +// stage('Build image') { +// steps { +// echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' +// sh 'cd cpswt-core' +// sh 'docker build -t cpswt-core:latest -f Dockerfile .' +// } +// } +// stage('Check network') { +// steps { +// echo 'Checking if cpswt-core network is in docker network....' +// sh 'docker network ls | grep cpswt-core' +// sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' +// } +// } +// stage('Deploy image') { +// steps { +// echo 'Run the Docker Container....' +// sh 'docker run \ +// --name cpswt-core \ +// --restart=on-failure \ +// --detach \ +// --network cpswt-core \ +// --env DOCKER_HOST=tcp://docker:2376 \ +// --env DOCKER_CERT_PATH=/certs/client \ +// --env DOCKER_TLS_VERIFY=1 \ +// --publish 8081:8080 \ +// -v /var/run/docker.sock:/var/run/docker.sock \ +// cpswt-core:latest' +// } +// } +// stage('Archive loggings') { +// steps { +// echo 'Archiving the results...' +// sh 'docker logs cpswt-core > cpswt-core.log' +// archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true +// } +// } +// stage('Clean up') { +// steps { +// echo 'Tearing Down the image & container....' +// sh 'docker rm -f cpswt-core' +// sh 'docker rmi cpswt-core:latest' +// } +// } +// } + +// post { +// always { +// echo 'This will always run' +// emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", +// recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], +// subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", +// attachLog: true, +// attachmentsPattern: 'cpswt-core.log' +// } +// } +// } + pipeline { agent any triggers { - pollSCM('*/1 * * * *') // poll the SCM every 1 minutes + pollSCM('*/1 * * * *') // poll the SCM every 1 minute } stages { stage('Clone repository') { steps { echo 'Cloning Forked CPSWT-Core..' - sh 'rm -rf cpswt-core' + //deleteDir() // Delete workspace before cloning git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' } } stage('Build image') { steps { - echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' - sh 'cd cpswt-core' - sh 'docker build -t cpswt-core:latest -f Dockerfile .' + echo 'Start a Docker Container for this experiment, which should start the experiment and an Archiva server, an Inet server, and an OMNeT++ server..' + dir('cpswt-core') { + docker.build('cpswt-core:latest') + } } } stage('Check network') { steps { - echo 'Checking if cpswt-core network is in docker network....' - sh 'docker network ls | grep cpswt-core' - sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' + echo 'Checking if cpswt-core network is in Docker network....' + script { + def networkExists = sh(script: 'docker network ls | grep cpswt-core', returnStatus: true) + if (networkExists == 0) { + echo "cpswt-core network exists" + } else { + sh 'docker network create cpswt-core' + } + } } } stage('Deploy image') { steps { echo 'Run the Docker Container....' - sh 'docker run \ - --name cpswt-core \ - --restart=on-failure \ - --detach \ - --network cpswt-core \ - --env DOCKER_HOST=tcp://docker:2376 \ - --env DOCKER_CERT_PATH=/certs/client \ - --env DOCKER_TLS_VERIFY=1 \ - --publish 8081:8080 \ - -v /var/run/docker.sock:/var/run/docker.sock \ - cpswt-core:latest' + script { + docker.image('cpswt-core:latest').withRun('--name cpswt-core \ + --restart=on-failure \ + --detach \ + --network cpswt-core \ + --env DOCKER_HOST=tcp://docker:2376 \ + --env DOCKER_CERT_PATH=/certs/client \ + --env DOCKER_TLS_VERIFY=1 \ + --publish 8081:8080 \ + -v /var/run/docker.sock:/var/run/docker.sock') { + // Additional setup or commands inside the container if needed + } + } } } stage('Archive loggings') { steps { echo 'Archiving the results...' - sh 'docker logs cpswt-core > cpswt-core.log' + script { + docker.image('cpswt-core:latest').inside('-v $PWD:/app') { + sh 'docker logs cpswt-core > cpswt-core.log' + } + } archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true } } @@ -60,98 +145,12 @@ pipeline { post { always { - echo 'This will always run' - emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", - attachLog: true, - attachmentsPattern: 'cpswt-core.log' + echo 'This will always run' + emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", + attachLog: true, + attachmentsPattern: 'cpswt-core.log' } - } + } } - -// pipeline { -// agent any -// triggers { -// pollSCM('*/1 * * * *') // poll the SCM every 1 minute -// } - -// stages { -// stage('Clone repository') { -// steps { -// echo 'Cloning Forked CPSWT-Core..' -// deleteDir() // Delete workspace before cloning -// // git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' -// sh 'git clone https://github.com/justinyeh1995/cpswt-core.git' -// } -// } -// stage('Build image') { -// steps { -// echo 'Start a Docker Container for this experiment, which should start the experiment and an Archiva server, an Inet server, and an OMNeT++ server..' -// dir('cpswt-core') { -// docker.build('cpswt-core:latest') -// } -// } -// } -// stage('Check network') { -// steps { -// echo 'Checking if cpswt-core network is in Docker network....' -// script { -// def networkExists = sh(script: 'docker network ls | grep cpswt-core', returnStatus: true) -// if (networkExists == 0) { -// echo "cpswt-core network exists" -// } else { -// sh 'docker network create cpswt-core' -// } -// } -// } -// } -// stage('Deploy image') { -// steps { -// echo 'Run the Docker Container....' -// script { -// docker.image('cpswt-core:latest').withRun('--name cpswt-core \ -// --restart=on-failure \ -// --detach \ -// --network cpswt-core \ -// --env DOCKER_HOST=tcp://docker:2376 \ -// --env DOCKER_CERT_PATH=/certs/client \ -// --env DOCKER_TLS_VERIFY=1 \ -// --publish 8081:8080 \ -// -v /var/run/docker.sock:/var/run/docker.sock') { -// // Additional setup or commands inside the container if needed -// } -// } -// } -// } -// stage('Archive loggings') { -// steps { -// echo 'Archiving the results...' -// script { -// docker.image('cpswt-core:latest').inside('-v $PWD:/app') { -// sh 'docker logs cpswt-core > cpswt-core.log' -// } -// } -// archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true -// } -// } -// stage('Clean up') { -// steps { -// echo 'Tearing Down the image & container....' -// sh 'docker rm -f cpswt-core' -// sh 'docker rmi cpswt-core:latest' -// } -// } -// } - -// post { -// always { -// echo 'This will always run' -// emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", -// recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], -// subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", -// attachLog: true, -// attachmentsPattern: 'cpswt-core.log' -// } -// } -// } From 09ef5e4a6a49f3154e5b5fad9b3a0de9436663ea Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 21 Jun 2023 14:11:23 -0500 Subject: [PATCH 073/113] try docker pipeline plugin groovy syntax --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index a468fcb..07000eb 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -80,7 +80,7 @@ pipeline { stage('Clone repository') { steps { echo 'Cloning Forked CPSWT-Core..' - //deleteDir() // Delete workspace before cloning + sh 'rm -rf cpswt-core' git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' } } From 32b24a7558af16dc6c982c0b3b549ba2100bb7b1 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 21 Jun 2023 14:12:45 -0500 Subject: [PATCH 074/113] try docker pipeline plugin groovy syntax --- Jenkinsfile | 222 ++++++++++++++++++++++++++-------------------------- 1 file changed, 111 insertions(+), 111 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 07000eb..57dfba1 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,79 +1,7 @@ -// pipeline { -// agent any -// triggers { -// pollSCM('*/1 * * * *') // poll the SCM every 1 minutes -// } - -// stages { -// stage('Clone repository') { -// steps { -// echo 'Cloning Forked CPSWT-Core..' -// sh 'rm -rf cpswt-core' -// git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' -// } -// } -// stage('Build image') { -// steps { -// echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' -// sh 'cd cpswt-core' -// sh 'docker build -t cpswt-core:latest -f Dockerfile .' -// } -// } -// stage('Check network') { -// steps { -// echo 'Checking if cpswt-core network is in docker network....' -// sh 'docker network ls | grep cpswt-core' -// sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' -// } -// } -// stage('Deploy image') { -// steps { -// echo 'Run the Docker Container....' -// sh 'docker run \ -// --name cpswt-core \ -// --restart=on-failure \ -// --detach \ -// --network cpswt-core \ -// --env DOCKER_HOST=tcp://docker:2376 \ -// --env DOCKER_CERT_PATH=/certs/client \ -// --env DOCKER_TLS_VERIFY=1 \ -// --publish 8081:8080 \ -// -v /var/run/docker.sock:/var/run/docker.sock \ -// cpswt-core:latest' -// } -// } -// stage('Archive loggings') { -// steps { -// echo 'Archiving the results...' -// sh 'docker logs cpswt-core > cpswt-core.log' -// archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true -// } -// } -// stage('Clean up') { -// steps { -// echo 'Tearing Down the image & container....' -// sh 'docker rm -f cpswt-core' -// sh 'docker rmi cpswt-core:latest' -// } -// } -// } - -// post { -// always { -// echo 'This will always run' -// emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", -// recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], -// subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", -// attachLog: true, -// attachmentsPattern: 'cpswt-core.log' -// } -// } -// } - pipeline { agent any triggers { - pollSCM('*/1 * * * *') // poll the SCM every 1 minute + pollSCM('*/1 * * * *') // poll the SCM every 1 minutes } stages { @@ -86,51 +14,38 @@ pipeline { } stage('Build image') { steps { - echo 'Start a Docker Container for this experiment, which should start the experiment and an Archiva server, an Inet server, and an OMNeT++ server..' - dir('cpswt-core') { - docker.build('cpswt-core:latest') - } + echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' + sh 'cd cpswt-core' + sh 'docker build -t cpswt-core:latest -f Dockerfile .' } } stage('Check network') { steps { - echo 'Checking if cpswt-core network is in Docker network....' - script { - def networkExists = sh(script: 'docker network ls | grep cpswt-core', returnStatus: true) - if (networkExists == 0) { - echo "cpswt-core network exists" - } else { - sh 'docker network create cpswt-core' - } - } + echo 'Checking if cpswt-core network is in docker network....' + sh 'docker network ls | grep cpswt-core' + sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' } } stage('Deploy image') { steps { echo 'Run the Docker Container....' - script { - docker.image('cpswt-core:latest').withRun('--name cpswt-core \ - --restart=on-failure \ - --detach \ - --network cpswt-core \ - --env DOCKER_HOST=tcp://docker:2376 \ - --env DOCKER_CERT_PATH=/certs/client \ - --env DOCKER_TLS_VERIFY=1 \ - --publish 8081:8080 \ - -v /var/run/docker.sock:/var/run/docker.sock') { - // Additional setup or commands inside the container if needed - } - } + sh 'docker run \ + --name cpswt-core \ + --restart=on-failure \ + --detach \ + --network cpswt-core \ + --env DOCKER_HOST=tcp://docker:2376 \ + --env DOCKER_CERT_PATH=/certs/client \ + --env DOCKER_TLS_VERIFY=1 \ + --publish 8081:8080 \ + -v /var/run/docker.sock:/var/run/docker.sock \ + cpswt-core:latest' } } stage('Archive loggings') { steps { echo 'Archiving the results...' - script { - docker.image('cpswt-core:latest').inside('-v $PWD:/app') { - sh 'docker logs cpswt-core > cpswt-core.log' - } - } + sh 'docker logs cpswt-core > cpswt-core.log' archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true } } @@ -145,12 +60,97 @@ pipeline { post { always { - echo 'This will always run' - emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", - attachLog: true, - attachmentsPattern: 'cpswt-core.log' + echo 'This will always run' + emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", + attachLog: true, + attachmentsPattern: 'cpswt-core.log' } - } + } } + +// pipeline { +// agent any +// triggers { +// pollSCM('*/1 * * * *') // poll the SCM every 1 minute +// } + +// stages { +// stage('Clone repository') { +// steps { +// echo 'Cloning Forked CPSWT-Core..' +// deleteDir() // Delete workspace before cloning +// git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' +// } +// } +// stage('Build image') { +// steps { +// echo 'Start a Docker Container for this experiment, which should start the experiment and an Archiva server, an Inet server, and an OMNeT++ server..' +// dir('cpswt-core') { +// docker.build('cpswt-core:latest') +// } +// } +// } +// stage('Check network') { +// steps { +// echo 'Checking if cpswt-core network is in Docker network....' +// script { +// def networkExists = sh(script: 'docker network ls | grep cpswt-core', returnStatus: true) +// if (networkExists == 0) { +// echo "cpswt-core network exists" +// } else { +// sh 'docker network create cpswt-core' +// } +// } +// } +// } +// stage('Deploy image') { +// steps { +// echo 'Run the Docker Container....' +// script { +// docker.image('cpswt-core:latest').withRun('--name cpswt-core \ +// --restart=on-failure \ +// --detach \ +// --network cpswt-core \ +// --env DOCKER_HOST=tcp://docker:2376 \ +// --env DOCKER_CERT_PATH=/certs/client \ +// --env DOCKER_TLS_VERIFY=1 \ +// --publish 8081:8080 \ +// -v /var/run/docker.sock:/var/run/docker.sock') { +// // Additional setup or commands inside the container if needed +// } +// } +// } +// } +// stage('Archive loggings') { +// steps { +// echo 'Archiving the results...' +// script { +// docker.image('cpswt-core:latest').inside('-v $PWD:/app') { +// sh 'docker logs cpswt-core > cpswt-core.log' +// } +// } +// archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true +// } +// } +// stage('Clean up') { +// steps { +// echo 'Tearing Down the image & container....' +// sh 'docker rm -f cpswt-core' +// sh 'docker rmi cpswt-core:latest' +// } +// } +// } + +// post { +// always { +// echo 'This will always run' +// emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", +// recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], +// subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", +// attachLog: true, +// attachmentsPattern: 'cpswt-core.log' +// } +// } +// } From c96de340e39ba87febdc83f2f87a2a4595188bae Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 21 Jun 2023 14:14:16 -0500 Subject: [PATCH 075/113] try docker pipeline plugin groovy syntax --- Jenkinsfile | 63 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 57dfba1..c11703c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -14,38 +14,51 @@ pipeline { } stage('Build image') { steps { - echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' - sh 'cd cpswt-core' - sh 'docker build -t cpswt-core:latest -f Dockerfile .' + echo 'Start a Docker Container for this experiment, which should start the experiment and an Archiva server, an Inet server, and an OMNeT++ server..' + dir('cpswt-core') { + docker.build('cpswt-core:latest') + } } } stage('Check network') { steps { - echo 'Checking if cpswt-core network is in docker network....' - sh 'docker network ls | grep cpswt-core' - sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' + echo 'Checking if cpswt-core network is in Docker network....' + script { + def networkExists = sh(script: 'docker network ls | grep cpswt-core', returnStatus: true) + if (networkExists == 0) { + echo "cpswt-core network exists" + } else { + sh 'docker network create cpswt-core' + } + } } } stage('Deploy image') { steps { echo 'Run the Docker Container....' - sh 'docker run \ - --name cpswt-core \ - --restart=on-failure \ - --detach \ - --network cpswt-core \ - --env DOCKER_HOST=tcp://docker:2376 \ - --env DOCKER_CERT_PATH=/certs/client \ - --env DOCKER_TLS_VERIFY=1 \ - --publish 8081:8080 \ - -v /var/run/docker.sock:/var/run/docker.sock \ - cpswt-core:latest' + script { + docker.image('cpswt-core:latest').withRun('--name cpswt-core \ + --restart=on-failure \ + --detach \ + --network cpswt-core \ + --env DOCKER_HOST=tcp://docker:2376 \ + --env DOCKER_CERT_PATH=/certs/client \ + --env DOCKER_TLS_VERIFY=1 \ + --publish 8081:8080 \ + -v /var/run/docker.sock:/var/run/docker.sock') { + // Additional setup or commands inside the container if needed + } + } } } stage('Archive loggings') { steps { echo 'Archiving the results...' - sh 'docker logs cpswt-core > cpswt-core.log' + script { + docker.image('cpswt-core:latest').inside('-v $PWD:/app') { + sh 'docker logs cpswt-core > cpswt-core.log' + } + } archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true } } @@ -60,14 +73,14 @@ pipeline { post { always { - echo 'This will always run' - emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", - attachLog: true, - attachmentsPattern: 'cpswt-core.log' + echo 'This will always run' + emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", + attachLog: true, + attachmentsPattern: 'cpswt-core.log' } - } + } } // pipeline { From 3799f4a372b26cd394ecca7e68d133f753b20518 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 21 Jun 2023 14:16:54 -0500 Subject: [PATCH 076/113] try docker pipeline plugin groovy syntax --- Jenkinsfile | 65 +++++++++++++++++++++-------------------------------- 1 file changed, 26 insertions(+), 39 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index c11703c..913bb06 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -8,57 +8,44 @@ pipeline { stage('Clone repository') { steps { echo 'Cloning Forked CPSWT-Core..' - sh 'rm -rf cpswt-core' + deleteDir() // Delete workspace before cloning git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' } } stage('Build image') { steps { - echo 'Start a Docker Container for this experiment, which should start the experiment and an Archiva server, an Inet server, and an OMNeT++ server..' - dir('cpswt-core') { - docker.build('cpswt-core:latest') - } + echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' + sh 'cd cpswt-core' + sh 'docker build -t cpswt-core:latest -f Dockerfile .' } } stage('Check network') { steps { - echo 'Checking if cpswt-core network is in Docker network....' - script { - def networkExists = sh(script: 'docker network ls | grep cpswt-core', returnStatus: true) - if (networkExists == 0) { - echo "cpswt-core network exists" - } else { - sh 'docker network create cpswt-core' - } - } + echo 'Checking if cpswt-core network is in docker network....' + sh 'docker network ls | grep cpswt-core' + sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' } } stage('Deploy image') { steps { echo 'Run the Docker Container....' - script { - docker.image('cpswt-core:latest').withRun('--name cpswt-core \ - --restart=on-failure \ - --detach \ - --network cpswt-core \ - --env DOCKER_HOST=tcp://docker:2376 \ - --env DOCKER_CERT_PATH=/certs/client \ - --env DOCKER_TLS_VERIFY=1 \ - --publish 8081:8080 \ - -v /var/run/docker.sock:/var/run/docker.sock') { - // Additional setup or commands inside the container if needed - } - } + sh 'docker run \ + --name cpswt-core \ + --restart=on-failure \ + --detach \ + --network cpswt-core \ + --env DOCKER_HOST=tcp://docker:2376 \ + --env DOCKER_CERT_PATH=/certs/client \ + --env DOCKER_TLS_VERIFY=1 \ + --publish 8081:8080 \ + -v /var/run/docker.sock:/var/run/docker.sock \ + cpswt-core:latest' } } stage('Archive loggings') { steps { echo 'Archiving the results...' - script { - docker.image('cpswt-core:latest').inside('-v $PWD:/app') { - sh 'docker logs cpswt-core > cpswt-core.log' - } - } + sh 'docker logs cpswt-core > cpswt-core.log' archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true } } @@ -73,14 +60,14 @@ pipeline { post { always { - echo 'This will always run' - emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", - attachLog: true, - attachmentsPattern: 'cpswt-core.log' + echo 'This will always run' + emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", + attachLog: true, + attachmentsPattern: 'cpswt-core.log' } - } + } } // pipeline { From 0def20ba2af8b2c519e9e93d9f61d2cdec308fe1 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 21 Jun 2023 14:34:39 -0500 Subject: [PATCH 077/113] integrate the lifecycle of the actual exp --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 913bb06..999f262 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -28,7 +28,7 @@ pipeline { } stage('Deploy image') { steps { - echo 'Run the Docker Container....' + echo 'Run the Docker Container inside Jenkins container' sh 'docker run \ --name cpswt-core \ --restart=on-failure \ From bab57a1050a3eed6aea5d76288a1db11d6e3ecc2 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 21 Jun 2023 15:36:46 -0500 Subject: [PATCH 078/113] set +e --- Jenkinsfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Jenkinsfile b/Jenkinsfile index 999f262..6692c3e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -22,6 +22,7 @@ pipeline { stage('Check network') { steps { echo 'Checking if cpswt-core network is in docker network....' + sh 'set +e' sh 'docker network ls | grep cpswt-core' sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' } From f05eafbd16d1da748eab9d893443a5d553488b2d Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 21 Jun 2023 15:46:48 -0500 Subject: [PATCH 079/113] set +e --- Jenkinsfile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6692c3e..f48e8fe 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -22,9 +22,10 @@ pipeline { stage('Check network') { steps { echo 'Checking if cpswt-core network is in docker network....' - sh 'set +e' - sh 'docker network ls | grep cpswt-core' - sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' + sh 'docker create network --driver bridge cpswt-core || true' + // sh 'set +e' + // sh 'docker network ls | grep cpswt-core' + // sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' } } stage('Deploy image') { From 75f9c9545f252823602fde4a6f4484a155e9ed63 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 21 Jun 2023 15:50:47 -0500 Subject: [PATCH 080/113] check network stage --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index f48e8fe..0fcb4a9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -22,7 +22,7 @@ pipeline { stage('Check network') { steps { echo 'Checking if cpswt-core network is in docker network....' - sh 'docker create network --driver bridge cpswt-core || true' + sh 'docker network create --driver bridge cpswt-core || true' // sh 'set +e' // sh 'docker network ls | grep cpswt-core' // sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' From 5725716be69ff972c167c051144bde8fcf1e5504 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 21 Jun 2023 16:09:59 -0500 Subject: [PATCH 081/113] check network stage --- Jenkinsfile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 0fcb4a9..d80f9ba 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -23,9 +23,6 @@ pipeline { steps { echo 'Checking if cpswt-core network is in docker network....' sh 'docker network create --driver bridge cpswt-core || true' - // sh 'set +e' - // sh 'docker network ls | grep cpswt-core' - // sh 'if [ $? -eq 0 ]; then echo "cpswt-core network exists"; else docker network create cpswt-core; fi' } } stage('Deploy image') { @@ -44,6 +41,12 @@ pipeline { cpswt-core:latest' } } + stage('Wait for container to stop') { + steps { + echo 'Wait for container to stop' + sh 'docker wait cpswt-core' + } + } stage('Archive loggings') { steps { echo 'Archiving the results...' From 01f41f114e86616d568bf6cd6d30436e55292ee2 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 21 Jun 2023 17:02:35 -0500 Subject: [PATCH 082/113] testing on ubuntu20.04 VM --- Jenkinsfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index d80f9ba..39b9ea0 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -59,6 +59,8 @@ pipeline { echo 'Tearing Down the image & container....' sh 'docker rm -f cpswt-core' sh 'docker rmi cpswt-core:latest' + sh 'docker network rm cpswt-core' + sh 'rm -rf cpswt-core' } } } From 24faeddd8af4313ab6da7bc9fb5bd57122e88063 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 22 Jun 2023 12:33:48 -0500 Subject: [PATCH 083/113] set java to 17 after starting archiva --- experiment_wrapper.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/experiment_wrapper.sh b/experiment_wrapper.sh index e01be61..3396a8c 100644 --- a/experiment_wrapper.sh +++ b/experiment_wrapper.sh @@ -1,5 +1,7 @@ # this script is used to build cpswt-core and its dependencies in the docker container -/opt/apache-archiva-2.2.5/bin/archiva start +exec /opt/apache-archiva-2.2.5/bin/archiva start + +# wait for archiva to start # nc -zv localhost 8080 sleep 20 # create admin user @@ -19,6 +21,10 @@ curl --no-progress-meter -X POST -H "Content-Type: application/json" -H "Origin: } TERMINUS +# switch to java 17 +export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-arm64 +export PATH=$JAVA_HOME/bin:$PATH + # clone cpswt-core and build it cd /home/cpswt git clone https://github.com/justinyeh1995/cpswt-core.git From d34f50d22776df76afd50157f4f3194bfce06fed Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 22 Jun 2023 12:34:46 -0500 Subject: [PATCH 084/113] testing purpose --- cpswt-core/coa/gradle.properties | 1 + 1 file changed, 1 insertion(+) create mode 100644 cpswt-core/coa/gradle.properties diff --git a/cpswt-core/coa/gradle.properties b/cpswt-core/coa/gradle.properties new file mode 100644 index 0000000..65a82a4 --- /dev/null +++ b/cpswt-core/coa/gradle.properties @@ -0,0 +1 @@ +version=0.8.0-SNAPSHOT From f1c6e3939dfc41ab1b8d2f65ae5b347e13fc3d17 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 22 Jun 2023 12:35:14 -0500 Subject: [PATCH 085/113] minor update --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index e564f18..0c780e8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,6 +33,7 @@ RUN apt-get update && \ mongodb \ mpi-default-dev \ openjdk-8-jdk \ + openjdk-17-jdk \ openscenegraph-plugin-osgearth \ perl \ python2 \ From 0c929e395cf085aa5a5ed48ca9b93a2d1cb174cb Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 22 Jun 2023 18:43:30 -0500 Subject: [PATCH 086/113] install gradle7.5 manually --- Dockerfile | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0c780e8..e8d6e65 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,7 +19,6 @@ RUN apt-get update && \ gcc \ gdb \ git \ - gradle \ graphviz \ libboost1.71-all-dev \ libcppunit-dev \ @@ -47,7 +46,19 @@ RUN apt-get update && \ software-properties-common \ wget \ xterm \ - zlib1g-dev + zlib1g-dev \ + unzip \ + zip + +#install Gradle +ARG GRADLE_VERSION=7.5 +RUN wget -O gradle.zip https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip && \ + mkdir /opt/gradle && \ + unzip -d /opt/gradle gradle.zip && \ + rm gradle.zip +# Set Gradle in the environment variables +ENV GRADLE_HOME="/opt/gradle/gradle-${GRADLE_VERSION}" +ENV PATH="${GRADLE_HOME}/bin:${PATH}" # Install Python packages RUN python3 -m pip install --system --upgrade \ @@ -60,10 +71,6 @@ RUN python3 -m pip install --system --upgrade \ seaborn \ webgme-bindings -# Set up Java 8 (do we need this?) -> YES -ENV JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-arm64" -ENV PATH="$JAVA_HOME/bin:$PATH" - # Download and extract portico WORKDIR /home RUN wget -O portico.tar.gz https://master.dl.sourceforge.net/project/portico/Portico/portico-2.1.0/portico-2.1.0-linux64.tar.gz?viasf=1 && \ @@ -85,13 +92,11 @@ EXPOSE 8080/tcp # Use SIGINT for stopping STOPSIGNAL SIGINT -# Set up Gradle -# RUN mkdir /home/testuser/ && \ -# mkdir /home/testuser/.gradle/ -ENV HOME="/root" -RUN mkdir ${HOME}/.gradle/ -COPY gradle.properties ${HOME}/.gradle/gradle.properties -RUN chmod 600 ${HOME}/.gradle/gradle.properties +# Set up Gradle properties +# ENV HOME="/root" +# RUN mkdir ${HOME}/.gradle/ +COPY gradle.properties ${GRADLE_HOME}/init.d/ +RUN chmod 600 ${GRADLE_HOME}/init.d/gradle.properties # # Clone and build CPSWT packages RUN mkdir /home/cpswt COPY experiment_wrapper.sh /home/cpswt From 4ee425282ede6a3fb3466e5b0a1861e979fd2022 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 22 Jun 2023 18:44:08 -0500 Subject: [PATCH 087/113] switch between java 8 & java 17 --- experiment_wrapper.sh | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/experiment_wrapper.sh b/experiment_wrapper.sh index 3396a8c..c3e4772 100644 --- a/experiment_wrapper.sh +++ b/experiment_wrapper.sh @@ -1,5 +1,8 @@ # this script is used to build cpswt-core and its dependencies in the docker container -exec /opt/apache-archiva-2.2.5/bin/archiva start +ORIGINAL_PATH=$PATH +export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-arm64 +export PATH=$JAVA_HOME/bin:$PATH +/opt/apache-archiva-2.2.5/bin/archiva start # wait for archiva to start # nc -zv localhost 8080 @@ -22,15 +25,16 @@ curl --no-progress-meter -X POST -H "Content-Type: application/json" -H "Origin: TERMINUS # switch to java 17 -export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-arm64 -export PATH=$JAVA_HOME/bin:$PATH +unset JAVA_HOME +export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-arm64 +export PATH=$JAVA_HOME/bin:$ORIGINAL_PATH # clone cpswt-core and build it cd /home/cpswt git clone https://github.com/justinyeh1995/cpswt-core.git cd cpswt-core/cpswt-core -gradle wrapper --gradle-version=7.3 +gradle wrapper --gradle-version=7.5 ./gradlew :utils:publish ./gradlew :root:publish @@ -51,5 +55,5 @@ gradle wrapper --gradle-version=7.3 ./gradlew :fedmanager-host:build cd /home/cpswt/cpswt-core/examples/HelloWorldJava -gradle wrapper --gradle-version=7.4 -./gradlew :runFederation \ No newline at end of file +gradle wrapper --gradle-version=7.5 +./gradlew :runFederationBatch \ No newline at end of file From 8a435fd5394c2b444450e3d45736c9411dfcd157 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 22 Jun 2023 18:44:59 -0500 Subject: [PATCH 088/113] switch between java 8 & java 17 --- experiment_wrapper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experiment_wrapper.sh b/experiment_wrapper.sh index c3e4772..f444674 100644 --- a/experiment_wrapper.sh +++ b/experiment_wrapper.sh @@ -56,4 +56,4 @@ gradle wrapper --gradle-version=7.5 cd /home/cpswt/cpswt-core/examples/HelloWorldJava gradle wrapper --gradle-version=7.5 -./gradlew :runFederationBatch \ No newline at end of file +./gradlew :runFederation \ No newline at end of file From 3227afd5c6528cc80e554c249a66ae851a1f191c Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Mon, 26 Jun 2023 12:05:14 -0500 Subject: [PATCH 089/113] testing out gradle settings --- cpswt-core/config/gradle.properties | 9 --------- cpswt-core/federate-base/gradle.properties | 14 +++++++------- cpswt-core/federation-manager/gradle.properties | 9 --------- cpswt-core/fedmanager-host/gradle.properties | 9 --------- cpswt-core/gradle.properties | 15 ++++++++------- cpswt-core/root/gradle.properties | 9 --------- cpswt-core/utils/gradle.properties | 9 --------- examples/HelloWorldJava/gradle.properties | 14 +++++++------- 8 files changed, 22 insertions(+), 66 deletions(-) delete mode 100644 cpswt-core/config/gradle.properties delete mode 100644 cpswt-core/federation-manager/gradle.properties delete mode 100644 cpswt-core/fedmanager-host/gradle.properties delete mode 100644 cpswt-core/root/gradle.properties delete mode 100644 cpswt-core/utils/gradle.properties diff --git a/cpswt-core/config/gradle.properties b/cpswt-core/config/gradle.properties deleted file mode 100644 index 896d22f..0000000 --- a/cpswt-core/config/gradle.properties +++ /dev/null @@ -1,9 +0,0 @@ -archivaUser=admin -archivaPassword=adminpass123 -archivaHostId=localhost -archivaPort=8080 -version=0.7.0-SNAPSHOT - -org.gradle.console=plain - -omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file diff --git a/cpswt-core/federate-base/gradle.properties b/cpswt-core/federate-base/gradle.properties index 896d22f..d6dc3af 100644 --- a/cpswt-core/federate-base/gradle.properties +++ b/cpswt-core/federate-base/gradle.properties @@ -1,9 +1,9 @@ -archivaUser=admin -archivaPassword=adminpass123 -archivaHostId=localhost -archivaPort=8080 -version=0.7.0-SNAPSHOT +# archivaUser=admin +# archivaPassword=adminpass123 +# archivaHostId=localhost +# archivaPort=8080 +# version=0.7.0-SNAPSHOT -org.gradle.console=plain +# org.gradle.console=plain -omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file +# omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file diff --git a/cpswt-core/federation-manager/gradle.properties b/cpswt-core/federation-manager/gradle.properties deleted file mode 100644 index 896d22f..0000000 --- a/cpswt-core/federation-manager/gradle.properties +++ /dev/null @@ -1,9 +0,0 @@ -archivaUser=admin -archivaPassword=adminpass123 -archivaHostId=localhost -archivaPort=8080 -version=0.7.0-SNAPSHOT - -org.gradle.console=plain - -omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file diff --git a/cpswt-core/fedmanager-host/gradle.properties b/cpswt-core/fedmanager-host/gradle.properties deleted file mode 100644 index 896d22f..0000000 --- a/cpswt-core/fedmanager-host/gradle.properties +++ /dev/null @@ -1,9 +0,0 @@ -archivaUser=admin -archivaPassword=adminpass123 -archivaHostId=localhost -archivaPort=8080 -version=0.7.0-SNAPSHOT - -org.gradle.console=plain - -omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file diff --git a/cpswt-core/gradle.properties b/cpswt-core/gradle.properties index 7159e7b..6ab01ad 100644 --- a/cpswt-core/gradle.properties +++ b/cpswt-core/gradle.properties @@ -1,9 +1,10 @@ -archivaUser=admin -archivaPassword=adminpass123 -archivaHostId=localhost -archivaPort=8080 -version=0.7.0-SNAPSHOT +# archivaUser=admin +# archivaPassword=adminpass123 +# archivaHostId=localhost +# archivaPort=8080 +# version=0.7.0-SNAPSHOT -org.gradle.console=plain +# org.gradle.console=plain -omnetppHome=/opt/omnetpp-5.6.2 +# omnetppHome=/opt/omnetpp-5.6.2 +version=0.8.0-SNAPSHOT \ No newline at end of file diff --git a/cpswt-core/root/gradle.properties b/cpswt-core/root/gradle.properties deleted file mode 100644 index 896d22f..0000000 --- a/cpswt-core/root/gradle.properties +++ /dev/null @@ -1,9 +0,0 @@ -archivaUser=admin -archivaPassword=adminpass123 -archivaHostId=localhost -archivaPort=8080 -version=0.7.0-SNAPSHOT - -org.gradle.console=plain - -omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file diff --git a/cpswt-core/utils/gradle.properties b/cpswt-core/utils/gradle.properties deleted file mode 100644 index 7159e7b..0000000 --- a/cpswt-core/utils/gradle.properties +++ /dev/null @@ -1,9 +0,0 @@ -archivaUser=admin -archivaPassword=adminpass123 -archivaHostId=localhost -archivaPort=8080 -version=0.7.0-SNAPSHOT - -org.gradle.console=plain - -omnetppHome=/opt/omnetpp-5.6.2 diff --git a/examples/HelloWorldJava/gradle.properties b/examples/HelloWorldJava/gradle.properties index 896d22f..e269cef 100644 --- a/examples/HelloWorldJava/gradle.properties +++ b/examples/HelloWorldJava/gradle.properties @@ -1,9 +1,9 @@ -archivaUser=admin -archivaPassword=adminpass123 -archivaHostId=localhost -archivaPort=8080 -version=0.7.0-SNAPSHOT +# archivaUser=admin +# archivaPassword=adminpass123 +# archivaHostId=localhost +# archivaPort=8080 +version=0.8.0-SNAPSHOT -org.gradle.console=plain +# org.gradle.console=plain -omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file +# omnetppHome=/opt/omnetpp-5.6.2 From c071ec16a79a5b63df23e18938bbff292492120b Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Mon, 26 Jun 2023 12:15:05 -0500 Subject: [PATCH 090/113] batch mode --- experiment_wrapper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experiment_wrapper.sh b/experiment_wrapper.sh index f444674..c3e4772 100644 --- a/experiment_wrapper.sh +++ b/experiment_wrapper.sh @@ -56,4 +56,4 @@ gradle wrapper --gradle-version=7.5 cd /home/cpswt/cpswt-core/examples/HelloWorldJava gradle wrapper --gradle-version=7.5 -./gradlew :runFederation \ No newline at end of file +./gradlew :runFederationBatch \ No newline at end of file From d534d392b2572bca8ee6a9a4eddc6cce3991c887 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Mon, 26 Jun 2023 15:24:07 -0500 Subject: [PATCH 091/113] resolve global gradle properties --- Dockerfile | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index e8d6e65..ba8eb58 100644 --- a/Dockerfile +++ b/Dockerfile @@ -93,11 +93,10 @@ EXPOSE 8080/tcp STOPSIGNAL SIGINT # Set up Gradle properties -# ENV HOME="/root" -# RUN mkdir ${HOME}/.gradle/ -COPY gradle.properties ${GRADLE_HOME}/init.d/ -RUN chmod 600 ${GRADLE_HOME}/init.d/gradle.properties -# # Clone and build CPSWT packages +COPY gradle.properties /root/.gradle/ +RUN chmod 600 /root/.gradle/gradle.properties + +# Clone and build CPSWT packages RUN mkdir /home/cpswt COPY experiment_wrapper.sh /home/cpswt From 0a55b825659bb7b645e3053b98d13c5778f8c150 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Mon, 26 Jun 2023 17:17:30 -0500 Subject: [PATCH 092/113] add build --- experiment_wrapper.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/experiment_wrapper.sh b/experiment_wrapper.sh index c3e4772..cf05904 100644 --- a/experiment_wrapper.sh +++ b/experiment_wrapper.sh @@ -39,21 +39,24 @@ gradle wrapper --gradle-version=7.5 ./gradlew :utils:publish ./gradlew :root:publish ./gradlew :base-events:publish -./gradlew :coa:publish ./gradlew :config:publish ./gradlew :federate-base:publish +./gradlew :coa:publish ./gradlew :federation-manager:publish ./gradlew :fedmanager-host:publish ./gradlew :utils:build ./gradlew :root:build ./gradlew :base-events:build -./gradlew :coa:build ./gradlew :config:build ./gradlew :federate-base:build +./gradlew :coa:build ./gradlew :federation-manager:build ./gradlew :fedmanager-host:build cd /home/cpswt/cpswt-core/examples/HelloWorldJava gradle wrapper --gradle-version=7.5 +./gradlew :Source:build +./gradlew :Sink:build +./gradlew :PingCounter:build ./gradlew :runFederationBatch \ No newline at end of file From 8c2f35bb50f81e95e31bf08f823e92c5e6e18148 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Mon, 26 Jun 2023 17:40:18 -0500 Subject: [PATCH 093/113] delete unnecessary lines --- cpswt-core/federate-base/gradle.properties | 9 --------- cpswt-core/gradle.properties | 9 --------- examples/HelloWorldJava/gradle.properties | 8 -------- 3 files changed, 26 deletions(-) diff --git a/cpswt-core/federate-base/gradle.properties b/cpswt-core/federate-base/gradle.properties index d6dc3af..e69de29 100644 --- a/cpswt-core/federate-base/gradle.properties +++ b/cpswt-core/federate-base/gradle.properties @@ -1,9 +0,0 @@ -# archivaUser=admin -# archivaPassword=adminpass123 -# archivaHostId=localhost -# archivaPort=8080 -# version=0.7.0-SNAPSHOT - -# org.gradle.console=plain - -# omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file diff --git a/cpswt-core/gradle.properties b/cpswt-core/gradle.properties index 6ab01ad..b742408 100644 --- a/cpswt-core/gradle.properties +++ b/cpswt-core/gradle.properties @@ -1,10 +1 @@ -# archivaUser=admin -# archivaPassword=adminpass123 -# archivaHostId=localhost -# archivaPort=8080 -# version=0.7.0-SNAPSHOT - -# org.gradle.console=plain - -# omnetppHome=/opt/omnetpp-5.6.2 version=0.8.0-SNAPSHOT \ No newline at end of file diff --git a/examples/HelloWorldJava/gradle.properties b/examples/HelloWorldJava/gradle.properties index e269cef..65a82a4 100644 --- a/examples/HelloWorldJava/gradle.properties +++ b/examples/HelloWorldJava/gradle.properties @@ -1,9 +1 @@ -# archivaUser=admin -# archivaPassword=adminpass123 -# archivaHostId=localhost -# archivaPort=8080 version=0.8.0-SNAPSHOT - -# org.gradle.console=plain - -# omnetppHome=/opt/omnetpp-5.6.2 From 63bdb95e5fc9432a6323993d635f58a4e5869b14 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 27 Jun 2023 15:29:44 -0500 Subject: [PATCH 094/113] add timeout on waiting --- Jenkinsfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 39b9ea0..3359253 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -42,6 +42,9 @@ pipeline { } } stage('Wait for container to stop') { + options { + timeout(time: 30, unit: 'MINUTES') + } steps { echo 'Wait for container to stop' sh 'docker wait cpswt-core' From 4d6c279f989e44b6ee9274c4a201c49072ef96b5 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 29 Jun 2023 15:57:22 -0500 Subject: [PATCH 095/113] demo --- build.experient.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.experient.sh b/build.experient.sh index b728b9d..ba0ebd3 100644 --- a/build.experient.sh +++ b/build.experient.sh @@ -1,12 +1,12 @@ # docker network create cpswt-core docker run \ - --name cpswt-core2 \ + --name cpswt-core3 \ --restart=on-failure \ --detach \ --network cpswt-core \ --env DOCKER_HOST=tcp://docker:2376 \ --env DOCKER_CERT_PATH=/certs/client \ --env DOCKER_TLS_VERIFY=1 \ - --publish 8082:8080 \ + --publish 8083:8080 \ -v /var/run/docker.sock:/var/run/docker.sock \ - cpswt-core:latest2 \ No newline at end of file + cpswt-core:latest3 \ No newline at end of file From c65890bcd42c3a7e41f860e5ab4944960db054fa Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 29 Jun 2023 16:19:50 -0500 Subject: [PATCH 096/113] demo --- build.experient.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.experient.sh b/build.experient.sh index ba0ebd3..b728b9d 100644 --- a/build.experient.sh +++ b/build.experient.sh @@ -1,12 +1,12 @@ # docker network create cpswt-core docker run \ - --name cpswt-core3 \ + --name cpswt-core2 \ --restart=on-failure \ --detach \ --network cpswt-core \ --env DOCKER_HOST=tcp://docker:2376 \ --env DOCKER_CERT_PATH=/certs/client \ --env DOCKER_TLS_VERIFY=1 \ - --publish 8083:8080 \ + --publish 8082:8080 \ -v /var/run/docker.sock:/var/run/docker.sock \ - cpswt-core:latest3 \ No newline at end of file + cpswt-core:latest2 \ No newline at end of file From be2cbc8fcd277909aa76713d8b26dc62d1857f6b Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 29 Jun 2023 16:25:42 -0500 Subject: [PATCH 097/113] test timeout --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 3359253..9d7c097 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -43,7 +43,7 @@ pipeline { } stage('Wait for container to stop') { options { - timeout(time: 30, unit: 'MINUTES') + timeout(time: 1, unit: 'MINUTES') } steps { echo 'Wait for container to stop' From 5071c1870e141d258e94ddffffb3abe00c5cbbef Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 29 Jun 2023 16:26:00 -0500 Subject: [PATCH 098/113] demo --- build.experient.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.experient.sh b/build.experient.sh index b728b9d..ba0ebd3 100644 --- a/build.experient.sh +++ b/build.experient.sh @@ -1,12 +1,12 @@ # docker network create cpswt-core docker run \ - --name cpswt-core2 \ + --name cpswt-core3 \ --restart=on-failure \ --detach \ --network cpswt-core \ --env DOCKER_HOST=tcp://docker:2376 \ --env DOCKER_CERT_PATH=/certs/client \ --env DOCKER_TLS_VERIFY=1 \ - --publish 8082:8080 \ + --publish 8083:8080 \ -v /var/run/docker.sock:/var/run/docker.sock \ - cpswt-core:latest2 \ No newline at end of file + cpswt-core:latest3 \ No newline at end of file From e12b27201c26c1730abf428d587f3eb152179169 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Thu, 29 Jun 2023 16:42:26 -0500 Subject: [PATCH 099/113] 10 min timeout --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 9d7c097..a005633 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -43,7 +43,7 @@ pipeline { } stage('Wait for container to stop') { options { - timeout(time: 1, unit: 'MINUTES') + timeout(time: 10, unit: 'MINUTES') } steps { echo 'Wait for container to stop' From fe377d305e248a68c9554fec58f98e575e79bbae Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 4 Jul 2023 16:32:44 -0500 Subject: [PATCH 100/113] timeout at 20min --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index a005633..15f369a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -43,7 +43,7 @@ pipeline { } stage('Wait for container to stop') { options { - timeout(time: 10, unit: 'MINUTES') + timeout(time: 20, unit: 'MINUTES') } steps { echo 'Wait for container to stop' From ff781fc11c348801c6f31139420fec84f210cbde Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 4 Jul 2023 16:33:21 -0500 Subject: [PATCH 101/113] layout --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 15f369a..b51c3ca 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -71,7 +71,7 @@ pipeline { post { always { echo 'This will always run' - emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", attachLog: true, From 7813d9c093f5ce0ea40eeecadf1ade42b40e97cc Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 4 Jul 2023 16:33:33 -0500 Subject: [PATCH 102/113] layout --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index b51c3ca..374c9f2 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -74,8 +74,8 @@ pipeline { emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", - attachLog: true, - attachmentsPattern: 'cpswt-core.log' + attachLog: true, + attachmentsPattern: 'cpswt-core.log' } } } From a1dda628103dcc3209019a3e174f6ac6b3fa5296 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 20 Sep 2023 17:00:18 -0500 Subject: [PATCH 103/113] sync with cpswt-build --- Dockerfile | 4 +- Jenkinsfile | 140 ++++++++---------------------------------- README.md | 93 +++------------------------- experiment_wrapper.sh | 80 ++++++++++++++++++------ 4 files changed, 96 insertions(+), 221 deletions(-) diff --git a/Dockerfile b/Dockerfile index ba8eb58..e0d5856 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,6 +31,7 @@ RUN apt-get update && \ make \ mongodb \ mpi-default-dev \ + netcat \ openjdk-8-jdk \ openjdk-17-jdk \ openscenegraph-plugin-osgearth \ @@ -83,8 +84,6 @@ WORKDIR /opt RUN wget -O archiva.tar.gz https://archive.apache.org/dist/archiva/2.2.5/binaries/apache-archiva-2.2.5-bin.tar.gz && \ tar xf archiva.tar.gz && \ rm archiva.tar.gz -COPY wrapper-linux-aarch64-64 /opt/apache-archiva-2.2.5/bin/./ -RUN chmod +x /opt/apache-archiva-2.2.5/bin/wrapper-linux-aarch64-64 # Expose the Archiva port EXPOSE 8080/tcp @@ -103,4 +102,5 @@ COPY experiment_wrapper.sh /home/cpswt WORKDIR /home/cpswt # Start Archiva CMD [ "/usr/bin/bash", "experiment_wrapper.sh" ] +# CMD [ "/usr/bin/bash" ] diff --git a/Jenkinsfile b/Jenkinsfile index 374c9f2..4675cad 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,3 +1,13 @@ +// Do NOT place within the pipeline block +properties([ [ $class: 'ThrottleJobProperty', + categories: ['ci_cpswt_build'], + limitOneJobWithMatchingParams: false, + maxConcurrentPerNode: 1, + maxConcurrentTotal: 1, + paramsToUseForLimit: '', + throttleEnabled: true, + throttleOption: 'category' ] ]) + pipeline { agent any triggers { @@ -9,20 +19,15 @@ pipeline { steps { echo 'Cloning Forked CPSWT-Core..' deleteDir() // Delete workspace before cloning - git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' + sh 'git clone git@github.com:justinyeh1995/CI_with_Jenkins.git' } } stage('Build image') { steps { echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' - sh 'cd cpswt-core' - sh 'docker build -t cpswt-core:latest -f Dockerfile .' - } - } - stage('Check network') { - steps { - echo 'Checking if cpswt-core network is in docker network....' - sh 'docker network create --driver bridge cpswt-core || true' + dir("CI_with_Jenkins/cpswt-core") { + sh 'docker build -t cpswt-core:latest -f Dockerfile .' + } } } stage('Deploy image') { @@ -30,20 +35,13 @@ pipeline { echo 'Run the Docker Container inside Jenkins container' sh 'docker run \ --name cpswt-core \ - --restart=on-failure \ - --detach \ - --network cpswt-core \ - --env DOCKER_HOST=tcp://docker:2376 \ - --env DOCKER_CERT_PATH=/certs/client \ - --env DOCKER_TLS_VERIFY=1 \ - --publish 8081:8080 \ - -v /var/run/docker.sock:/var/run/docker.sock \ + -p 8080:8080 \ cpswt-core:latest' } } stage('Wait for container to stop') { options { - timeout(time: 20, unit: 'MINUTES') + timeout(time: 30, unit: 'MINUTES') } steps { echo 'Wait for container to stop' @@ -57,110 +55,20 @@ pipeline { archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true } } - stage('Clean up') { - steps { - echo 'Tearing Down the image & container....' - sh 'docker rm -f cpswt-core' - sh 'docker rmi cpswt-core:latest' - sh 'docker network rm cpswt-core' - sh 'rm -rf cpswt-core' - } - } } post { always { echo 'This will always run' emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", - attachLog: true, - attachmentsPattern: 'cpswt-core.log' + recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", + attachLog: true, + attachmentsPattern: 'cpswt-core.log' + echo 'Tearing Down the image & container....' + sh 'docker rm -f cpswt-core' + sh 'docker rmi cpswt-core:latest' + sh 'rm -rf cpswt-core' } } } - -// pipeline { -// agent any -// triggers { -// pollSCM('*/1 * * * *') // poll the SCM every 1 minute -// } - -// stages { -// stage('Clone repository') { -// steps { -// echo 'Cloning Forked CPSWT-Core..' -// deleteDir() // Delete workspace before cloning -// git url: 'https://github.com/justinyeh1995/cpswt-core.git', branch: 'develop' -// } -// } -// stage('Build image') { -// steps { -// echo 'Start a Docker Container for this experiment, which should start the experiment and an Archiva server, an Inet server, and an OMNeT++ server..' -// dir('cpswt-core') { -// docker.build('cpswt-core:latest') -// } -// } -// } -// stage('Check network') { -// steps { -// echo 'Checking if cpswt-core network is in Docker network....' -// script { -// def networkExists = sh(script: 'docker network ls | grep cpswt-core', returnStatus: true) -// if (networkExists == 0) { -// echo "cpswt-core network exists" -// } else { -// sh 'docker network create cpswt-core' -// } -// } -// } -// } -// stage('Deploy image') { -// steps { -// echo 'Run the Docker Container....' -// script { -// docker.image('cpswt-core:latest').withRun('--name cpswt-core \ -// --restart=on-failure \ -// --detach \ -// --network cpswt-core \ -// --env DOCKER_HOST=tcp://docker:2376 \ -// --env DOCKER_CERT_PATH=/certs/client \ -// --env DOCKER_TLS_VERIFY=1 \ -// --publish 8081:8080 \ -// -v /var/run/docker.sock:/var/run/docker.sock') { -// // Additional setup or commands inside the container if needed -// } -// } -// } -// } -// stage('Archive loggings') { -// steps { -// echo 'Archiving the results...' -// script { -// docker.image('cpswt-core:latest').inside('-v $PWD:/app') { -// sh 'docker logs cpswt-core > cpswt-core.log' -// } -// } -// archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true -// } -// } -// stage('Clean up') { -// steps { -// echo 'Tearing Down the image & container....' -// sh 'docker rm -f cpswt-core' -// sh 'docker rmi cpswt-core:latest' -// } -// } -// } - -// post { -// always { -// echo 'This will always run' -// emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", -// recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], -// subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", -// attachLog: true, -// attachmentsPattern: 'cpswt-core.log' -// } -// } -// } diff --git a/README.md b/README.md index 97c05cf..04d72e0 100644 --- a/README.md +++ b/README.md @@ -1,84 +1,9 @@ -# CPSWT Java Core - -The core implementation of the Cyber-Physical Systems Wind Tunnel (CPSWT), including integration of Java federates, -the federation manager, and COA management. - -Any Java-based federate will use the classes in this repository in order to execute. - -The primary projects relating to CPSWT functionality are as follows. Any projects not listed are under development -or are not currently being used. - -## cpswt-core/root: - -This project contains the Java base classes for Java classes that implement HLA interaction and object classes in CPSWT. -These Java base classes, **InteractionRoot** and **ObjectRoot**, actually contain all of the functionality needed to implement *any* HLA interaction or object class. -As such, they allow Java-based federates to use *dynamic messaging*: this enables the federates to manipulate any HLA interaction or object class instance using only -the InteractionRoot or ObjectRoot Java class, respectively. That is, an HLA interaction or object instance can be manipulated *without* an explicit corresponding Java class. - -## cpswt-core/base-events: -CPSWT comes with a set of built-in HLA interaction and object classes that are derived from InteractionRoot and ObjectRoot. These are (indentation shows inheritance): - -HLA Interactions: - - InteractionRoot - C2WInteractionRoot - ActionBase - EmbeddedMessaging - FederateJoinInteraction - FederateResignInteraction - OutcomeBase - SimLog - VeryLowPrio - LowPrio - MediumPrio - HighPrio - SimulationControl - SimPause - SimResume - SimEnd - -HLA Objects: - - ObjectRoot - FederateObject - - -base-events contains the explicit corresponding Java class implementations for these HLA classes. - -**EmbeddedMessaging** is a very important class as it allows the use of embedded messaging. Embedded messaging is a -level of indirection in the sending of interactions and object updates, i.e. the embedded message interaction can -contain another interaction, or an object update, within it. In particular, this allows object-updates to -be propagated through a simulated network in a network federate. - -## cpswt-core/coa - -This project contains the Java classes necessary to implement **Courses of Action (COA)**, i.e. behavior that is designed -into a federation via its federation model. - -## cpswt-core/config - -This project contains Java classes that read federate configuration files - -## cpswt-core/federate-base - -This project contain Java classes that implement behavior that all federates must have. Among them are: - -**SynchronizedFederate** -- the base class of all Java federates that are instantiated directly from their -representation in a CPSWT model. - -**InteractionMappingBase** and **InteractionMappingManager** -- classes that provide base functionality for **Mapper** -federates. - -## cpswt-core/federation-manager - -This project contains the Java classes that implement the FederationManager, which: - -* Is executed first for any federation -* Waits for all federates to join before proceeding with federate execution by using HLA synchronization points. - -## cpswt-core/utils - -This project contains various utility classes used by other projects. - -## jenkins support -Ref: [youtube video](https://www.youtube.com/watch?v=6YZvp2GwT0A&t=457s) +## Build Image +```sh +docker build -t cpswt-core:lts -f Dockerfile . +``` + +## Run +```sh +docker run -it --rm -p 8081:8080 -v /var/run/docker.sock:/var/run/docker.sock cpswt-core:lts +``` \ No newline at end of file diff --git a/experiment_wrapper.sh b/experiment_wrapper.sh index cf05904..d6b1ac5 100644 --- a/experiment_wrapper.sh +++ b/experiment_wrapper.sh @@ -1,12 +1,20 @@ # this script is used to build cpswt-core and its dependencies in the docker container ORIGINAL_PATH=$PATH -export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-arm64 +export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH + /opt/apache-archiva-2.2.5/bin/archiva start # wait for archiva to start -# nc -zv localhost 8080 -sleep 20 +# wait for archiva to start +echo "Waiting archiva to launch on 8080..." + +while ! nc -z localhost 8080; do + sleep 0.1 # wait for 1/10 of the second before check again +done + +echo "archiva launched" + # create admin user curl --no-progress-meter -X POST -H "Content-Type: application/json" -H "Origin: http://localhost:8080" -d @- \ http://localhost:8080/restServices/redbackServices/userService/createAdminUser <<'TERMINUS' @@ -24,36 +32,70 @@ curl --no-progress-meter -X POST -H "Content-Type: application/json" -H "Origin: } TERMINUS +# disable rest.csrffilter.enabled in archiva.xml +sed -i '//,/<\/csrffilter>/s/true/false/' /opt/apache-archiva-2.2.5/conf/archiva.xml +# sed -i 's//http:\/\/129.59.107.97\/archiva-core\/<\/baseUrl>/' /opt/apache-archiva-2.2.5/conf/archiva.xml + +# # restart archiva +/opt/apache-archiva-2.2.5/bin/archiva stop +/opt/apache-archiva-2.2.5/bin/archiva start + +echo "Waiting archiva to launch again on 8080..." + +while ! nc -z localhost 8080; do + sleep 0.1 # wait for 1/10 of the second before check again +done + +echo "archiva launched again" + # switch to java 17 unset JAVA_HOME -export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-arm64 +export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64 export PATH=$JAVA_HOME/bin:$ORIGINAL_PATH # clone cpswt-core and build it cd /home/cpswt -git clone https://github.com/justinyeh1995/cpswt-core.git +git clone https://github.com/SimIntToolkit/cpswt-core.git cd cpswt-core/cpswt-core gradle wrapper --gradle-version=7.5 +ARCHIVA_REPO_URL="http://localhost:8080/repository/snapshots/0.7.0-SNAPSHOT/" + +# sh ./cpswt-redeploy.sh +./gradlew :utils:build --rerun-tasks --refresh-dependencies ./gradlew :utils:publish +echo "utils published" + +./gradlew :root:build --rerun-tasks --refresh-dependencies ./gradlew :root:publish -./gradlew :base-events:publish +echo "root published" + +./gradlew :base-events:build --rerun-tasks --refresh-dependencies +./gradlew :base-events:publish +echo "base-events published" + +./gradlew :config:build --rerun-tasks --refresh-dependencies ./gradlew :config:publish -./gradlew :federate-base:publish -./gradlew :coa:publish -./gradlew :federation-manager:publish -./gradlew :fedmanager-host:publish - -./gradlew :utils:build -./gradlew :root:build -./gradlew :base-events:build -./gradlew :config:build -./gradlew :federate-base:build -./gradlew :coa:build -./gradlew :federation-manager:build -./gradlew :fedmanager-host:build +echo "config published" + +./gradlew :federate-base:build --rerun-tasks --refresh-dependencies +./gradlew :federate-base:publish +echo "federate-base published" + +./gradlew :coa:build --rerun-tasks --refresh-dependencies +./gradlew :coa:publish +echo "coa published" + +./gradlew :federation-manager:build --rerun-tasks --refresh-dependencies +./gradlew :federation-manager:publish +echo "federation-manager published" + +./gradlew :fedmanager-host:build --rerun-tasks --refresh-dependencies +./gradlew :fedmanager-host:publish +echo "fedmanager-host published" +# run the HelloWorldJava example cd /home/cpswt/cpswt-core/examples/HelloWorldJava gradle wrapper --gradle-version=7.5 ./gradlew :Source:build From 88f3e3c12ecb79f45960e21d278294d8522ca070 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 20 Sep 2023 17:02:16 -0500 Subject: [PATCH 104/113] remove unnessesary files --- archiva.service | 14 -------------- build.experient.sh | 12 ------------ wrapper-linux-aarch64-64 | Bin 430680 -> 0 bytes 3 files changed, 26 deletions(-) delete mode 100644 archiva.service delete mode 100644 build.experient.sh delete mode 100644 wrapper-linux-aarch64-64 diff --git a/archiva.service b/archiva.service deleted file mode 100644 index 7eae47a..0000000 --- a/archiva.service +++ /dev/null @@ -1,14 +0,0 @@ -[Unit] -Description=Archiva Server -Documentation=https://archiva.apache.org/docs/2.2.5/ -After=network.target - -[Service] -Type=forking -PIDFile=/opt/apache-archiva-2.2.5/logs/archiva.pid -WorkingDirectory=/opt/apache-archiva-2.2.5 -ExecStart=/opt/apache-archiva-2.2.5/bin/archiva start -ExecStop=/opt/apache-archiva-2.2.5/bin/archiva stop - -[Install] -WantedBy=multi-user.target diff --git a/build.experient.sh b/build.experient.sh deleted file mode 100644 index ba0ebd3..0000000 --- a/build.experient.sh +++ /dev/null @@ -1,12 +0,0 @@ -# docker network create cpswt-core -docker run \ - --name cpswt-core3 \ - --restart=on-failure \ - --detach \ - --network cpswt-core \ - --env DOCKER_HOST=tcp://docker:2376 \ - --env DOCKER_CERT_PATH=/certs/client \ - --env DOCKER_TLS_VERIFY=1 \ - --publish 8083:8080 \ - -v /var/run/docker.sock:/var/run/docker.sock \ - cpswt-core:latest3 \ No newline at end of file diff --git a/wrapper-linux-aarch64-64 b/wrapper-linux-aarch64-64 deleted file mode 100644 index 9d6101930e4b4f789b3b222a74209c8a02f4c3a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430680 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%0A}g!FY9 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 From 387ba9042819e9cbb1b6965e295f86c8488b7739 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 20 Sep 2023 17:04:29 -0500 Subject: [PATCH 105/113] align with SimIntToolkit/cpswt-core --- README.md | 90 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 04d72e0..e843274 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,81 @@ -## Build Image -```sh -docker build -t cpswt-core:lts -f Dockerfile . -``` - -## Run -```sh -docker run -it --rm -p 8081:8080 -v /var/run/docker.sock:/var/run/docker.sock cpswt-core:lts -``` \ No newline at end of file +# CPSWT Java Core + +The core implementation of the Cyber-Physical Systems Wind Tunnel (CPSWT), including integration of Java federates, +the federation manager, and COA management. + +Any Java-based federate will use the classes in this repository in order to execute. + +The primary projects relating to CPSWT functionality are as follows. Any projects not listed are under development +or are not currently being used. + +## cpswt-core/root: + +This project contains the Java base classes for Java classes that implement HLA interaction and object classes in CPSWT. +These Java base classes, **InteractionRoot** and **ObjectRoot**, actually contain all of the functionality needed to implement *any* HLA interaction or object class. +As such, they allow Java-based federates to use *dynamic messaging*: this enables the federates to manipulate any HLA interaction or object class instance using only +the InteractionRoot or ObjectRoot Java class, respectively. That is, an HLA interaction or object instance can be manipulated *without* an explicit corresponding Java class. + +## cpswt-core/base-events: +CPSWT comes with a set of built-in HLA interaction and object classes that are derived from InteractionRoot and ObjectRoot. These are (indentation shows inheritance): + +HLA Interactions: + + InteractionRoot + C2WInteractionRoot + ActionBase + EmbeddedMessaging + FederateJoinInteraction + FederateResignInteraction + OutcomeBase + SimLog + VeryLowPrio + LowPrio + MediumPrio + HighPrio + SimulationControl + SimPause + SimResume + SimEnd + +HLA Objects: + + ObjectRoot + FederateObject + + +base-events contains the explicit corresponding Java class implementations for these HLA classes. + +**EmbeddedMessaging** is a very important class as it allows the use of embedded messaging. Embedded messaging is a +level of indirection in the sending of interactions and object updates, i.e. the embedded message interaction can +contain another interaction, or an object update, within it. In particular, this allows object-updates to +be propagated through a simulated network in a network federate. + +## cpswt-core/coa + +This project contains the Java classes necessary to implement **Courses of Action (COA)**, i.e. behavior that is designed +into a federation via its federation model. + +## cpswt-core/config + +This project contains Java classes that read federate configuration files + +## cpswt-core/federate-base + +This project contain Java classes that implement behavior that all federates must have. Among them are: + +**SynchronizedFederate** -- the base class of all Java federates that are instantiated directly from their +representation in a CPSWT model. + +**InteractionMappingBase** and **InteractionMappingManager** -- classes that provide base functionality for **Mapper** +federates. + +## cpswt-core/federation-manager + +This project contains the Java classes that implement the FederationManager, which: + +* Is executed first for any federation +* Waits for all federates to join before proceeding with federate execution by using HLA synchronization points. + +## cpswt-core/utils + +This project contains various utility classes used by other projects. From d9109a3da128308ce6cced0ff818f9bc2271cbce Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 20 Sep 2023 17:08:39 -0500 Subject: [PATCH 106/113] forked repo -> main repo --- Jenkinsfile | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 4675cad..e04965a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,13 +1,3 @@ -// Do NOT place within the pipeline block -properties([ [ $class: 'ThrottleJobProperty', - categories: ['ci_cpswt_build'], - limitOneJobWithMatchingParams: false, - maxConcurrentPerNode: 1, - maxConcurrentTotal: 1, - paramsToUseForLimit: '', - throttleEnabled: true, - throttleOption: 'category' ] ]) - pipeline { agent any triggers { @@ -19,13 +9,13 @@ pipeline { steps { echo 'Cloning Forked CPSWT-Core..' deleteDir() // Delete workspace before cloning - sh 'git clone git@github.com:justinyeh1995/CI_with_Jenkins.git' + sh 'git clone git@github.com:SimIntToolkit/cpswt-core.git' } } stage('Build image') { steps { echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' - dir("CI_with_Jenkins/cpswt-core") { + dir("cpswt-core") { sh 'docker build -t cpswt-core:latest -f Dockerfile .' } } From 9c4878027b5e9d5dc1c2df40b64191f084574258 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Wed, 20 Sep 2023 17:09:38 -0500 Subject: [PATCH 107/113] forked repo -> main repo --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index e04965a..4548482 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,7 +7,7 @@ pipeline { stages { stage('Clone repository') { steps { - echo 'Cloning Forked CPSWT-Core..' + echo 'Cloning CPSWT-Core..' deleteDir() // Delete workspace before cloning sh 'git clone git@github.com:SimIntToolkit/cpswt-core.git' } From c75e653ebe6690f887f5fdb9133ec613889bb09a Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 3 Oct 2023 22:08:34 +0000 Subject: [PATCH 108/113] Jenkins Pipeline Setup --- Jenkinsfile | 18 ++++++++--- README.md | 90 ++++++----------------------------------------------- 2 files changed, 23 insertions(+), 85 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 4548482..1afaf90 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,3 +1,13 @@ +// Do NOT place within the pipeline block +properties([ [ $class: 'ThrottleJobProperty', + categories: ['ci_cpswt_build'], + limitOneJobWithMatchingParams: false, + maxConcurrentPerNode: 1, + maxConcurrentTotal: 1, + paramsToUseForLimit: '', + throttleEnabled: true, + throttleOption: 'category' ] ]) + pipeline { agent any triggers { @@ -7,15 +17,15 @@ pipeline { stages { stage('Clone repository') { steps { - echo 'Cloning CPSWT-Core..' + echo 'Cloning Forked CPSWT-Core..' deleteDir() // Delete workspace before cloning - sh 'git clone git@github.com:SimIntToolkit/cpswt-core.git' + sh 'git clone git@github.com:justinyeh1995/CI_with_Jenkins.git' } } stage('Build image') { steps { echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' - dir("cpswt-core") { + dir("CI_with_Jenkins/cpswt-core") { sh 'docker build -t cpswt-core:latest -f Dockerfile .' } } @@ -25,7 +35,7 @@ pipeline { echo 'Run the Docker Container inside Jenkins container' sh 'docker run \ --name cpswt-core \ - -p 8080:8080 \ + -p 8081:8080 \ cpswt-core:latest' } } diff --git a/README.md b/README.md index e843274..04d72e0 100644 --- a/README.md +++ b/README.md @@ -1,81 +1,9 @@ -# CPSWT Java Core - -The core implementation of the Cyber-Physical Systems Wind Tunnel (CPSWT), including integration of Java federates, -the federation manager, and COA management. - -Any Java-based federate will use the classes in this repository in order to execute. - -The primary projects relating to CPSWT functionality are as follows. Any projects not listed are under development -or are not currently being used. - -## cpswt-core/root: - -This project contains the Java base classes for Java classes that implement HLA interaction and object classes in CPSWT. -These Java base classes, **InteractionRoot** and **ObjectRoot**, actually contain all of the functionality needed to implement *any* HLA interaction or object class. -As such, they allow Java-based federates to use *dynamic messaging*: this enables the federates to manipulate any HLA interaction or object class instance using only -the InteractionRoot or ObjectRoot Java class, respectively. That is, an HLA interaction or object instance can be manipulated *without* an explicit corresponding Java class. - -## cpswt-core/base-events: -CPSWT comes with a set of built-in HLA interaction and object classes that are derived from InteractionRoot and ObjectRoot. These are (indentation shows inheritance): - -HLA Interactions: - - InteractionRoot - C2WInteractionRoot - ActionBase - EmbeddedMessaging - FederateJoinInteraction - FederateResignInteraction - OutcomeBase - SimLog - VeryLowPrio - LowPrio - MediumPrio - HighPrio - SimulationControl - SimPause - SimResume - SimEnd - -HLA Objects: - - ObjectRoot - FederateObject - - -base-events contains the explicit corresponding Java class implementations for these HLA classes. - -**EmbeddedMessaging** is a very important class as it allows the use of embedded messaging. Embedded messaging is a -level of indirection in the sending of interactions and object updates, i.e. the embedded message interaction can -contain another interaction, or an object update, within it. In particular, this allows object-updates to -be propagated through a simulated network in a network federate. - -## cpswt-core/coa - -This project contains the Java classes necessary to implement **Courses of Action (COA)**, i.e. behavior that is designed -into a federation via its federation model. - -## cpswt-core/config - -This project contains Java classes that read federate configuration files - -## cpswt-core/federate-base - -This project contain Java classes that implement behavior that all federates must have. Among them are: - -**SynchronizedFederate** -- the base class of all Java federates that are instantiated directly from their -representation in a CPSWT model. - -**InteractionMappingBase** and **InteractionMappingManager** -- classes that provide base functionality for **Mapper** -federates. - -## cpswt-core/federation-manager - -This project contains the Java classes that implement the FederationManager, which: - -* Is executed first for any federation -* Waits for all federates to join before proceeding with federate execution by using HLA synchronization points. - -## cpswt-core/utils - -This project contains various utility classes used by other projects. +## Build Image +```sh +docker build -t cpswt-core:lts -f Dockerfile . +``` + +## Run +```sh +docker run -it --rm -p 8081:8080 -v /var/run/docker.sock:/var/run/docker.sock cpswt-core:lts +``` \ No newline at end of file From 6f04e5b0a471955b3b8df246d3e85edfe4274eff Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Tue, 3 Oct 2023 22:27:08 +0000 Subject: [PATCH 109/113] update readme --- README.md | 473 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 466 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 04d72e0..84ddb02 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,468 @@ -## Build Image -```sh -docker build -t cpswt-core:lts -f Dockerfile . +# Project `"cpswt-core"` for CPSWT + +The cpswt-core project contains all software needed to run Java-based federates in CPSWT. + +> ##### Table of Contents +> +> * [Project `"cpswt-core"` for CPSWT](#project-cpswt-core-for-cpswt) +> * [Constituent Modules](#constituent-modules) +> * [cpswt-core/root](#cpswt-core-root) +> * [cpswt-core/base-events](#cpswt-core-base-events) +> * [cpswt-core/coa](#cpswt-core-coa) +> * [cpswt-core/config](#cpswt-core-config) +> * [cpswt-core/federate-base](#cpswt-core-federate-base) +> * [cpswt-core/federation-manager](#cpswt-core-federation-manager) +> * [cpswt-core/utils](#cpswt-core-utils) +> * [CPSWT Software Installation and Instructions to Build and Publish cpswt-core Modules on Ubuntu 20.04 LTS (Focal Fossa)](#cpswt-software-installation-and-instructions-to-build-and-publish-cpswt-core-modules-on-ubuntu-20-04-lts-focal-fossa) +> * [General Software Installation](#general-software-installation) +> * [Install Needed Packages](#install-needed-packages) +> * [Install Portico 2.1.0](#install-portico-2-1-0) +> * [Install Apache Archiva version 2.2.5](#install-apache-archiva-version-2-2-5) +> * [Software for Java-based Federates](#software-for-java-based-federates) +> * [Working with Gradle](#working-with-gradle) +> * [Build CPSWT Java Packages and Publish to Archiva](#build-cpswt-java-packages-and-publish-to-archiva) + +## Constituent Modules + +`cpswt-core` contains the core modules for the implementation of the Cyber-Physical Systems Wind Tunnel (CPSWT). +In particular, it contains modules to allows Java-based federates to participate in federations, +the federation manager module which is responsible for coordinating federation execution, and a +module for COA management. + +The modules used for CPSWT functionality are as follows. Any modules not listed are under development or are not currently being used. + +### cpswt-core/root + +This module contains the Java base classes for Java classes that implement HLA interaction and object classes in +CPSWT. These Java base classes, **InteractionRoot** and **ObjectRoot**, actually contain all of the functionality +needed to implement *any* HLA interaction or object class in Java. Importantly, they allow Java-based federates to use +*dynamic messaging*: this enables the federates to manipulate any HLA interaction or object class instance using only +the InteractionRoot or ObjectRoot Java base classes, respectively. That is, an HLA interaction or object instance +can be manipulated without an explicit corresponding Java class. + +### cpswt-core/base-events + +The modules contains HLA interaction and object classes that are “built-in” to CPSWT. These classes are derived from InteractionRoot and ObjectRoot. + +**Class List (indentation shows inheritance):** + +HLA Interactions: + +```default +InteractionRoot + C2WInteractionRoot + ActionBase + EmbeddedMessaging + FederateJoinInteraction + FederateResignInteraction + OutcomeBase + SimLog + VeryLowPrio + LowPrio + MediumPrio + HighPrio + SimulationControl + SimPause + SimResume + SimEnd +``` + +HLA Objects: + +```default +ObjectRoot + FederateObject +``` + +### cpswt-core/coa + +This module contains the Java classes necessary to implement **Courses of Action (COA)**, +i.e. complex behavior that is designed into a federation via its federation model. + +### cpswt-core/config + +This module contains Java classes that determine the contents of federate configuration files, as well as read them. + +### cpswt-core/federate-base + +This module contain Java classes that implement behavior that all federates must have. Among them are: + +* **SynchronizedFederate** – the base class of all Java federates that are instantiated directly from their representation in a CPSWT model. +* **InteractionMappingBase** and **InteractionMappingManager** – classes that provide base functionality for Mapper federates. + +### cpswt-core/federation-manager + +This module contains the Java classes that implement the FederationManager, which: + +* Must be executed first for any federation +* Coordinates the execution of all federates in the federation so that they all initialize themselves and start + execution simultaneously. + +### cpswt-core/utils + +This module contains various utility classes used by the other modules. + + + +## CPSWT Software Installation and Instructions to Build and Publish cpswt-core Modules on Ubuntu 20.04 LTS (Focal Fossa) + +> ##### Table of Contents +> +> * [General Software Installation](#general-software-installation) +> * [Install Needed Packages](#install-needed-packages) +> * [Install Portico 2.1.0](#install-portico-2-1-0) +> * [Install Apache Archiva version 2.2.5](#install-apache-archiva-version-2-2-5) +> * [Software for Java-based Federates](#software-for-java-based-federates) +> * [Working with Gradle](#working-with-gradle) +> * [Build CPSWT Java Packages and Publish to Archiva](#build-cpswt-java-packages-and-publish-to-archiva) + +The following CPSWT installation instructions were performed on a VirtualBox VM with 128 GB Disk and 12GB RAM. + +Currently, only Ubuntu 20.04 LTS (Focal Fossa) is supported. + +#### NOTE +There are several text boxes in the instructions below that contain commands that you need to execute at the shell command-line. + +To copy any of these commands, hover over the textbox and a small “copy” button will appear at the right of the textbox +(two rounded rectangles, one on top of the other). Press this button, and the command will be copied to your +clipboard. + +Then, to paste the command in your shell, select your shell window and press SHIFT-CTRL-V. + +### General Software Installation + +This sections contains instructions for the installation of 3rd-party software that is needed to run CPSWT federations. + +#### Install Needed Packages + +1. After initial install of Ubuntu 20.04 LTS, be sure to upgrade all of the currently installed packages: + 1. Execute the following command to update the available packages for your Ubuntu installation: + ```bash + sudo apt update + ``` + 2. Execute the following command to upgrade all of the currently installed packages in your Ubuntu installation: + ```bash + sudo apt upgrade -y + ``` + + +1. The following packages must be installed: + * apt-transport-https + * bison + * build-essential + * ca-certificates + * clang + * curl + * doxygen + * flex + * gcc + * gdb + * git + * gradle + * graphviz + * libboost1.71-all-dev + * libcppunit-dev + * libjsoncpp-dev + * libosgearth-dev + * libqt5opengl5-dev + * libwebkit2gtk-4.0-37 + * libxml2-dev + * lld + * make + * mongodb + * mpi-default-dev + * openjdk-8-jdk + * openjdk-17-jdk + * openscenegraph-plugin-osgearth + * perl + * python2 + * python3 + * python3-pip + * python-is-python2 + * qt5-qmake + * qtbase5-dev + * qtbase5-dev-tools + * qtchooser + * software-properties-common + * wget + * xterm + * zlib1g-dev + + They can be installed with the following command: + ```bash + sudo apt install -y apt-transport-https bison build-essential ca-certificates clang curl doxygen flex gcc gdb git gradle graphviz libboost1.71-all-dev libcppunit-dev libjsoncpp-dev libosgearth-dev libqt5opengl5-dev libwebkit2gtk-4.0-37 libxml2-dev lld make mongodb mpi-default-dev openjdk-8-jdk openjdk-17-jdk openscenegraph-plugin-osgearth perl python2 python3 python3-pip python-is-python2 qt5-qmake qtbase5-dev qtbase5-dev-tools qtchooser software-properties-common wget xterm zlib1g-dev + ``` +2. The following python packages (for python3) must also be installed: + * jinja2 + * matplotlib + * numpy + * pandas + * posix_ipc + * python-dateutil + * scipy + * seaborn + * webgme-bindings + + They can be installed with the following command: + ```bash + sudo python3 -m pip install --system --upgrade jinja2 matplotlib numpy pandas posix_ipc python-dateutil scipy seaborn webgme-bindings + ``` +3. Set `java-17-openjdk-amd64` to be the default java used by your system by executing the following command: + ```bash + sudo update-java-alternatives -s java-1.17.0-openjdk-amd64 + ``` + + #### NOTE + Ignore any errors output by the above command. +4. There will be several modifications to your `.bashrc` file in these instructions. The first is set your `JAVA_HOME` to the directory of your + `Java` installation. + + Granted the `openjdk-17-jdk` package was installed in step 1, the following command should be appended to your `.bashrc` file in your home directory: + ```bash + export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 + ``` + + #### NOTE + To see a list of all environment variables that need to be defined or modified in your `.bashrc` file, + see environmentvariablesummary at the end of this document. + + + + #### NOTE + Whenever command is added in your `.bashrc` file, it will only have an effect when you spawn and use a new shell, and this effect is needed **immediately**. + So, whenever a command is added to your `.bashrc` in these instructions either: + * Kill your current shell, spawn a new one, and use this new shell to continue with these installation instructions. + * Type the command directly into your current shell, in this case + + *export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64*. + +#### Install Portico 2.1.0 + +1. As these instructions are being written, a compressed tarball to install Portico version 2.1.0 can be downloaded by typing the following + URL into your Google Chrome web brower. + ```bash + https://master.dl.sourceforge.net/project/portico/Portico/portico-2.1.0/portico-2.1.0-linux64.tar.gz?viasf=1 + ``` + + However, if this link does not work, you should be able to download the Portico version 2.1.0 as follows: + 1. Go to [https://porticoproject.org](https://porticoproject.org) using your Google Chrome web browser + 2. Click on `portico-2.1.0-linux64.tar.gz` at the right side of the resulting page, under `Linux 64-bit` and `May 6th` + 3. On the resulting page, click on `portico-2.1.0-linux64.tar.gz` + 4. The file `portico-2.1.0-linux64.tar.gz` should be downloaded into your `Downloads` directory under your home directory. +2. Execute the following commands to untar the `portico-2.1.0-linux64.tar.gz` tarball into your home directory: + ```bash + cd + tar xf /Downloads/portico-2.1.0-linux64.tar.gz + ``` +3. Append the following command to your `.bashrc` file: + ```bash + export RTI_HOME="/portico-2.1.0" + ``` + + After doing this [remember](#modify-environment) to either kill your current shell and spawn a new one or type this command into your current shell. + + #### NOTE + To see a list of all environment variables that need to be defined or modified in your `.bashrc` file, + see environmentvariablesummary + + + +#### Install Apache Archiva version 2.2.5 + +1. As these instructions are being written, a compressed tarball to install Apache Archiva version 2.2.5 can be downloaded by typing the following + URL into your Google Chrome web brower. + ```bash + https://archive.apache.org/dist/archiva/2.2.5/binaries/apache-archiva-2.2.5-bin.tar.gz + ``` + + However, if this link does not work, you should be able to download the Apache Archiva version 2.2.5 as follows: + 1. Go to [https://archiva.apache.org](https://archiva.apache.org) using your Google Chrome web browser + 2. Click on the `Introduction` menu item at the top of the resulting page + 3. On the resulting dropdown menu, click on `Downloads` + 4. In the `Previous Versions` section of the resulting page, click on `Apache Archiva Archives` + 5. On the resulting page, click on `2.2.5/` + 6. On the resulting page, click on `binaries/` + 7. On the resulting page, click on `apache-archiva-2.2.5-bin.tar.gz` + 8. The file `apache-archiva-2.2.5-bin.tar.gz` should be downloaded into your `Downloads` directory under your home directory. +2. Untar the `apache-archiva-2.2.5-bin.tar.gz` tarball into your `/opt` directory: + 1. Become `root` using the following command: + ```bash + sudo su - + ``` + 2. Change your current directory to the `/opt` directory: + ```bash + cd /opt + ``` + 3. Untar the `apache-archiva-2.2.5-bin.tar.gz` tarball: + ```bash + tar xf /Downloads/apache-archiva-2.2.5-bin.tar.gz + ``` + 4. DON’T EXIT OUT OF THE `root` USER ID YET – GO TO THE NEXT STEP BELOW +3. Start the Archiva server and set up Archiva to execute on boot: + 1. Edit the file `/etc/systemd/system/archiva.service` using your favorite editor *by executing the editor from the command-line, i.e. as root*. + It should not exist yet, and so should be created when you edit it. + 2. Place the following text in this file: + ```bash + [Unit] + Description=Archiva Server + Documentation=https://archiva.apache.org/docs/2.2.5/ + After=network.target + + [Service] + Type=forking + PIDFile=/opt/apache-archiva-2.2.5/logs/archiva.pid + WorkingDirectory=/opt/apache-archiva-2.2.5 + ExecStart=bash -ic "export PATH=/usr/lib/jvm/java-8-openjdk-amd64/bin:$PATH ; exec /opt/apache-archiva-2.2.5/bin/archiva start" + ExecStop=/opt/apache-archiva-2.2.5/bin/archiva stop + + [Install] + WantedBy=multi-user.target + ``` + + > 1. Save the file and exit the editor + > 2. Type the following two commands at the root shell prompt: + > ```bash + > systemctl enable archiva + > systemctl start archiva + > ``` + > 3. Exit out of the `root` userid: + > ```bash + > exit + > ``` + > 4. The Archiva server should now be started and will start automatically on boot. +4. Test and set up the Archiva server: + 1. Using your Google Chrome web browser, go to [http://localhost:8080](http://localhost:8080). The resulting page should be the Archiva home page for your Archiva server. + > #### NOTE + > Archiva can take several seconds to start up. If your browser reports that it cannot load the page, or the page is taking a long time to load, + > wait 60 seconds (ample time) and try again. + 2. In the upper right-hand corner of you Archiva server’s home page, click `Create Admin User` + 3. On the resulting page, enter the following information: + * Username: `admin` + * Full Name: `` + * Password: `adminpass123` + * Confirm Password: `adminpass123` + * Email Address: `` + * Validated: `` + * Locked: `` + * Change password required: `` + 4. Press the `Save` button + 5. Archiva is good to go! + +#### NOTE +It is important that you use `admin` and `adminpass123` as your Archiva administrator username and password, respectively, +as they are used in other parts of these instructions. + +### Software for Java-based Federates + +The following instructions show how to install, build and publish software needed to use Java-based federates in CPSWT. + +#### Working with Gradle + +Gradle is the build tool the CPSWT project uses to build, test, and publish its software to the [installed Archiva repository on your system](#archiva-install). + +For Gradle to work properly in this capacity, the following steps must be performed: + +1. Create the `.gradle` directory under your home directory, if it doesn’t already exist, by executing the following commands: + ```bash + cd + mkdir .gradle + ``` +2. Edit the /.gradle/gradle.properties file using your favorite editor and give it the contents below: + ```bash + archivaUser=admin + archivaPassword=adminpass123 + archivaHostId=localhost + archivaPort=8080 + version=0.8.0-SNAPSHOT + + org.gradle.console=plain + + omnetppHome=/opt/omnetpp-5.6.2 + ``` + + +3. IMPORTANT: to execute gradle to build/test/publish software, we will be using the `gradle wrapper` executable, which will reside in the directories + where we perform the building/testing/publishing. + + #### NOTE + DO NOT EXECUTE the following two commands below – they’re only there to show how to set up the `gradle wrapper` + + 1. To set up the `gradle wrapper` executable, change to the given directory (this happens in a few places below) and execute the + following command in your shell: + ```default + gradle wrapper --gradle-version=8.0 + ``` + 2. To execute the gradle-wrapper, use the following command while in the given directory: + ```default + ./gradlew [arguments] + ``` + +#### Build CPSWT Java Packages and Publish to Archiva + + + +#### NOTE +To build CPSWT Packages and publish them to Archiva, we first need to clone the git repositories where they reside. +To do this, it is best to create a directory under your home directory where all needed CPSWT git repositories will be cloned (there 3 total +needed for these instructions). + +It is recommended that you call this directory `cpswt`. To create it, enter the following commands: + +```default +cd +mkdir cpswt ``` -## Run -```sh -docker run -it --rm -p 8081:8080 -v /var/run/docker.sock:/var/run/docker.sock cpswt-core:lts -``` \ No newline at end of file +This directory will be referred to as `` for the remainder of these instructions. + +**IMPORTANT**: `` is an *absolute path* , not a relative path. For instance, if +you made `` the cpswt directory under ``, then `` +represents “`/cpswt`”. + +1. Clone the cpswt-core git repository: + 1. Change your directory to <[CPSWT-HOME](#cpswt-home)>: + ```bash + cd + ``` + 2. Clone the repository: + ```bash + git clone git@github.com:SimIntToolkit/cpswt-core.git + ``` +2. Change to the `/cpswt-core/cpswt-core` directory (*you read that right – cpswt-core appears twice*): + ```bash + cd /cpswt-core/cpswt-core + ``` +3. Install the [gradle wrapper](#gradle-wrapper): + ```bash + gradle wrapper --gradle-version=8.0 + ``` +4. Execute the following sequence of commands **in order**: + ```bash + ./gradlew :utils:publish + ./gradlew :root:publish + ./gradlew :base-events:publish + ./gradlew :coa:publish + ./gradlew :config:publish + ./gradlew :federate-base:publish + ./gradlew :federation-manager:publish + ./gradlew :fedmanager-host:publish + ``` +5. To test if the Java packages have been published to Archiva, do the following: + 1. Go to `http://localhost:8080` using your Google Chrome browser + 2. On the resulting page, click on `Browse` in the upper left-hand corner under `Artifacts` + 3. Under `Browse Repository` in the top-middle-left of the page, click on the small down-arrow on the right side of a small textbox. + 4. In the resulting drop-down menu, click `Archive Managed Snapshot Repository` + 5. Click on `org.cpswt`, which should be a short ways down the page from `Browse Repository` mentioned above. + 6. A list should appear that contains all of the packages you published above using `./gradlew` (in alphabetical order): + + + * base-events + * coa + * config + * federate-base + * federation-manager + * fedmanager-host + * root + * utils + +**This concludes the setup for CPSWT for the HelloWorldJava example!** From 7f5f911664e4b28a6ca48044363e1a616d5a3bbf Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Fri, 2 Feb 2024 23:28:36 +0000 Subject: [PATCH 110/113] start addressing comment & restructure files --- .jenkins/Dockerfile | 106 +++++++++++++++++++++++++++++++++ .jenkins/Jenkinsfile | 74 +++++++++++++++++++++++ .jenkins/experiment_wrapper.sh | 104 ++++++++++++++++++++++++++++++++ .jenkins/gradle.properties | 9 +++ 4 files changed, 293 insertions(+) create mode 100644 .jenkins/Dockerfile create mode 100644 .jenkins/Jenkinsfile create mode 100644 .jenkins/experiment_wrapper.sh create mode 100644 .jenkins/gradle.properties diff --git a/.jenkins/Dockerfile b/.jenkins/Dockerfile new file mode 100644 index 0000000..e0d5856 --- /dev/null +++ b/.jenkins/Dockerfile @@ -0,0 +1,106 @@ +# Base image: Ubuntu 20.04 +FROM ubuntu:20.04 +LABEL maintainer="CPSWT Team" + +# Set it to noninteractive mode +ARG DEBIAN_FRONTEND=noninteractive + +# Install necessary packages +RUN apt-get update && \ + apt-get install -y \ + apt-transport-https \ + bison \ + build-essential \ + ca-certificates \ + clang \ + curl \ + doxygen \ + flex \ + gcc \ + gdb \ + git \ + graphviz \ + libboost1.71-all-dev \ + libcppunit-dev \ + libjsoncpp-dev \ + libosgearth-dev \ + libqt5opengl5-dev \ + libwebkit2gtk-4.0-37 \ + libxml2-dev \ + lld \ + make \ + mongodb \ + mpi-default-dev \ + netcat \ + openjdk-8-jdk \ + openjdk-17-jdk \ + openscenegraph-plugin-osgearth \ + perl \ + python2 \ + python3 \ + python3-pip \ + python-is-python2 \ + qt5-qmake \ + qtbase5-dev \ + qtbase5-dev-tools \ + qtchooser \ + software-properties-common \ + wget \ + xterm \ + zlib1g-dev \ + unzip \ + zip + +#install Gradle +ARG GRADLE_VERSION=7.5 +RUN wget -O gradle.zip https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip && \ + mkdir /opt/gradle && \ + unzip -d /opt/gradle gradle.zip && \ + rm gradle.zip +# Set Gradle in the environment variables +ENV GRADLE_HOME="/opt/gradle/gradle-${GRADLE_VERSION}" +ENV PATH="${GRADLE_HOME}/bin:${PATH}" + +# Install Python packages +RUN python3 -m pip install --system --upgrade \ + jinja2 \ + matplotlib \ + numpy \ + pandas \ + posix_ipc \ + scipy \ + seaborn \ + webgme-bindings + +# Download and extract portico +WORKDIR /home +RUN wget -O portico.tar.gz https://master.dl.sourceforge.net/project/portico/Portico/portico-2.1.0/portico-2.1.0-linux64.tar.gz?viasf=1 && \ + tar xf portico.tar.gz && \ + rm portico.tar.gz +ENV RTI_HOME="/home/portico-2.1.0" + +# Download and set up Apache Archiva +WORKDIR /opt +RUN wget -O archiva.tar.gz https://archive.apache.org/dist/archiva/2.2.5/binaries/apache-archiva-2.2.5-bin.tar.gz && \ + tar xf archiva.tar.gz && \ + rm archiva.tar.gz + +# Expose the Archiva port +EXPOSE 8080/tcp + +# Use SIGINT for stopping +STOPSIGNAL SIGINT + +# Set up Gradle properties +COPY gradle.properties /root/.gradle/ +RUN chmod 600 /root/.gradle/gradle.properties + +# Clone and build CPSWT packages +RUN mkdir /home/cpswt +COPY experiment_wrapper.sh /home/cpswt + +WORKDIR /home/cpswt +# Start Archiva +CMD [ "/usr/bin/bash", "experiment_wrapper.sh" ] +# CMD [ "/usr/bin/bash" ] + diff --git a/.jenkins/Jenkinsfile b/.jenkins/Jenkinsfile new file mode 100644 index 0000000..1afaf90 --- /dev/null +++ b/.jenkins/Jenkinsfile @@ -0,0 +1,74 @@ +// Do NOT place within the pipeline block +properties([ [ $class: 'ThrottleJobProperty', + categories: ['ci_cpswt_build'], + limitOneJobWithMatchingParams: false, + maxConcurrentPerNode: 1, + maxConcurrentTotal: 1, + paramsToUseForLimit: '', + throttleEnabled: true, + throttleOption: 'category' ] ]) + +pipeline { + agent any + triggers { + pollSCM('*/1 * * * *') // poll the SCM every 1 minutes + } + + stages { + stage('Clone repository') { + steps { + echo 'Cloning Forked CPSWT-Core..' + deleteDir() // Delete workspace before cloning + sh 'git clone git@github.com:justinyeh1995/CI_with_Jenkins.git' + } + } + stage('Build image') { + steps { + echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' + dir("CI_with_Jenkins/cpswt-core") { + sh 'docker build -t cpswt-core:latest -f Dockerfile .' + } + } + } + stage('Deploy image') { + steps { + echo 'Run the Docker Container inside Jenkins container' + sh 'docker run \ + --name cpswt-core \ + -p 8081:8080 \ + cpswt-core:latest' + } + } + stage('Wait for container to stop') { + options { + timeout(time: 30, unit: 'MINUTES') + } + steps { + echo 'Wait for container to stop' + sh 'docker wait cpswt-core' + } + } + stage('Archive loggings') { + steps { + echo 'Archiving the results...' + sh 'docker logs cpswt-core > cpswt-core.log' + archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true + } + } + } + + post { + always { + echo 'This will always run' + emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", + recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], + subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", + attachLog: true, + attachmentsPattern: 'cpswt-core.log' + echo 'Tearing Down the image & container....' + sh 'docker rm -f cpswt-core' + sh 'docker rmi cpswt-core:latest' + sh 'rm -rf cpswt-core' + } + } +} diff --git a/.jenkins/experiment_wrapper.sh b/.jenkins/experiment_wrapper.sh new file mode 100644 index 0000000..20dee14 --- /dev/null +++ b/.jenkins/experiment_wrapper.sh @@ -0,0 +1,104 @@ +# this script is used to build cpswt-core and its dependencies in the docker container +ORIGINAL_PATH=$PATH +export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64 +export PATH=$JAVA_HOME/bin:$PATH + +/opt/apache-archiva-2.2.5/bin/archiva start + +# wait for archiva to start +# wait for archiva to start +echo "Waiting archiva to launch on 8080..." + +while ! nc -z localhost 8080; do + sleep 0.1 # wait for 1/10 of the second before check again +done + +echo "archiva launched" + +# create admin user +curl --no-progress-meter -X POST -H "Content-Type: application/json" -H "Origin: http://localhost:8080" -d @- \ + http://localhost:8080/restServices/redbackServices/userService/createAdminUser <<'TERMINUS' +{ + "username": "admin", + "password": "adminpass123", + "email": "admin@archiva-test.org", + "fullName": "Admin", + "locked": false, + "passwordChangeRequired": false, + "permanent": false, + "readOnly": false, + "validated": true, + "confirmPassword": "adminpass123" +} +TERMINUS + +# disable rest.csrffilter.enabled in archiva.xml +sed -i '//,/<\/csrffilter>/s/true/false/' /opt/apache-archiva-2.2.5/conf/archiva.xml +# sed -i 's//http:\/\/129.59.107.97\/archiva-core\/<\/baseUrl>/' /opt/apache-archiva-2.2.5/conf/archiva.xml + +# # restart archiva +/opt/apache-archiva-2.2.5/bin/archiva stop +/opt/apache-archiva-2.2.5/bin/archiva start + +echo "Waiting archiva to launch again on 8080..." + +while ! nc -z localhost 8080; do + sleep 0.1 # wait for 1/10 of the second before check again +done + +echo "archiva launched again" + +# switch to java 17 +unset JAVA_HOME +export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64 +export PATH=$JAVA_HOME/bin:$ORIGINAL_PATH + +# clone cpswt-core and build it +cd /home/cpswt +git clone https://github.com/SimIntToolkit/cpswt-core.git +cd cpswt-core/cpswt-core + +gradle wrapper --gradle-version=8.0 + +ARCHIVA_REPO_URL="http://localhost:8080/repository/snapshots/0.8.0-SNAPSHOT/" + +# sh ./cpswt-redeploy.sh +./gradlew :utils:build --rerun-tasks --refresh-dependencies +./gradlew :utils:publish +echo "utils published" + +./gradlew :root:build --rerun-tasks --refresh-dependencies +./gradlew :root:publish +echo "root published" + +./gradlew :base-events:build --rerun-tasks --refresh-dependencies +./gradlew :base-events:publish +echo "base-events published" + +./gradlew :config:build --rerun-tasks --refresh-dependencies +./gradlew :config:publish +echo "config published" + +./gradlew :federate-base:build --rerun-tasks --refresh-dependencies +./gradlew :federate-base:publish +echo "federate-base published" + +./gradlew :coa:build --rerun-tasks --refresh-dependencies +./gradlew :coa:publish +echo "coa published" + +./gradlew :federation-manager:build --rerun-tasks --refresh-dependencies +./gradlew :federation-manager:publish +echo "federation-manager published" + +./gradlew :fedmanager-host:build --rerun-tasks --refresh-dependencies +./gradlew :fedmanager-host:publish +echo "fedmanager-host published" + +# run the HelloWorldJava example +cd /home/cpswt/cpswt-core/examples/HelloWorldJava +gradle wrapper --gradle-version=8.0 +./gradlew :Source:build +./gradlew :Sink:build +./gradlew :PingCounter:build +./gradlew :runFederationBatch diff --git a/.jenkins/gradle.properties b/.jenkins/gradle.properties new file mode 100644 index 0000000..bbace05 --- /dev/null +++ b/.jenkins/gradle.properties @@ -0,0 +1,9 @@ +archivaUser=admin +archivaPassword=adminpass123 +archivaHostId=localhost +archivaPort=8080 +version=0.8.0-SNAPSHOT + +org.gradle.console=plain + +omnetppHome=/opt/omnetpp-5.6.2 From c4fc388104fef497879fb4310d6718fa14a29097 Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Fri, 2 Feb 2024 23:32:58 +0000 Subject: [PATCH 111/113] restructure files --- Dockerfile | 106 ------------------------------------------ Jenkinsfile | 74 ----------------------------- experiment_wrapper.sh | 104 ----------------------------------------- gradle.properties | 9 ---- 4 files changed, 293 deletions(-) delete mode 100644 Dockerfile delete mode 100644 Jenkinsfile delete mode 100644 experiment_wrapper.sh delete mode 100644 gradle.properties diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index e0d5856..0000000 --- a/Dockerfile +++ /dev/null @@ -1,106 +0,0 @@ -# Base image: Ubuntu 20.04 -FROM ubuntu:20.04 -LABEL maintainer="CPSWT Team" - -# Set it to noninteractive mode -ARG DEBIAN_FRONTEND=noninteractive - -# Install necessary packages -RUN apt-get update && \ - apt-get install -y \ - apt-transport-https \ - bison \ - build-essential \ - ca-certificates \ - clang \ - curl \ - doxygen \ - flex \ - gcc \ - gdb \ - git \ - graphviz \ - libboost1.71-all-dev \ - libcppunit-dev \ - libjsoncpp-dev \ - libosgearth-dev \ - libqt5opengl5-dev \ - libwebkit2gtk-4.0-37 \ - libxml2-dev \ - lld \ - make \ - mongodb \ - mpi-default-dev \ - netcat \ - openjdk-8-jdk \ - openjdk-17-jdk \ - openscenegraph-plugin-osgearth \ - perl \ - python2 \ - python3 \ - python3-pip \ - python-is-python2 \ - qt5-qmake \ - qtbase5-dev \ - qtbase5-dev-tools \ - qtchooser \ - software-properties-common \ - wget \ - xterm \ - zlib1g-dev \ - unzip \ - zip - -#install Gradle -ARG GRADLE_VERSION=7.5 -RUN wget -O gradle.zip https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip && \ - mkdir /opt/gradle && \ - unzip -d /opt/gradle gradle.zip && \ - rm gradle.zip -# Set Gradle in the environment variables -ENV GRADLE_HOME="/opt/gradle/gradle-${GRADLE_VERSION}" -ENV PATH="${GRADLE_HOME}/bin:${PATH}" - -# Install Python packages -RUN python3 -m pip install --system --upgrade \ - jinja2 \ - matplotlib \ - numpy \ - pandas \ - posix_ipc \ - scipy \ - seaborn \ - webgme-bindings - -# Download and extract portico -WORKDIR /home -RUN wget -O portico.tar.gz https://master.dl.sourceforge.net/project/portico/Portico/portico-2.1.0/portico-2.1.0-linux64.tar.gz?viasf=1 && \ - tar xf portico.tar.gz && \ - rm portico.tar.gz -ENV RTI_HOME="/home/portico-2.1.0" - -# Download and set up Apache Archiva -WORKDIR /opt -RUN wget -O archiva.tar.gz https://archive.apache.org/dist/archiva/2.2.5/binaries/apache-archiva-2.2.5-bin.tar.gz && \ - tar xf archiva.tar.gz && \ - rm archiva.tar.gz - -# Expose the Archiva port -EXPOSE 8080/tcp - -# Use SIGINT for stopping -STOPSIGNAL SIGINT - -# Set up Gradle properties -COPY gradle.properties /root/.gradle/ -RUN chmod 600 /root/.gradle/gradle.properties - -# Clone and build CPSWT packages -RUN mkdir /home/cpswt -COPY experiment_wrapper.sh /home/cpswt - -WORKDIR /home/cpswt -# Start Archiva -CMD [ "/usr/bin/bash", "experiment_wrapper.sh" ] -# CMD [ "/usr/bin/bash" ] - diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 1afaf90..0000000 --- a/Jenkinsfile +++ /dev/null @@ -1,74 +0,0 @@ -// Do NOT place within the pipeline block -properties([ [ $class: 'ThrottleJobProperty', - categories: ['ci_cpswt_build'], - limitOneJobWithMatchingParams: false, - maxConcurrentPerNode: 1, - maxConcurrentTotal: 1, - paramsToUseForLimit: '', - throttleEnabled: true, - throttleOption: 'category' ] ]) - -pipeline { - agent any - triggers { - pollSCM('*/1 * * * *') // poll the SCM every 1 minutes - } - - stages { - stage('Clone repository') { - steps { - echo 'Cloning Forked CPSWT-Core..' - deleteDir() // Delete workspace before cloning - sh 'git clone git@github.com:justinyeh1995/CI_with_Jenkins.git' - } - } - stage('Build image') { - steps { - echo 'Start a Docker Container for this experiment, which should start the experiment and a archiva server, a inet server, and a omnet++ server..' - dir("CI_with_Jenkins/cpswt-core") { - sh 'docker build -t cpswt-core:latest -f Dockerfile .' - } - } - } - stage('Deploy image') { - steps { - echo 'Run the Docker Container inside Jenkins container' - sh 'docker run \ - --name cpswt-core \ - -p 8081:8080 \ - cpswt-core:latest' - } - } - stage('Wait for container to stop') { - options { - timeout(time: 30, unit: 'MINUTES') - } - steps { - echo 'Wait for container to stop' - sh 'docker wait cpswt-core' - } - } - stage('Archive loggings') { - steps { - echo 'Archiving the results...' - sh 'docker logs cpswt-core > cpswt-core.log' - archiveArtifacts artifacts: 'cpswt-core.log', fingerprint: true - } - } - } - - post { - always { - echo 'This will always run' - emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}", - recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']], - subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}", - attachLog: true, - attachmentsPattern: 'cpswt-core.log' - echo 'Tearing Down the image & container....' - sh 'docker rm -f cpswt-core' - sh 'docker rmi cpswt-core:latest' - sh 'rm -rf cpswt-core' - } - } -} diff --git a/experiment_wrapper.sh b/experiment_wrapper.sh deleted file mode 100644 index d6b1ac5..0000000 --- a/experiment_wrapper.sh +++ /dev/null @@ -1,104 +0,0 @@ -# this script is used to build cpswt-core and its dependencies in the docker container -ORIGINAL_PATH=$PATH -export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64 -export PATH=$JAVA_HOME/bin:$PATH - -/opt/apache-archiva-2.2.5/bin/archiva start - -# wait for archiva to start -# wait for archiva to start -echo "Waiting archiva to launch on 8080..." - -while ! nc -z localhost 8080; do - sleep 0.1 # wait for 1/10 of the second before check again -done - -echo "archiva launched" - -# create admin user -curl --no-progress-meter -X POST -H "Content-Type: application/json" -H "Origin: http://localhost:8080" -d @- \ - http://localhost:8080/restServices/redbackServices/userService/createAdminUser <<'TERMINUS' -{ - "username": "admin", - "password": "adminpass123", - "email": "admin@archiva-test.org", - "fullName": "Admin", - "locked": false, - "passwordChangeRequired": false, - "permanent": false, - "readOnly": false, - "validated": true, - "confirmPassword": "adminpass123" -} -TERMINUS - -# disable rest.csrffilter.enabled in archiva.xml -sed -i '//,/<\/csrffilter>/s/true/false/' /opt/apache-archiva-2.2.5/conf/archiva.xml -# sed -i 's//http:\/\/129.59.107.97\/archiva-core\/<\/baseUrl>/' /opt/apache-archiva-2.2.5/conf/archiva.xml - -# # restart archiva -/opt/apache-archiva-2.2.5/bin/archiva stop -/opt/apache-archiva-2.2.5/bin/archiva start - -echo "Waiting archiva to launch again on 8080..." - -while ! nc -z localhost 8080; do - sleep 0.1 # wait for 1/10 of the second before check again -done - -echo "archiva launched again" - -# switch to java 17 -unset JAVA_HOME -export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64 -export PATH=$JAVA_HOME/bin:$ORIGINAL_PATH - -# clone cpswt-core and build it -cd /home/cpswt -git clone https://github.com/SimIntToolkit/cpswt-core.git -cd cpswt-core/cpswt-core - -gradle wrapper --gradle-version=7.5 - -ARCHIVA_REPO_URL="http://localhost:8080/repository/snapshots/0.7.0-SNAPSHOT/" - -# sh ./cpswt-redeploy.sh -./gradlew :utils:build --rerun-tasks --refresh-dependencies -./gradlew :utils:publish -echo "utils published" - -./gradlew :root:build --rerun-tasks --refresh-dependencies -./gradlew :root:publish -echo "root published" - -./gradlew :base-events:build --rerun-tasks --refresh-dependencies -./gradlew :base-events:publish -echo "base-events published" - -./gradlew :config:build --rerun-tasks --refresh-dependencies -./gradlew :config:publish -echo "config published" - -./gradlew :federate-base:build --rerun-tasks --refresh-dependencies -./gradlew :federate-base:publish -echo "federate-base published" - -./gradlew :coa:build --rerun-tasks --refresh-dependencies -./gradlew :coa:publish -echo "coa published" - -./gradlew :federation-manager:build --rerun-tasks --refresh-dependencies -./gradlew :federation-manager:publish -echo "federation-manager published" - -./gradlew :fedmanager-host:build --rerun-tasks --refresh-dependencies -./gradlew :fedmanager-host:publish -echo "fedmanager-host published" - -# run the HelloWorldJava example -cd /home/cpswt/cpswt-core/examples/HelloWorldJava -gradle wrapper --gradle-version=7.5 -./gradlew :Source:build -./gradlew :Sink:build -./gradlew :PingCounter:build -./gradlew :runFederationBatch \ No newline at end of file diff --git a/gradle.properties b/gradle.properties deleted file mode 100644 index 896d22f..0000000 --- a/gradle.properties +++ /dev/null @@ -1,9 +0,0 @@ -archivaUser=admin -archivaPassword=adminpass123 -archivaHostId=localhost -archivaPort=8080 -version=0.7.0-SNAPSHOT - -org.gradle.console=plain - -omnetppHome=/opt/omnetpp-5.6.2 \ No newline at end of file From 7eb6fefe29bbbfa08bde5887d08d6ef65f52cfff Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Fri, 2 Feb 2024 23:49:01 +0000 Subject: [PATCH 112/113] address review; may cause build to fail --- cpswt-core/config/build.gradle.kts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/cpswt-core/config/build.gradle.kts b/cpswt-core/config/build.gradle.kts index 3c609dc..e228cd3 100644 --- a/cpswt-core/config/build.gradle.kts +++ b/cpswt-core/config/build.gradle.kts @@ -67,10 +67,14 @@ publishing { repositories { maven { name = "configPublish" - val internalRepoUrl = "http://localhost:8080/repository/internal" - val snapshotsRepoUrl = "http://localhost:8080/repository/snapshots" - url = uri(snapshotsRepoUrl) - + val internalRepoUrl = "http://$archivaHostId:$archivaPort/repository/internal" + val snapshotsRepoUrl = "http://$archivaHostId:$archivaPort/repository/snapshots" + url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else internalRepoUrl) + /* + *val internalRepoUrl = "http://localhost:8080/repository/internal" + *val snapshotsRepoUrl = "http://localhost:8080/repository/snapshots" + *url = uri(snapshotsRepoUrl) + */ logger.info("URL = \"$url\"") isAllowInsecureProtocol = true authentication { From 9c7bc048eb38be1ad8e6e49ea66370c25bbac3be Mon Sep 17 00:00:00 2001 From: justinyeh1995 Date: Fri, 2 Feb 2024 23:57:42 +0000 Subject: [PATCH 113/113] address review; may cause build to fail --- cpswt-core/config/build.gradle.kts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/cpswt-core/config/build.gradle.kts b/cpswt-core/config/build.gradle.kts index e228cd3..f5a701f 100644 --- a/cpswt-core/config/build.gradle.kts +++ b/cpswt-core/config/build.gradle.kts @@ -70,19 +70,15 @@ publishing { val internalRepoUrl = "http://$archivaHostId:$archivaPort/repository/internal" val snapshotsRepoUrl = "http://$archivaHostId:$archivaPort/repository/snapshots" url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else internalRepoUrl) - /* - *val internalRepoUrl = "http://localhost:8080/repository/internal" - *val snapshotsRepoUrl = "http://localhost:8080/repository/snapshots" - *url = uri(snapshotsRepoUrl) - */ + logger.info("URL = \"$url\"") isAllowInsecureProtocol = true authentication { create("basic") } credentials { - username = "admin" - password = "adminpass123" + username = archivaUser + password = archivaPassword } } }