Zwróć uwagę na różnicę związaną z użytkownikiem (zamiast użytkownika jenkins, użyjemy użytkownika root - poniżej znajdziesz wyjaśnienie dlaczego) podczas dodawania węzła z Dockera do Jenkins.
Jest znany problem z uprawnieniami. Generalnie, użytkownik, którego konfigurujesz, gdy łączysz się z węzłem Docker w konfiguracji węzła Jenkins, powinien być ustawiony jako root, a nie jenkins. Problem dotyczy GID dla użytkownika wewnątrz kontenera Docker. Jeśli użytkownik na hoście (węzeł Docker) ma inny GID niż użytkownik wewnątrz kontenera Docker, nie można kopiować plików między kontenerem Docker a hostem z powodu dwóch różnych GID, co prowadzi do błędu odmowy uprawnień w logu zadania Jenkins. Więcej znajdziesz tutaj:
problem z uprawnieniami woluminu persistent
1. Konfiguracja GitLab
Generowanie certyfikatu SSL
- Wygeneruj samopodpisany certyfikat SSL i dodaj ścieżkę do plików key i crt w gitlab.rb.
2. Konfiguracja Jenkins
Dodanie Dockera jako węzła w Jenkins
Po wygenerowaniu pary kluczy ed25519 na serwerze Jenkins dla użytkownika jenkins, wyślij klucz publiczny do węzła Docker dla użytkownika root.
Skonfiguruj połączenie SSH między Jenkins a węzłem Docker.
3. Konfiguracja Docker
Po wygenerowaniu certyfikatu SSL na serwerze GitLab, dodaj certyfikat dla węzła Docker.
4. Automatyzacja Testów Taiko i Gauge
Konfiguracja Kontenera Docker dla Taiko
Utwórz Dockerfile, który zainstaluje wszystkie wymagane zależności.
Skonfiguruj środowisko Node.js i przeglądarkę Chromium.
Tworzenie Jenkinsfile
Zdefiniuj pipeline w Jenkinsfile.
Skonfiguruj ustawienia uwierzytelniania, takie jak klucze SSH i tokeny API.
Poniżej szczegółowe kroki - uwaga -> TLDR :) Bez tego nie osiągniesz celu.
Serwer GitLab
Jest to kluczowy krok, ponieważ plik konfiguracyjny zawiera alt_names, które są niezbędne do prawidłowej identyfikacji nazwy serwera GitLab.
Możesz wykonać to polecenie tylko wtedy, gdy PermitRootLogin jest ustawiony na yes i Password authentication jest ustawione na yes w sshd_config na węźle docker. Po tym przywróć zmiany, które wprowadziłeś w /etc/ssh/sshd_config
Konfiguracja Jenkins:
Zaloguj się do panelu webowego Jenkins:
Następnie kliknij Manage Jenkins → Nodes
Kliknij przycisk + New Node po prawej stronie.
Podaj nazwę węzła
Wybierz permanent agent
Ustaw opis taki sam jak nazwa węzła
Ustaw liczbę wykonawców na 1 (można to później zwiększyć)
Ustaw katalog główny zdalny na /root
Ustaw etykietę docker
Użycie: używaj tego węzła tak często, jak to możliwe
Metoda uruchamiania: Uruchamiaj agentów przez SSH
Host: podaj adres IP węzła Docker
Credentials → dodaj → wybierz Jenkins
Rodzaj - wybierz z listy rozwijanej SSH username with private key
Podaj nazwę użytkownika: root
Wybierz wprowadzenie bezpośrednie
Wklej klucz prywatny skopiowany z jenkins_docker_ed25519 na serwerze Linux z Jenkins
W polu Opis podaj przyjazną nazwę, na przykład ed25519 key dla węzła Docker lub cokolwiek, co łatwo zidentyfikuje poświadczenia.
Podaj hasło do tego prywatnego klucza ed25519, które wygenerowałeś wcześniej na serwerze Linux z Jenkins.
Kliknij dodaj
Wybierz nowo utworzone poświadczenia z listy rozwijanej
Strategia weryfikacji klucza hosta: wybierz: Known hosts file Verification Strategy
Dostępność: Utrzymuj tego agenta online tak często, jak to możliwe
Właściwości węzła: zaznacz/wybierz Zmienne środowiskowe i Lokalizacje narzędzi
W sekcji Zmienne środowiskowe dodaj:
Nazwa: JAVA_HOME
Wartość: /usr/bin/java
W sekcji Lokalizacje narzędzi dodaj:
Nazwa: Git (default)
Wartość: /usr/bin/git
Kliknij zapisz
2. Konfiguracja Połączenia Jenkins z GitLab (Token API)
Drugim krokiem jest skonfigurowanie połączenia Jenkins z GitLab za pomocą tokenu API.
Kroki:
Konto techniczne jenkins-ci powinno być utworzone jako Zwykły użytkownik w GitLab, a nie jako Administrator. Podejście to przestrzega zasady minimalnych uprawnień, co pomaga zminimalizować ryzyko bezpieczeństwa poprzez przyznawanie tylko niezbędnych uprawnień wymaganych przez Jenkins do wykonywania zadań.
Kroki do Utworzenia Konta Technicznego (jenkins-ci) jako Zwykłego Użytkownika w GitLab:
Zaloguj się do GitLab jako Administrator:
Użyj swoich poświadczeń administratora, aby zalogować się do GitLab.
Przejdź do Obszaru Admina:
Kliknij na swój obrazek profilowy lub inicjały w prawym górnym rogu.
Wybierz Admin Area.
Utwórz Nowego Użytkownika:
W lewym pasku bocznym kliknij na Users.
Kliknij przycisk New User.
Wypełnij Dane Użytkownika:
Nazwa użytkownika: jenkins-ci
Imię: Jenkins CI
Email: Użyj dedykowanego adresu email dla tego użytkownika.
Wybierz silne hasło.
Upewnij się, że Regular user jest wybrane, a nie Administrator.
Ustaw Odpowiednie Uprawnienia:
Po utworzeniu użytkownika przejdź do projektu lub grupy, do której Jenkins będzie potrzebował dostępu.
Dodaj jenkins-ci jako członka do konkretnego projektu lub grupy.
Przypisz rolę Developer lub Maintainer, w zależności od wymaganych uprawnień.
Przypisywanie Roli Developer lub Maintainer:
Developer: Ta rola pozwala użytkownikowi na zapisywanie w repozytoriach, tworzenie gałęzi i wykonywanie innych zadań związanych z rozwojem.
Maintainer: Ta rola obejmuje wszystkie uprawnienia roli Developer oraz dodaje możliwość zarządzania ustawieniami projektu i wykonywania zadań administracyjnych w ramach projektu.
Dla większości operacji Jenkins, rola Developer jest wystarczająca. Jeśli Jenkins potrzebuje wykonywać dodatkowe zadania, takie jak zarządzanie ustawieniami projektu, użyj roli Maintainer.
Generowanie Tokenu API GitLab dla konta technicznego:
Zaloguj się jako jenkins-ci:
Wyloguj się z konta administratora i zaloguj się przy użyciu poświadczeń jenkins-ci.
Generowanie Tokenu API:
Przejdź do `User
Settings>Access Tokens`.
Utwórz nowy token z wymaganymi zakresami (api, read_repository).
Skopiuj wygenerowany token.
Dodawanie Tokenu API GitLab w Jenkins:
Przejdź do Interfejsu Webowego Jenkins:
Przejdź do Manage Jenkins > Configure System.
Dodaj Token API:
W sekcji GitLab, kliknij Add > Jenkins.
Wybierz GitLab API token.
Wklej token i podaj opis (np. GitLab API Token).
Dodawanie Tokenu na Poziomie Projektu w Jenkins:
Generowanie Tokenu API na Poziomie Projektu w GitLab:
Przejdź do konkretnego projektu GitLab.
Przejdź do Settings > Access Tokens.
Utwórz nowy token z wymaganymi zakresami (read_repository).
Skopiuj wygenerowany token.
Dodawanie Tokenu na Poziomie Projektu w Jenkins:
Przejdź do Manage Jenkins > Manage Credentials.
Wybierz odpowiednią domenę (np. global).
Kliknij Add Credentials.
Wybierz Username with password jako rodzaj.
Ustaw nazwę użytkownika na technicznego użytkownika, który jest członkiem w projekcie GitLab (np. project_bot).
Wklej wygenerowany token jako hasło.
Podaj opis (np. Taiko Project Token).
Zapisz zmiany.
Użycie w Jenkinsfile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pipeline{agentanystages{stage('Checkout'){steps{git(url:'https://gitlab.sysadmin.homes/developers/your-repo.git',branch:'main',credentialsId:'Taiko-token')}}// Inne etapy
}}
Tworząc jenkins-ci jako zwykłego użytkownika i przypisując odpowiednie role, zapewniasz, że Jenkins ma niezbędne uprawnienia do interakcji z GitLab w sposób bezpieczny i efektywny, bez nadmiernego przyznawania uprawnień.
Powód użycia dwóch różnych metod obsługi tokenów API w Jenkins wynika z różnych kontekstów i zakresów, w jakich są one używane:
Token API GitLab do Połączenia Jenkins:
Ten token jest tworzony na poziomie użytkownika (np. technicznego użytkownika jenkins-ci).
Pozwala Jenkins na interakcję z API GitLab w szerszym zakresie, takim jak zarządzanie projektami, użytkownikami i grupami, pobieranie informacji o repozytorium, uruchamianie pipeline’ów itp.
Jest dodawany w Jenkins jako GitLab API token w Manage Jenkins > Configure System > GitLab.
Token na Poziomie Projektu do Dostępu do Repozytorium:
Ten token jest specyficzny dla projektu i jest często używany do klonowania repozytoriów podczas budowy.
Ponieważ Jenkins musi się uwierzytelnić w GitLab, aby klonować repozytoria, używa tego tokenu jako hasła, a związanego technicznego użytkownika (np. project_bot) jako nazwy użytkownika.
Ten token jest dodawany jako Username with password w Jenkins w Manage Jenkins > Manage Credentials.
Używając tych dwóch różnych metod, zapewniasz, że Jenkins może interagować z GitLab w sposób bezpieczny i efektywny, wykorzystując odpowiedni zakres i uprawnienia do każdej interakcji.
3. Konfiguracja Połączenia Węzła Docker z GitLab (dodanie certyfikatu SSL GitLab)
Kroki:
Dodawanie certyfikatu:
Zobacz skrypt bash do automatyzacji.
4. Automatyzacja Testów Taiko i Gauge
Tworzenie Zadania Jenkins z Użyciem Jenkins Pipeline i Dockerfile - Krok po Kroku
Utwórz nowy pipeline w Jenkins.
Wybierz GitLab dla Docker jako połączenie z GitLab.
Przewiń w dół do sekcji pipeline.
Wybierz z listy rozwijanej “pipeline script from SCM”.
Wybierz z listy rozwijanej SCM “Git”.
Wprowadź URL repozytorium GitLab.
Wybierz token API dla projektu z listy rozwijanej.
Wybierz gałąź, np. “main”.
Pozostaw nazwę Jenkinsfile bez zmian.
W Jenkinsfile zdefiniuj kroki i określ ścieżkę do Dockerfile znajdującego się w repozytorium GitLab, gdzie przechowywane są testy Taiko i raporty Gauge.
Dodawanie awx-user-id i awx-password-id jako Secret Text w Jenkins
Aby bezpiecznie przechowywać i zarządzać poufnymi informacjami, dodaj awx-user-id i awx-password-id jako poświadczenia tekstowe w Jenkins. Wykonaj następujące kroki:
Przejdź do Poświadczeń Jenkins:
Przejdź do interfejsu webowego Jenkins.
Kliknij Manage Jenkins > Manage Credentials.
Dodaj Poświadczenia Tekstowe:
Wybierz odpowiednią domenę (np. global).
Kliknij Add Credentials.
Dla Kind, wybierz Secret text.
W polu Secret wprowadź wartość awx-user-id.
Podaj znaczący identyfikator (np. awx-user-id).
Kliknij OK.
Powtórz dla awx-password-id:
Powtórz kroki, aby dodać kolejne poświadczenie tekstowe.
Wprowadź wartość awx-password-id i identyfikator.
Użycie Poświadczeń Tekstowych w Pipeline Jenkins:
Podczas konfigurowania Jenkinsfile, użyj powiązania poświadczeń, aby uzyskać dostęp do tych sekretów:
1
2
3
withCredentials([string(credentialsId:'awx-user-id',variable:'username'),string(credentialsId:'awx-password-id',variable:'password')]){// Twój kod pipeline
}
Przykładowy Dockerfile-Taiko, który również jest dodany w projekcie GitLab:
RUN npm config set registry "https://nexus.sysadmin.homes/repository/npmjs.org"
odpowiada za pakiety npm. Pobiera pakiety do Nexus, który działa jako cache proxy dla nodejs i npm.
Ustanowienie Połączenia SSH z Węzłem Docker
Przed uruchomieniem zadania pipeline w Jenkins, ustanów połączenie SSH z użytkownika root na węźle Docker do GitLab:
1
ssh -T git@10.10.0.119
Testowanie i Uruchamianie
Tworzenie i Uruchamianie Testów
Twórz skrypty testowe Taiko i Gauge.
Uruchamiaj testy z Jenkins, monitorując wyniki i generując raporty.
Rozwiązywanie Problemów
Ustawienia SSH i UID/GID dla użytkowników w Docker.
Rozwiązywanie problemów z uruchamianiem przeglądarki w trybie bezgłowym.
Podsumowanie
Dzięki powyższym instrukcjom krok po kroku, powinieneś być w stanie zautomatyzować swoje testy i stworzyć zwięzły i jasny tekstowy samouczek. Jeśli masz dalsze pytania lub potrzebujesz dodatkowej pomocy, daj mi znać!
Wyjaśnienie
Token API w Jenkins:
Jenkins nie używa kluczy RSA ani ED25519 do komunikacji z GitLab; używa tokenów API. Ten token powinien być utworzony na poziomie technicznego użytkownika w GitLab, a nie na poziomie projektu. Oznacza to, że musisz utworzyć technicznego użytkownika w GitLab, wygenerować token API dla tego użytkownika i użyć go w konfiguracji Jenkins.
Token Projektowy w Jenkinsfile:
W Jenkinsfile, credentialsId: 'Taiko-token' jest zadeklarowane, co odnosi się do tokenu projektowego. Ten token nie jest dodawany w Jenkins za pomocą tokenu API GitLab, ale raczej jako zwykła nazwa użytkownika i hasło w poświadczeniach Jenkins. Oznacza to, że musisz dodać token jako hasło, a jako ID w Jenkins użyć nazwy użytkownika skopiowanej z sekcji członków projektu GitLab.
To rozwiązanie działa, ponieważ Jenkins wymaga uwierzytelnienia, aby uzyskać dostęp do repozytorium GitLab, a zamiast pełnego logowania przez API, używa poświadczeń użytkownika z tokenem jako hasłem.
/* globals gauge*/"use strict";constpath=require('path');const{openBrowser,write,closeBrowser,goto,button,press,screenshot,above,click,checkBox,listItem,toLeftOf,link,text,into,textBox,evaluate}=require('taiko');constassert=require("assert");constheadless=process.env.headless_chrome.toLowerCase()==='true';beforeSuite(async()=>{awaitopenBrowser({headless:headless})});afterSuite(async()=>{awaitcloseBrowser();});// Zwraca nazwę pliku z zrzutem ekranu
gauge.customScreenshotWriter=asyncfunction(){constscreenshotFilePath=path.join(process.env['gauge_screenshots_dir'],`screenshot-${process.hrtime.bigint()}.png`);awaitscreenshot({path:screenshotFilePath});returnpath.basename(screenshotFilePath);};step("Navigate to the AWX login page",asyncfunction(){awaitgoto("awx.sysadmin.homes");});step("Assert the login page is loaded",async()=>{assert(awaittext("Welcome to AWX!").exists());});step('Use credentials <username>:<password>',async(username,password)=>{awaitwrite(process.env.username,into(textBox("Username"),{force:true}));awaitwrite(process.env.password,into(textBox("Password"),{force:true}));});step("Click the login button",async()=>{awaitclick(button("Log In"));});step("Verify successful login",async()=>{assert(awaittext("Dashboard").exists());});step("Clear all tasks",asyncfunction(){awaitevaluate(()=>localStorage.clear());});
test-awx.spec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# AWX login test
aby wykonać tę specyfikację, użyj
npm test
To jest krok kontekstowy, który uruchamia się przed każdym scenariuszem
* Navigate to the AWX login page
## Logowanie do AWX
* Assert the login page is loaded
* Use credentials "admin":"password"
* Click the login button
* Verify successful login
___
* Clear all tasks