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
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ń.
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).
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)#
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:
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ć!
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
Comments