Oto tutorial wideo
Wprowadzenie
W wersji Nexus OSS nie ma natywnej opcji generowania tokenów API dla użytkowników. Jednak możemy obejść ten problem, tworząc użytkownika specjalnie dla npm i używając jego poświadczeń w pliku .npmrc. Oto jak to zrobić:
1. Konfiguracja Serwera Nexus
Dodaj repozytoria
1. Utwórz npm Hosted Repository
- Kliknij “Repositories” w menu “Repository”.
- Kliknij przycisk “Create repository”.
- Wybierz “npm (hosted)” z listy.
- Skonfiguruj repozytorium:
- Name:
npm-hosted - Deployment policy: Wybierz preferowaną politykę (np.
Disable redeploy)
- Name:
- Kliknij “Create repository”.
2. Utwórz npm Proxy Repository
- Kliknij “Repositories” w menu “Repository”.
- Kliknij przycisk “Create repository”.
- Wybierz “npm (proxy)” z listy.
- Skonfiguruj repozytorium:
- Name:
npm-proxy - Remote Storage:
https://registry.npmjs.org
- Name:
- Kliknij “Create repository”.
3. Utwórz npm Group Repository
- Kliknij “Repositories” w menu “Repository”.
- Kliknij przycisk “Create repository”.
- Wybierz “npm (group)” z listy.
- Skonfiguruj repozytorium:
- Name:
npm-group - Member repositories: Dodaj
npm-hostedinpm-proxydo grupy
- Name:
- Kliknij “Create repository”.
Utwórz Nową Rolę z Uprawnieniami Tylko do Odczytu
- Przejdź do “Security” -> “Roles”.
- Kliknij “Create role”.
- Role ID:
npm-read-only - Role Name:
NPM Read Only - Description:
Read-only access to npm repositories
- Role ID:
- W zakładce “Privileges”, dodaj następujące uprawnienia:
nx-repository-view-npm-*-addnx-repository-view-npm-*-browsenx-repository-view-npm-*-readnx-repository-view-npm-npm-group-browsenx-repository-view-npm-npm-group-readnx-repository-view-npm-npm-hosted-browsenx-repository-view-npm-npm-hosted-readnx-repository-view-npm-npm-proxy-browsenx-repository-view-npm-npm-proxy-read
Utwórz użytkownika specjalnie dla npm
- Zaloguj się do Nexus Repository Manager.
- Przejdź do “Security” -> “Users”.
- Kliknij “Create user”.
- Username:
npm-user - Password:
securepassword - First Name:
NPM - Last Name:
User - Email:
npm-user@example.com
- Username:
- Kliknij “Create”, aby zapisać użytkownika.
Przypisz Rolę Nowemu Użytkownikowi
- Przejdź do “Security” -> “Users”.
- Kliknij na nowo utworzonego użytkownika (
npm-user). - W zakładce “Roles”, dodaj rolę
npm-read-only. - Kliknij “Save”.
2. Konfiguracja Jenkinsfile
Upewnij się, że przechowujesz poświadczenia npm jako Secret Text lub Username with password w Jenkins i używasz ich podczas procesu budowy.
Dla tego przykładu załóżmy, że przechowujesz nazwę użytkownika i hasło jako Secret Text.
Dodaj Poświadczenia npm w Jenkins
- Przejdź do Jenkins Dashboard > Manage Jenkins > Manage Credentials.
- Dodaj nowe poświadczenia:
- Kind: Secret Text
- Secret:
npm-user(ID:nexus-npm-user) - Description: Nexus npm username
- Dodaj kolejne Secret Text:
- Kind: Secret Text
- Secret:
securepassword(ID:nexus-npm-pass) - Description: Nexus npm password
Użyj Poświadczeń w Jenkinsfile
| |
Jenkinsfile - wyjaśnienie:
Ten Jenkinsfile definiuje pipeline do budowania i testowania projektu za pomocą Jenkins. Oto szczegółowe wyjaśnienie każdej sekcji:
Definicja Pipeline:
1 2pipeline { agent anyPipeline może działać na dowolnym dostępnym agencie.
Opcje:
1 2 3 4options { buildDiscarder(logRotator(numToKeepStr: '5')) disableConcurrentBuilds() }buildDiscarder(logRotator(numToKeepStr: '5')): Przechowuje tylko ostatnie 5 budów, aby zaoszczędzić miejsce.disableConcurrentBuilds(): Zapewnia, że w danym momencie działa tylko jedna budowa.
Parametry:
1 2 3 4parameters { choice(name: 'choose_server', choices: [...], description: 'Select server') choice(name: 'SPEC_FILE', choices: [...], description: 'Choose spec file to test a module') }choose_server: Pozwala użytkownikowi wybrać serwer z listy.SPEC_FILE: Pozwala użytkownikowi wybrać plik specyfikacji do testowania.
Zmienne Środowiskowe:
1 2 3 4 5 6 7environment { REPO_URL = 'git@gitlab.sysadmin.homes:developers/awx-taiko.git' BRANCH = 'main' REPORT_PATH = '/workspace' REPORT_NAME = 'TAIKO_AUTOMATED_TESTS' DOCKER_IMAGE = "awx-taiko" }Ustawia różne zmienne środowiskowe używane w całym pipeline.
Etapy:
Clean Workspace Before Start:
1 2 3 4 5stage('Clean Workspace Before Start') { steps { cleanWs() } }Czyści obszar roboczy przed rozpoczęciem budowy.
Resolve IP:
1 2 3 4 5 6 7 8stage('Resolve IP') { steps { script { def serverAddressMapping = [...] env.server_address = serverAddressMapping[params.choose_server] } } }Mapuje wybrany serwer na jego adres IP.
Checkout Code:
1 2 3 4 5 6 7 8stage('Checkout Code') { steps { script { sh 'mkdir -p ~/.ssh && ssh-keyscan gitlab.sysadmin.homes >> ~/.ssh/known_hosts' } checkout([...]) } }Konfiguruje klucze SSH i pobiera kod z GitLab.
Set Environment Variables:
1 2 3 4 5 6 7 8 9 10 11 12 13stage('Set Environment Variables') { steps { script { switch (params.choose_server) { case 'AWX': env.USERNAME_ID = 'awx-username' env.PASSWORD_ID = 'awx-password' break ... } } } }Ustawia zmienne środowiskowe na podstawie wybranego serwera.
Build Docker Image:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17stage('Build Docker Image') { steps { withCredentials([ string(credentialsId: 'nexus-npm-user', variable: 'NPM_USER'), string(credentialsId: 'nexus-npm-pass', variable: 'NPM_PASS') ]) { script { echo "Building Docker image with Nexus credentials:" sh ''' docker build -t ${DOCKER_IMAGE} \ --build-arg NPM_USER=${NPM_USER} \ --build-arg NPM_PASS=${NPM_PASS} -f Dockerfile . ''' } } } }Buduje obraz Docker za pomocą poświadczeń z repozytorium Nexus.
Run Taiko and Gauge Reports:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31stage('Run Taiko and Gauge reports') { agent { docker { image "${env.DOCKER_IMAGE}" args '-v /workspace:/workspace' } } steps { withCredentials([ string(credentialsId: env.USERNAME_ID, variable: 'username'), string(credentialsId: env.PASSWORD_ID, variable: 'password') ]) { script { sh ''' export server_address=${server_address} export username=${username} export password=${password} ''' sh "ln -s /usr/local/lib/node_modules/ ${WORKSPACE}/node_modules" sh 'ln -s /usr/local/lib/node_modules/ /lib/node_modules' sh 'rm -f *.tar downloaded//*' sh 'rm -rf reports .gauge logs' catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE') { sh """ gauge run ${WORKSPACE}/specs/${params.SPEC_FILE} """ } } } } }Uruchamia testy za pomocą
Taiko i Gauge wewnątrz kontenera Docker.
- **Archive Artifacts**:
```groovy
stage('Archive artifacts') {
steps {
script {
if (sh(script: "[ -d \"${WORKSPACE}/reports/\" ]", returnStatus: true) == 0) {
def formattedDate = new Date().format("dd_MM_yyyy_HH_mm")
def filename = "PASS_${REPORT_NAME}_${formattedDate}.tar"
sh """
tar -cf ${filename} ${WORKSPACE}/reports/ ${WORKSPACE}/logs/
"""
archiveArtifacts artifacts: "${filename}"
}
}
}
}
```
Archiwizuje raporty i logi testów, jeśli istnieją.
- **Clean Taiko Leftovers on a Docker Node**:
```groovy
stage('Clean Taiko leftovers on a Docker node') {
steps {
script {
cleanWs()
node('docker') {
cleanWs()
def workspaceDir = pwd()
sh "rm -rf ${workspaceDir}/Taiko* ${workspaceDir}/Taiko@* ${workspaceDir}/Taiko@2*"
}
}
}
}
```
Czyści wszelkie pozostałości po testach Taiko.
- Działania Post:Zapewnia, że obszar roboczy jest czyszczony po zakończeniu pipeline, niezależnie od wyniku.
1 2 3 4 5post { always { cleanWs() } }
Podsumowując, ten Jenkinsfile ustawia wieloetapowy pipeline, który pobiera kod z repozytorium GitLab, buduje obraz Docker, uruchamia testy za pomocą Taiko i Gauge, archiwizuje raporty testów oraz czyści obszar roboczy. Używa kilku parametrów i zmiennych środowiskowych, aby dostosować działanie w oparciu o wybrany serwer i plik specyfikacji.
3. Konfiguracja Dockerfile
Musisz przekazać nazwę użytkownika i hasło jako argumenty podczas budowania obrazu Docker.
Przykładowy Dockerfile
| |
Dockerfile - wyjaśnienie:
Ten Dockerfile został zaprojektowany, aby stworzyć obraz Docker zawierający środowisko do uruchamiania aplikacji Node.js oraz narzędzia do testowania za pomocą Gauge i Taiko. Oto szczegółowy opis każdej linii i sekcji tego Dockerfile:
Obraz Bazowy:
1FROM node:18-alpine3.17Obraz bazowy to
node:18-alpine3.17, czyli lekka wersja Alpine Linux z zainstalowanym Node.js w wersji 18.Definicja ARG Variables:
1 2ARG NPM_USER ARG NPM_PASSDefiniuje zmienne argumentów
NPM_USERiNPM_PASS, które będą używane do uwierzytelniania podczas pobierania pakietów npm.Konfiguracja .npmrc:
1 2 3RUN echo "registry=https://nexus.sysadmin.homes/repository/npm-group/" > /root/.npmrc RUN echo "//nexus.sysadmin.homes/repository/npm-group/:_auth=$(echo -n ${NPM_USER}:${NPM_PASS} | base64)" >> /root/.npmrc RUN echo "always-auth=true" >> /root/.npmrcTe polecenia tworzą plik
.npmrcw katalogu root (/root), konfigurując rejestr npm i dodając zakodowane w base64 poświadczenia do uwierzytelniania.Aktualizacja Pakietów i Instalacja Dodatkowych Narzędzi:
1 2RUN apk update > /dev/null RUN apk add --no-cache curl unzip git openssh bash nano wget ca-certificates openssl > /dev/nullAktualizuje indeks pakietów
apki instaluje różne narzędzia, takie jakcurl,unzip,git,openssh,bash,nano,wget,ca-certificatesiopenssl. Przekierowanie do/dev/nullukrywa szczegóły operacji.Czyszczenie Cache apk:
1RUN rm -rf /var/cache/apk/*Usuwa cache
apk, aby zmniejszyć rozmiar obrazu.Konfiguracja SSH dla GitLab:
1RUN mkdir -p /root/.ssh && ssh-keyscan gitlab.sysadmin.homes >> /root/.ssh/known_hostsTworzy katalog
.sshi dodaje klucz SSH GitLab do plikuknown_hosts, zapobiegając pytaniom o uwierzytelnienie podczas połączeń SSH.Instalacja Gauge:
1RUN curl -Ssl https://downloads.gauge.org/stable | shPobiera i instaluje Gauge za pomocą
curl.Instalacja Wtyczek Gauge:
1 2 3RUN gauge install js && \ gauge install screenshot && \ gauge install html-reportInstaluje trzy wtyczki Gauge:
js,screenshotihtml-report.Konfiguracja npm:
1 2RUN npm config set strict-ssl false RUN npm config set registry "https://nexus.sysadmin.homes/repository/npm-group/"Konfiguruje npm, wyłączając ścisłą kontrolę SSL i ustawiając niestandardowy rejestr npm.
Instalacja Pakietów npm:
1RUN npm install --no-fund --save -g npm@9.5.1 log4js@6.9.1 xml2js@0.6.2 isomorphic-fetch@3.0.0 node-ssh@13.1.0 taikoInstaluje różne pakiety npm globalnie, takie jak
npm,log4js,xml2js,isomorphic-fetch,node-sshitaiko.Wyłączenie Proxy:
1 2ENV http_proxy= ENV https_proxy=Usuwa zmienne środowiskowe proxy.
Ustawienie Zmiennych Środowiskowych:
1 2 3 4ENV NPM_CONFIG_PREFIX=/usr/local/lib/node_modules ENV PATH="${NPM_CONFIG_PREFIX}/bin:${PATH}" ENV TAIKO_BROWSER_ARGS=--no-sandbox,--start-maximized,--disable-dev-shm-usage,--headless,--disable-gpu ENV TAIKO_BROWSER_PATH=/usr/bin/chromium-browserUstawia kilka zmiennych środowiskowych, w tym ścieżkę instalacji npm, argumenty przeglądarki Taiko i ścieżkę do przeglądarki Chromium.
**Inst
alacja Przeglądarki Chromium**:
dockerfile
RUN apk add chromium
Instaluje przeglądarkę Chromium z repozytoriów Alpine.
Podsumowując, ten Dockerfile ustawia środowisko Node.js oparte na Alpine Linux, instaluje różne narzędzia potrzebne do testowania aplikacji za pomocą Gauge i Taiko oraz konfiguruje uwierzytelnianie npm i SSH.
Podsumowanie
- Utwórz użytkownika specjalnie dla npm w Nexus i przypisz rolę użytkownikowi do odczytu repozytorium npm.
- Przechowuj nazwę użytkownika i hasło jako poświadczenia (Secret text) w Jenkins i przekaż je jako argumenty podczas budowania obrazu Docker.
- Skonfiguruj plik
.npmrcw Dockerfile, używając nazwy użytkownika i hasła w formacie base64.
Stosując te modyfikacje, powinieneś być w stanie budować obrazy Docker z bezpiecznie przekazywanymi poświadczeniami npm z Jenkins, zapewniając, że twoje pakiety npm są pobierane z Nexus z odpowiednim uwierzytelnieniem.
Comments