diff --git a/Vagrantfile b/Vagrantfile index bff6f3d..72068e0 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -25,7 +25,11 @@ Vagrant.configure(2) do |config| config.vm.network 'private_network', ip: nexus_ip config.vm.provision :shell, path: 'provision/provision-base.sh' config.vm.provision :shell, path: 'provision/provision-nexus.sh' - config.vm.provision :shell, path: 'provision/test.sh' + config.vm.provision :shell, path: 'provision/use-raw-repository.sh' + config.vm.provision :shell, path: 'provision/use-maven-repository-from-mvn.sh' + config.vm.provision :shell, path: 'provision/use-maven-repository-from-gradle.sh' + config.vm.provision :shell, path: 'provision/use-nuget-repository.sh' + config.vm.provision :shell, path: 'provision/use-npm-repository.sh' config.vm.provision :shell, path: 'provision/summary.sh' end diff --git a/provision/test.sh b/provision/test.sh deleted file mode 100644 index 018e75c..0000000 --- a/provision/test.sh +++ /dev/null @@ -1,369 +0,0 @@ -#!/bin/bash -set -eux - -. /vagrant/provision/nexus-groovy.sh - -mkdir -p tmp && cd tmp - -# -# test the NuGet repository. -# see https://help.sonatype.com/display/NXRM3/.NET+Package+Repositories+with+NuGet - -if ! which mono; then - sudo apt-get install -y mono-complete -fi -if [[ ! -f /tmp/nuget.exe ]]; then - wget -qO/tmp/nuget.exe https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -fi - -function nuget { - mono /tmp/nuget.exe $* -} - -nuget_source_url=http://localhost:8081/repository/nuget-group/ -nuget_source_push_url=http://localhost:8081/repository/nuget-hosted/ -nuget_source_push_api_key=$(nexus-groovy get-jenkins-nuget-api-key | jq -r '.result | fromjson | .apiKey') -echo -n $nuget_source_push_api_key >/vagrant/shared/jenkins-nuget-api-key - -# test installing a package from the public NuGet repository. -nuget install MsgPack -Source $nuget_source_url - -# test publishing a package. -cat >example-hello-world.nuspec <<'EOF' - - - example-hello-world - 1.0.0 - Alice Doe - Bob Doe - http://choosealicense.com/licenses/mit/ - http://example.com - false - Example Package Description - Hello World. - Copyleft Alice Doe - hello world - - - - - -EOF -cat >MESSAGE.md <<'EOF' -# Hello World - -Hey Ho Let's Go! -EOF -nuget pack example-hello-world.nuspec -nuget push example-hello-world.1.0.0.nupkg -Source $nuget_source_push_url -ApiKey $nuget_source_push_api_key -# test installing it back. -rm -rf test && mkdir test && pushd test -nuget install example-hello-world -Source $nuget_source_url -if [[ ! -f example-hello-world.1.0.0/content/MESSAGE.md ]]; then - echo 'the package did not install as expected' - exit 1 -fi -popd - - -# -# test the maven repository. - -# install maven and the java development kit. -sudo apt-get install -y maven -sudo apt-get install -y default-jdk -sudo apt-get install -y xmlstarlet - -# setup the user maven configuration to use nexus as a mirror the -# official maven repository. -# see https://help.sonatype.com/display/NXRM3/Maven+Repositories -# see https://maven.apache.org/guides/mini/guide-mirror-settings.html -mkdir -p ~/.m2 -cat >~/.m2/settings.xml <<'EOF' - - - - nexus - alice.doe - password - - - - - nexus - central - http://localhost:8081/repository/maven-public/ - - - - - nexus - - - central - http://central - true - true - - - - - central - http://central - true - true - - - - - - nexus - - -EOF - -# test our nexus repository by creating an hello world project, which -# will pull from our nexus repository. -mvn \ - --batch-mode \ - archetype:generate \ - -DgroupId=com.example.helloworld \ - -DartifactId=example-helloworld \ - -DarchetypeArtifactId=maven-archetype-quickstart - -# test publishing a package. -pushd example-helloworld -# add the nexus repository to pom.xml. -xmlstarlet ed --inplace -N pom=http://maven.apache.org/POM/4.0.0 \ - --subnode '/pom:project' \ - --type elem \ - --name distributionManagement \ - --value '@@repositories@@' \ - pom.xml -python -c ' -xml = open("pom.xml").read().replace("@@repositories@@", """ - - nexus - Releases - http://localhost:8081/repository/maven-releases - - - nexus - Snapshot - http://localhost:8081/repository/maven-snapshots - - """) -open("pom.xml", "w").write(xml) -' -# deploy. -mvn \ - --batch-mode \ - deploy -popd - - -# -# test the maven repository from gradle. - -# download and install gradle. -apt-get install -y unzip -wget -qO/tmp/gradle-4.2.1-bin.zip https://services.gradle.org/distributions/gradle-4.2.1-bin.zip -unzip -d /opt/gradle /tmp/gradle-4.2.1-bin.zip -export PATH="$PATH:/opt/gradle/gradle-4.2.1/bin" - -# build and upload an example library. -mkdir gradle-greeter-library -pushd gradle-greeter-library -mkdir -p src/main/java -cat >src/main/java/Greeter.java <<'EOF' -public final class Greeter { - public static void greet(String name) { - System.out.println("Hello " + name); - } -} -EOF -cat >settings.gradle <<'EOF' -rootProject.name = 'gradle-greeter' -EOF -cat >build.gradle <<'EOF' -// see https://docs.gradle.org/4.2.1/userguide/java_library_plugin.html -// see https://docs.gradle.org/4.2.1/userguide/maven_plugin.html - -apply plugin: 'java-library' -apply plugin: 'maven' - -version = '1.0.0' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - -jar { - manifest { - attributes( - 'Implementation-Title': 'Gradle Greeter Example', - 'Implementation-Version': version - ) - } -} - -uploadArchives { - repositories { - mavenDeployer { - repository(url: System.env.NEXUS_REPOSITORY_URL) { - authentication( - userName: System.env.NEXUS_REPOSITORY_USERNAME, - password: System.env.NEXUS_REPOSITORY_PASSWORD) - } - pom.groupId = 'com.example' - } - } -} -EOF -gradle build -unzip -l build/libs/gradle-greeter-1.0.0.jar -export NEXUS_REPOSITORY_URL='http://localhost:8081/repository/maven-releases' -export NEXUS_REPOSITORY_USERNAME='alice.doe' -export NEXUS_REPOSITORY_PASSWORD='password' -gradle upload -popd - -# build an example application that uses our gradle-greeter library from our nexus repository. -mkdir gradle-greeter-application -pushd gradle-greeter-application -mkdir -p src/main/java -cat >src/main/java/Greet.java <<'EOF' -public final class Greet { - public static void main(String[] args) { - Greeter.greet("World"); - } -} -EOF -cat >settings.gradle <<'EOF' -rootProject.name = 'gradle-greeter-application' -EOF -cat >build.gradle <<'EOF' -// see https://docs.gradle.org/4.2.1/userguide/java_plugin.html -// see https://docs.gradle.org/4.2.1/userguide/application_plugin.html -// see http://imperceptiblethoughts.com/shadow/ - -plugins { - id 'com.github.johnrengelman.shadow' version '2.0.1' -} - -apply plugin: 'application' - -mainClassName = 'Greet' -version = '1.0.0' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - -jar { - manifest { - attributes( - 'Implementation-Title': 'Gradle Greeter Application Example', - 'Implementation-Version': version, - 'Main-Class': mainClassName - ) - } -} - -repositories { - maven { - url 'http://localhost:8081/repository/maven-public' - } -} - -dependencies { - compile 'com.example:gradle-greeter:1.0.0' -} -EOF -gradle shadowJar -unzip -l build/libs/gradle-greeter-application-1.0.0-all.jar -java -jar build/libs/gradle-greeter-application-1.0.0-all.jar -popd - - -# -# test the raw repository. - -apt-get install -y curl - -# upload. -# see https://help.sonatype.com/display/NXRM3/Raw+Repositories+and+Maven+Sites#RawRepositoriesandMavenSites-UploadingFilestoHostedRawRepositories -expected='this is an adhoc package' -echo "$expected" >package-1.0.0.txt -curl --silent --user 'alice.doe:password' --upload-file package-1.0.0.txt http://localhost:8081/repository/adhoc-package/package-1.0.0.txt -# download. -actual=$(curl --silent http://localhost:8081/repository/adhoc-package/package-1.0.0.txt) -[ "$actual" = "$expected" ] || (echo 'upload adhoc package test failed' && false) - - -# -# test the npm repositories. -# see https://help.sonatype.com/display/NXRM3/Node+Packaged+Modules+and+npm+Registries - -# install node LTS. -# see https://github.com/nodesource/distributions#debinstall -curl -sL https://deb.nodesource.com/setup_6.x | bash -apt-get install -y nodejs -node --version -npm --version - -# configure npm to use the npm-group repository. -npm config set registry http://localhost:8081/repository/npm-group/ - -# install a package that indirectly uses the npmjs.org-proxy repository. -mkdir /tmp/hello-world-npm -pushd /tmp/hello-world-npm -cat >package.json <<'EOF' -{ - "name": "hello-world", - "description": "the classic hello world", - "version": "1.0.0", - "license": "MIT", - "main": "hello-world.js", - "repository": { - "type": "git", - "url": "https://git.example.com/hello-world.git" - }, - "dependencies": {} -} -EOF -cat >hello-world.js <<'EOF' -const leftPad = require('left-pad') -console.log(leftPad('hello world', 40)) -EOF -npm install --save left-pad -node hello-world.js - -# publish a package to the npm-hosted repository. -# see https://www.npmjs.com/package/npm-cli-login -npm install npm-cli-login -export NPM_USER=alice.doe -export NPM_PASS=password -export NPM_EMAIL=alice.doe@example.com -# NB npm-cli-login always adds the trailing slash to the registry url, -# BUT npm publish refuses to work without it, so workaround this. -export NPM_REGISTRY=http://localhost:8081/repository/npm-hosted -./node_modules/.bin/npm-cli-login -export NPM_REGISTRY=$NPM_REGISTRY/ -npm publish --registry $NPM_REGISTRY -popd -# and use it. -mkdir /tmp/use-hello-world-npm -pushd /tmp/use-hello-world-npm -cat >package.json <<'EOF' -{ - "name": "use-hello-world", - "description": "use the classic hello world", - "version": "1.0.0", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://git.example.com/use-hello-world.git" - }, - "dependencies": {} -} -EOF -npm install hello-world -node node_modules/hello-world/hello-world.js -popd diff --git a/provision/use-maven-repository-from-gradle.sh b/provision/use-maven-repository-from-gradle.sh new file mode 100644 index 0000000..17a85ea --- /dev/null +++ b/provision/use-maven-repository-from-gradle.sh @@ -0,0 +1,123 @@ +#!/bin/bash +set -eux + +mkdir -p tmp/use-maven-repository-from-gradle && cd tmp/use-maven-repository-from-gradle + +# +# test the maven repository from gradle. + +# download and install gradle. +apt-get install -y unzip +wget -qO/tmp/gradle-4.2.1-bin.zip https://services.gradle.org/distributions/gradle-4.2.1-bin.zip +unzip -d /opt/gradle /tmp/gradle-4.2.1-bin.zip +export PATH="$PATH:/opt/gradle/gradle-4.2.1/bin" + +# build and upload an example library. +mkdir gradle-greeter-library +pushd gradle-greeter-library +mkdir -p src/main/java +cat >src/main/java/Greeter.java <<'EOF' +public final class Greeter { + public static void greet(String name) { + System.out.println("Hello " + name); + } +} +EOF +cat >settings.gradle <<'EOF' +rootProject.name = 'gradle-greeter' +EOF +cat >build.gradle <<'EOF' +// see https://docs.gradle.org/4.2.1/userguide/java_library_plugin.html +// see https://docs.gradle.org/4.2.1/userguide/maven_plugin.html + +apply plugin: 'java-library' +apply plugin: 'maven' + +version = '1.0.0' +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +jar { + manifest { + attributes( + 'Implementation-Title': 'Gradle Greeter Example', + 'Implementation-Version': version + ) + } +} + +uploadArchives { + repositories { + mavenDeployer { + repository(url: System.env.NEXUS_REPOSITORY_URL) { + authentication( + userName: System.env.NEXUS_REPOSITORY_USERNAME, + password: System.env.NEXUS_REPOSITORY_PASSWORD) + } + pom.groupId = 'com.example' + } + } +} +EOF +gradle build +unzip -l build/libs/gradle-greeter-1.0.0.jar +export NEXUS_REPOSITORY_URL='http://localhost:8081/repository/maven-releases' +export NEXUS_REPOSITORY_USERNAME='alice.doe' +export NEXUS_REPOSITORY_PASSWORD='password' +gradle upload +popd + +# build an example application that uses our gradle-greeter library from our nexus repository. +mkdir gradle-greeter-application +pushd gradle-greeter-application +mkdir -p src/main/java +cat >src/main/java/Greet.java <<'EOF' +public final class Greet { + public static void main(String[] args) { + Greeter.greet("World"); + } +} +EOF +cat >settings.gradle <<'EOF' +rootProject.name = 'gradle-greeter-application' +EOF +cat >build.gradle <<'EOF' +// see https://docs.gradle.org/4.2.1/userguide/java_plugin.html +// see https://docs.gradle.org/4.2.1/userguide/application_plugin.html +// see http://imperceptiblethoughts.com/shadow/ + +plugins { + id 'com.github.johnrengelman.shadow' version '2.0.1' +} + +apply plugin: 'application' + +mainClassName = 'Greet' +version = '1.0.0' +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +jar { + manifest { + attributes( + 'Implementation-Title': 'Gradle Greeter Application Example', + 'Implementation-Version': version, + 'Main-Class': mainClassName + ) + } +} + +repositories { + maven { + url 'http://localhost:8081/repository/maven-public' + } +} + +dependencies { + compile 'com.example:gradle-greeter:1.0.0' +} +EOF +gradle shadowJar +unzip -l build/libs/gradle-greeter-application-1.0.0-all.jar +java -jar build/libs/gradle-greeter-application-1.0.0-all.jar +popd diff --git a/provision/use-maven-repository-from-mvn.sh b/provision/use-maven-repository-from-mvn.sh new file mode 100644 index 0000000..24715d7 --- /dev/null +++ b/provision/use-maven-repository-from-mvn.sh @@ -0,0 +1,99 @@ +#!/bin/bash +set -eux + +mkdir -p tmp/use-maven-repository-from-mvn && cd tmp/use-maven-repository-from-mvn + +# +# test the maven repository. + +# install maven and the java development kit. +sudo apt-get install -y maven +sudo apt-get install -y default-jdk +sudo apt-get install -y xmlstarlet + +# setup the user maven configuration to use nexus as a mirror the +# official maven repository. +# see https://help.sonatype.com/display/NXRM3/Maven+Repositories +# see https://maven.apache.org/guides/mini/guide-mirror-settings.html +mkdir -p ~/.m2 +cat >~/.m2/settings.xml <<'EOF' + + + + nexus + alice.doe + password + + + + + nexus + central + http://localhost:8081/repository/maven-public/ + + + + + nexus + + + central + http://central + true + true + + + + + central + http://central + true + true + + + + + + nexus + + +EOF + +# test our nexus repository by creating an hello world project, which +# will pull from our nexus repository. +mvn \ + --batch-mode \ + archetype:generate \ + -DgroupId=com.example.helloworld \ + -DartifactId=example-helloworld \ + -DarchetypeArtifactId=maven-archetype-quickstart + +# test publishing a package. +pushd example-helloworld +# add the nexus repository to pom.xml. +xmlstarlet ed --inplace -N pom=http://maven.apache.org/POM/4.0.0 \ + --subnode '/pom:project' \ + --type elem \ + --name distributionManagement \ + --value '@@repositories@@' \ + pom.xml +python -c ' +xml = open("pom.xml").read().replace("@@repositories@@", """ + + nexus + Releases + http://localhost:8081/repository/maven-releases + + + nexus + Snapshot + http://localhost:8081/repository/maven-snapshots + + """) +open("pom.xml", "w").write(xml) +' +# deploy. +mvn \ + --batch-mode \ + deploy +popd diff --git a/provision/use-npm-repository.sh b/provision/use-npm-repository.sh new file mode 100644 index 0000000..91c5ddd --- /dev/null +++ b/provision/use-npm-repository.sh @@ -0,0 +1,84 @@ +#!/bin/bash +set -eux + +mkdir -p tmp/use-npm-repository && cd tmp/use-npm-repository + +# +# test the npm repositories. +# see https://help.sonatype.com/display/NXRM3/Node+Packaged+Modules+and+npm+Registries +# see https://docs.npmjs.com/private-modules/ci-server-config +# see https://docs.npmjs.com/cli/adduser + +# install node LTS. +# see https://github.com/nodesource/distributions#debinstall +curl -sL https://deb.nodesource.com/setup_6.x | bash +apt-get install -y nodejs +node --version +npm --version + +# +# configure npm to use the npm-group repository. + +npm config set registry http://localhost:8081/repository/npm-group/ + +# install a package that indirectly uses the npmjs.org-proxy repository. +mkdir hello-world-npm +pushd hello-world-npm +cat >package.json <<'EOF' +{ + "name": "hello-world", + "description": "the classic hello world", + "version": "1.0.0", + "license": "MIT", + "main": "hello-world.js", + "repository": { + "type": "git", + "url": "https://git.example.com/hello-world.git" + }, + "dependencies": {} +} +EOF +cat >hello-world.js <<'EOF' +const leftPad = require('left-pad') +console.log(leftPad('hello world', 40)) +EOF +npm install --save left-pad +node hello-world.js + + +# +# publish a package to the npm-hosted repository. +# see https://www.npmjs.com/package/npm-cli-login + +# login. +npm install npm-cli-login +export NPM_USER=alice.doe +export NPM_PASS=password +export NPM_EMAIL=alice.doe@example.com +# NB npm-cli-login always adds the trailing slash to the registry url, +# BUT npm publish refuses to work without it, so workaround this. +export NPM_REGISTRY=http://localhost:8081/repository/npm-hosted +./node_modules/.bin/npm-cli-login +export NPM_REGISTRY=$NPM_REGISTRY/ +npm publish --registry=$NPM_REGISTRY +popd + +# publish. +mkdir use-hello-world-npm +pushd use-hello-world-npm +cat >package.json <<'EOF' +{ + "name": "use-hello-world", + "description": "use the classic hello world", + "version": "1.0.0", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://git.example.com/use-hello-world.git" + }, + "dependencies": {} +} +EOF +npm install hello-world +node node_modules/hello-world/hello-world.js +popd diff --git a/provision/use-nuget-repository.sh b/provision/use-nuget-repository.sh new file mode 100644 index 0000000..dbcdb54 --- /dev/null +++ b/provision/use-nuget-repository.sh @@ -0,0 +1,66 @@ +#!/bin/bash +set -eux + +. /vagrant/provision/nexus-groovy.sh + +mkdir -p tmp/use-nuget-repository && cd tmp/use-nuget-repository + +# +# test the NuGet repository. +# see https://help.sonatype.com/display/NXRM3/.NET+Package+Repositories+with+NuGet + +if ! which mono; then + sudo apt-get install -y mono-complete +fi +if [[ ! -f /tmp/nuget.exe ]]; then + wget -qO/tmp/nuget.exe https://dist.nuget.org/win-x86-commandline/latest/nuget.exe +fi + +function nuget { + mono /tmp/nuget.exe $* +} + +nuget_source_url=http://localhost:8081/repository/nuget-group/ +nuget_source_push_url=http://localhost:8081/repository/nuget-hosted/ +nuget_source_push_api_key=$(nexus-groovy get-jenkins-nuget-api-key | jq -r '.result | fromjson | .apiKey') +echo -n $nuget_source_push_api_key >/vagrant/shared/jenkins-nuget-api-key + +# test installing a package from the public NuGet repository. +nuget install MsgPack -Source $nuget_source_url + +# test publishing a package. +cat >example-hello-world.nuspec <<'EOF' + + + example-hello-world + 1.0.0 + Alice Doe + Bob Doe + http://choosealicense.com/licenses/mit/ + http://example.com + false + Example Package Description + Hello World. + Copyleft Alice Doe + hello world + + + + + +EOF +cat >MESSAGE.md <<'EOF' +# Hello World + +Hey Ho Let's Go! +EOF +nuget pack example-hello-world.nuspec +nuget push example-hello-world.1.0.0.nupkg -Source $nuget_source_push_url -ApiKey $nuget_source_push_api_key +# test installing it back. +rm -rf test && mkdir test && pushd test +nuget install example-hello-world -Source $nuget_source_url +if [[ ! -f example-hello-world.1.0.0/content/MESSAGE.md ]]; then + echo 'the package did not install as expected' + exit 1 +fi +popd diff --git a/provision/use-raw-repository.sh b/provision/use-raw-repository.sh new file mode 100644 index 0000000..022f416 --- /dev/null +++ b/provision/use-raw-repository.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -eux + +mkdir -p tmp/use-raw-repository && cd tmp/use-raw-repository + +# +# test the raw repository. + +apt-get install -y curl + +# upload. +# see https://help.sonatype.com/display/NXRM3/Raw+Repositories+and+Maven+Sites#RawRepositoriesandMavenSites-UploadingFilestoHostedRawRepositories +expected='this is an adhoc package' +echo "$expected" >package-1.0.0.txt +curl --silent --user 'alice.doe:password' --upload-file package-1.0.0.txt http://localhost:8081/repository/adhoc-package/package-1.0.0.txt + +# download. +actual=$(curl --silent http://localhost:8081/repository/adhoc-package/package-1.0.0.txt) +[ "$actual" = "$expected" ] || (echo 'upload adhoc package test failed' && false)