- Notifications
You must be signed in to change notification settings - Fork72
Add Sonatype Nexus repository integration module#262
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
base:main
Are you sure you want to change the base?
Changes from1 commit
e32a0b7
e2d8aad
2a892ad
20e9a32
af94e5b
db7afc8
09905c3
56f5990
3c890d0
88f8284
f375e5f
97d144b
1bd0085
1b01b37
5534564
0854c5e
c520a19
f42da8f
9f2fe38
0a10b4d
8de8da8
0fd038a
9f2f3a4
4a45f09
3bdcac7
b25317a
013f756
5367304
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
- Loading branch information
Uh oh!
There was an error while loading.Please reload this page.
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
--- | ||
display_name: mavrickrishi | ||
bio: Coder module contributor | ||
github: MAVRICK-1 | ||
status: community | ||
--- | ||
# mavrickrishi | ||
This directory contains Coder modules and templates created by mavrickrishi. | ||
## Modules | ||
- [nexus](./modules/nexus/) - Configure package managers to use Sonatype Nexus Repository |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,14 @@ | ||
--- | ||
display_name: Sonatype Nexus Repository | ||
description: Configure package managers to use Sonatype Nexus Repository for Maven, npm, PyPI, and Docker registries. | ||
icon: /.icons/nexus.svg | ||
MAVRICK-1 marked this conversation as resolved. OutdatedShow resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
verified: true | ||
MAVRICK-1 marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
tags: [integration, nexus, maven, npm, pypi, docker] | ||
--- | ||
# Sonatype Nexus Repository | ||
Configure package managers (Maven, npm, PyPI, Docker) to use[Sonatype Nexus Repository](https://help.sonatype.com/en/sonatype-nexus-repository.html) with API token authentication. This module provides secure credential handling, multiple repository support per package manager, and flexible username configuration. | ||
```tf | ||
module "nexus" { | ||
@@ -26,7 +26,14 @@ module "nexus" { | ||
} | ||
``` | ||
## Requirements | ||
- Nexus Repository Manager 3.x | ||
- Valid API token or user credentials | ||
- Package managers installed on the workspace (Maven, npm, pip, Docker as needed) | ||
> [!NOTE] | ||
> This module configures package managers but does not install them. You need to handle the installation of Maven, npm, Python pip, and Docker yourself. | ||
## Examples | ||
@@ -123,31 +130,3 @@ module "nexus" { | ||
} | ||
} | ||
``` | ||
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -4,14 +4,14 @@ terraform { | ||
required_providers { | ||
coder = { | ||
source = "coder/coder" | ||
version = ">=2.5" | ||
} | ||
} | ||
} | ||
variable "nexus_url" { | ||
type = string | ||
description = "The base URL of yourNexus repositorymanager (e.g. https://nexus.example.com)" | ||
validation { | ||
condition = can(regex("^(https|http)://", var.nexus_url)) | ||
error_message = "nexus_url must be a valid URL starting with either 'https://' or 'http://'" | ||
@@ -20,13 +20,13 @@ variable "nexus_url" { | ||
variable "nexus_username" { | ||
type = string | ||
description = "Custom usernamefor Nexus authentication. If not provided, defaults to the Coder username based on the username_field setting" | ||
default = null | ||
} | ||
variable "nexus_password" { | ||
type = string | ||
description = "API tokenor passwordfor Nexus authentication. This value is sensitive and should be stored securely" | ||
sensitive = true | ||
} | ||
@@ -49,8 +49,13 @@ variable "package_managers" { | ||
docker = [] | ||
} | ||
description = <<-EOF | ||
Configuration for package managers. Each key maps to a list of Nexus repository names: | ||
- maven: List of Maven repository names | ||
- npm: List of npm repository names (supports scoped packages with "@scope:repo-name") | ||
- pypi: List of PyPI repository names | ||
- docker: List of Docker registry names | ||
Unused package managers can be omitted. | ||
Example: | ||
{ | ||
maven = ["maven-public", "maven-releases"] | ||
npm = ["npm-public", "@scoped:npm-private"] | ||
@@ -62,7 +67,7 @@ variable "package_managers" { | ||
variable "username_field" { | ||
type = string | ||
description = "Fieldto use forusername (\"username\" or \"email\"). Defaults to \"username\". Only used when nexus_username is not provided" | ||
default = "username" | ||
validation { | ||
condition = can(regex("^(email|username)$", var.username_field)) | ||
@@ -78,115 +83,38 @@ locals { | ||
nexus_host = regex("^https?://([^:/]+)", var.nexus_url) | ||
MAVRICK-1 marked this conversation as resolved. OutdatedShow resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
} | ||
locals { | ||
# Get first repository name or use default | ||
maven_repo = length(var.package_managers.maven) > 0 ? var.package_managers.maven[0] : "maven-public" | ||
npm_repo = length(var.package_managers.npm) > 0 ? var.package_managers.npm[0] : "npm-public" | ||
pypi_repo = length(var.package_managers.pypi) > 0 ? var.package_managers.pypi[0] : "pypi-public" | ||
npmrc = <<-EOF | ||
registry=${var.nexus_url}/repository/${local.npm_repo}/ | ||
//${local.nexus_host}/repository/${local.npm_repo}/:username=${local.username} | ||
//${local.nexus_host}/repository/${local.npm_repo}/:_password=${base64encode(var.nexus_password)} | ||
//${local.nexus_host}/repository/${local.npm_repo}/:always-auth=true | ||
EOF | ||
} | ||
resource "coder_script" "nexus" { | ||
agent_id = var.agent_id | ||
display_name = "nexus" | ||
icon = "/icon/nexus.svg" | ||
script = templatefile("${path.module}/run.sh", { | ||
NEXUS_URL = var.nexus_url | ||
NEXUS_HOST = local.nexus_host[1] | ||
MAVRICK-1 marked this conversation as resolved. OutdatedShow resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
NEXUS_USERNAME = local.username | ||
NEXUS_PASSWORD = var.nexus_password | ||
HAS_MAVEN = length(var.package_managers.maven) == 0 ? "" : "YES" | ||
MAVEN_REPO = local.maven_repo | ||
HAS_NPM = length(var.package_managers.npm) == 0 ? "" : "YES" | ||
NPMRC = local.npmrc | ||
HAS_PYPI = length(var.package_managers.pypi) == 0 ? "" : "YES" | ||
PYPI_REPO = local.pypi_repo | ||
HAS_DOCKER = length(var.package_managers.docker) == 0 ? "" : "YES" | ||
REGISTER_DOCKER = join("\n ", formatlist("register_docker \"%s\"", var.package_managers.docker)) | ||
}) | ||
run_on_start = true | ||
} | ||
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
#!/usr/bin/env bash | ||
not_configured() { | ||
type=$1 | ||
echo"🤔 no$type repository is set, skipping$type configuration." | ||
} | ||
config_complete() { | ||
echo"🥳 Configuration complete!" | ||
} | ||
register_docker() { | ||
repo=$1 | ||
echo -n"${NEXUS_PASSWORD}"| docker login"${NEXUS_HOST}" --username"${NEXUS_USERNAME}" --password-stdin | ||
MAVRICK-1 marked this conversation as resolved. OutdatedShow resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
} | ||
echo"🚀 Configuring Nexus repository access..." | ||
# Configure Maven | ||
if [-n"${HAS_MAVEN}" ];then | ||
echo"☕ Configuring Maven..." | ||
mkdir -p~/.m2 | ||
cat>~/.m2/settings.xml<< 'EOF' | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"> | ||
<servers> | ||
<server> | ||
<id>nexus</id> | ||
<username>${NEXUS_USERNAME}</username> | ||
<password>${NEXUS_PASSWORD}</password> | ||
</server> | ||
</servers> | ||
<mirrors> | ||
<mirror> | ||
<id>nexus-mirror</id> | ||
<mirrorOf>*</mirrorOf> | ||
<url>${NEXUS_URL}/repository/${MAVEN_REPO}</url> | ||
</mirror> | ||
</mirrors> | ||
</settings> | ||
EOF | ||
config_complete | ||
else | ||
not_configured maven | ||
fi | ||
# Configure npm | ||
if [-n"${HAS_NPM}" ];then | ||
echo"📦 Configuring npm..." | ||
cat>~/.npmrc<< 'EOF' | ||
${NPMRC} | ||
EOF | ||
config_complete | ||
else | ||
not_configured npm | ||
fi | ||
# Configure pip | ||
if [-n"${HAS_PYPI}" ];then | ||
echo"🐍 Configuring pip..." | ||
mkdir -p~/.pip | ||
# Create .netrc file for secure credential storage | ||
cat>~/.netrc<<EOF | ||
machine${NEXUS_HOST} | ||
login${NEXUS_USERNAME} | ||
password${NEXUS_PASSWORD} | ||
EOF | ||
chmod 600~/.netrc | ||
# Update pip.conf to use index-url without embedded credentials | ||
cat>~/.pip/pip.conf<< 'EOF' | ||
[global] | ||
index-url = https://${NEXUS_HOST}/repository/${PYPI_REPO}/simple | ||
EOF | ||
config_complete | ||
else | ||
not_configured pypi | ||
fi | ||
# Configure Docker | ||
if [-n"${HAS_DOCKER}" ];then | ||
ifcommand -v docker> /dev/null2>&1;then | ||
echo"🐳 Configuring Docker credentials..." | ||
mkdir -p~/.docker | ||
${REGISTER_DOCKER} | ||
config_complete | ||
else | ||
echo"🤔 Docker is not installed, skipping Docker configuration." | ||
fi | ||
else | ||
not_configured docker | ||
fi | ||
echo"✅ Nexus repository configuration completed!" |
Uh oh!
There was an error while loading.Please reload this page.