Samouczek: tworzenie potoku serwera Jenkins przy użyciu usług GitHub i Docker
Ważne
Wiele usług platformy Azure ma wtyczki Jenkins. Niektóre z tych wtyczek nie będą obsługiwane od 29 lutego 2024 r. Interfejs wiersza polecenia platformy Azure to obecnie zalecany sposób integracji serwera Jenkins z usługami platformy Azure. Aby uzyskać więcej informacji, zapoznaj się z artykułem Wtyczki serwera Jenkins dla platformy Azure.
Aby zautomatyzować fazę kompilacji i testowania podczas tworzenia aplikacji, można użyć potoku ciągłej integracji i wdrażania (CI/CD). W tym samouczku utworzysz potok CI/CD na maszynie wirtualnej platformy Azure. Wykonasz m.in. następujące czynności:
- Tworzenie maszyny wirtualnej usługi Jenkins
- Instalowanie i konfigurowanie usługi Jenkins
- Tworzenie integracji elementu webhook między usługami GitHub i Jenkins
- Tworzenie i wyzwalanie zadań kompilacji usługi Jenkins z poziomu zatwierdzeń usługi GitHub
- Tworzenie obrazu platformy Docker dla aplikacji
- Sprawdzanie, czy zatwierdzenia GitHub tworzą nowy obraz platformy Docker i aktualizują działającą aplikację
W tym samouczku jest używany interfejs wiersza polecenia w usłudze Azure Cloud Shell, który jest stale aktualizowany do najnowszej wersji. Aby otworzyć usługę Cloud Shell, wybierz pozycję Wypróbuj w górnej części dowolnego bloku kodu.
Jeśli zdecydujesz się zainstalować interfejs wiersza polecenia i korzystać z niego lokalnie, ten samouczek wymaga interfejsu wiersza polecenia platformy Azure w wersji 2.0.30 lub nowszej. Uruchom polecenie az --version
, aby dowiedzieć się, jaka wersja jest używana. Jeśli konieczna będzie instalacja lub uaktualnienie, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.
Tworzenie wystąpienia usługi Jenkins
W poprzednim samouczku dotyczącym sposobu dostosowywania maszyny wirtualnej systemu Linux przy pierwszym uruchomieniu przedstawiono proces automatyzowania dostosowywania maszyny wirtualnej przy użyciu pliku cloud-init. W tym samouczku plik cloud-init jest używany do instalowania usługi Jenkins i platformy Docker na maszynie wirtualnej. Jenkins to popularny serwer automatyzacji typu open source, który bezproblemowo integruje się z platformą Azure, umożliwiając ciągłą integrację (CI) i ciągłe dostarczanie (CD). Więcej samouczków dotyczących korzystania z usługi można znaleźć w centrum Usługa Jenkins na platformie Azure.
W bieżącej powłoce utwórz plik o nazwie cloud-init-jenkins.txt i wklej poniższą konfigurację. Na przykład utwórz plik w usłudze Cloud Shell, a nie na maszynie lokalnej. Wprowadź sensible-editor cloud-init-jenkins.txt
, aby utworzyć plik i wyświetlić listę dostępnych edytorów. Upewnij się, że skopiowano cały plik cloud-init chmury, a szczególnie pierwszy wiersz:
#cloud-config
package_upgrade: true
write_files:
- path: /etc/systemd/system/docker.service.d/docker.conf
content: |
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
- path: /etc/docker/daemon.json
content: |
{
"hosts": ["fd://","tcp://127.0.0.1:2375"]
}
runcmd:
- apt install openjdk-8-jre-headless -y
- wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
- sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
- apt-get update && apt-get install jenkins -y
- curl -sSL https://get.docker.com/ | sh
- usermod -aG docker azureuser
- usermod -aG docker jenkins
- service jenkins restart
Zanim będzie można utworzyć maszynę wirtualną, utwórz grupę zasobów za pomocą polecenia az group create. Poniższy przykład obejmuje tworzenie grupy zasobów o nazwie myResourceGroupJenkins w lokalizacji eastus:
az group create --name myResourceGroupJenkins --location eastus
Utwórz maszynę wirtualną za pomocą polecenia az vm create. Użyj parametru --custom-data
do przekazania w pliku konfiguracji cloud-init. Podaj pełną ścieżkę do pliku cloud-init-jenkins.txt, jeśli plik został zapisany poza aktualnym katalogiem roboczym.
az vm create --resource-group myResourceGroupJenkins \
--name myVM \
--image UbuntuLTS \
--admin-username azureuser \
--generate-ssh-keys \
--custom-data cloud-init-jenkins.txt
Utworzenie i skonfigurowanie maszyny wirtualnej może potrwać kilka minut.
Aby zezwolić na ruch internetowy do maszyny wirtualnej, użyj polecenia az vm open-port w celu otwarcia portu 8080 dla ruchu usługi Jenkins i portu 1337 dla aplikacji Node.js używanej do uruchamiania aplikacji przykładowej:
az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 8080 --priority 1001
az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 1337 --priority 1002
Konfigurowanie usługi Jenkins
Aby uzyskać dostęp do wystąpienia usługi Jenkins, pobierz publiczny adres IP maszyny wirtualnej:
az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv
Ze względów bezpieczeństwa musisz wprowadzić początkowe hasło administratora, które jest przechowywane w pliku tekstowym na maszynie wirtualnej, aby rozpocząć instalację usługi Jenkins. Użyj publicznego adresu IP uzyskanego w poprzednim kroku dla protokołu SSH na maszynie wirtualnej:
ssh azureuser@<publicIps>
Użyj polecenia service
, aby sprawdzić, czy usługa Jenkins jest uruchomiona:
$ service jenkins status
● jenkins.service - LSB: Start Jenkins at boot time
Loaded: loaded (/etc/init.d/jenkins; generated)
Active: active (exited) since Tue 2019-02-12 16:16:11 UTC; 55s ago
Docs: man:systemd-sysv-generator(8)
Tasks: 0 (limit: 4103)
CGroup: /system.slice/jenkins.service
Feb 12 16:16:10 myVM systemd[1]: Starting LSB: Start Jenkins at boot time...
...
Wyświetl element initialAdminPassword
dla instalacji usługi Jenkins i skopiuj go:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
Jeśli plik nie jest jeszcze dostępny, poczekaj kilka minut, aż plik cloud-init ukończy instalację usługi Jenkins i platformy Docker.
Otwórz przeglądarkę internetową i przejdź do http://<publicIps>:8080
. Ukończ początkową konfigurację usługi Jenkins w następujący sposób:
- Wybierz pozycję Wybierz wtyczki do zainstalowania
- Wyszukaj pozycję GitHub w polu tekstowym u góry. Zaznacz pole wyboru pozycji GitHub, a następnie wybierz pozycję Zainstaluj.
- Utwórz pierwszego użytkownika administratora. Wprowadź nazwę użytkownika, taką jak admin, a następnie podaj bezpieczne hasło. Na koniec wpisz pełną nazwę i adres e-mail.
- Wybierz pozycję Zapisz i zakończ.
- Gdy narzędzie Jenkins będzie gotowe, wybierz pozycję Rozpocznij korzystanie z narzędzia Jenkins.
- Jeśli po rozpoczęciu korzystania z narzędzia Jenkins w przeglądarce internetowej zostanie wyświetlona pusta strona, uruchom ponownie usługę Jenkins. Z poziomu sesji protokołu SSH wpisz ciąg
sudo service jenkins restart
, a następnie odśwież przeglądarkę internetową.
- Jeśli po rozpoczęciu korzystania z narzędzia Jenkins w przeglądarce internetowej zostanie wyświetlona pusta strona, uruchom ponownie usługę Jenkins. Z poziomu sesji protokołu SSH wpisz ciąg
- W razie potrzeby zaloguj się do usługi Jenkins przy użyciu utworzonej nazwy użytkownika i hasła.
Tworzenie elementu webhook GitHub
Aby skonfigurować integrację z usługą GitHub, otwórz przykładową aplikację Node.js Hello World z poziomu repozytorium przykładów na platformie Azure. Aby utworzyć rozwidlenie repozytorium na koncie usługi GitHub, wybierz przycisk Rozwidlenie w prawym górnym rogu.
Utwórz element webhook wewnątrz utworzonego rozwidlenia:
- Wybierz pozycję Ustawienia, a następnie wybierz pozycję Elementy webhook po lewej stronie.
- Wybierz pozycję Dodaj element webhook, a następnie w polu filtru wprowadź nazwę Jenkins.
- W polu Payload URL (Adres URL ładunku) wprowadź adres
http://<publicIps>:8080/github-webhook/
. Upewnij się, że wpisano znak /. - W polu Content type (Typ zawartości) wybierz pozycję application/x-www-form-urlencoded.
- W obszarze Which events would you like to trigger this webhook? (Które zdarzenia mają wyzwalać ten element webhook?) wybierz opcję Just the push event (Tylko zdarzenie wypychania).
- Zaznacz pole wyboru Active (Aktywne).
- Kliknij przycisk Add webhook (Dodaj element webhook).
Tworzenie zadania usługi Jenkins
Aby usługa Jenkins odpowiadała w usłudze GitHub na zdarzenie, takie jak zatwierdzenie kodu, należy utworzyć zadanie usługi Jenkins. Użyj adresów URL dla własnego rozwidlenia usługi GitHub.
W witrynie internetowej usługi Jenkins wybierz na stronie głównej pozycję Utwórz nowe zadania:
- Wprowadź ciąg HelloWorld jako nazwę zadania. Wybierz Projekt Freestyle, a następnie wybierz pozycję OK.
- W sekcji Ogólne wybierz projekt GitHub i wprowadź adres URL rozwidlonego repozytorium, taki jak
https://github.com/cynthn/nodejs-docs-hello-world
- W sekcji Zarządzanie kodem źródłowym wybierz pozycję Git i wprowadź adres URL .git rozwidlonego repozytorium, taki jak
https://github.com/cynthn/nodejs-docs-hello-world.git
- W sekcji Kompilowanie wyzwalaczy wybierz pozycję Wyzwalacz punktu zaczepienia GitHub na potrzeby sondowania GITscm.
- W sekcji Kompilowanie wybierz pozycję Dodaj krok kompilacji. Wybierz pozycję Wykonaj powłokę, a następnie wprowadź
echo "Test"
w oknie wiersza polecenia. - Wybierz pozycję Zapisz w dolnej części okna zadań.
Testowanie integracji z usługą GitHub
Aby przetestować integrację z usługą GitHub przy użyciu usługi Jenkins, zatwierdź zmianę w rozwidleniu.
Po powrocie do internetowego interfejsu użytkownika usługi GitHub wybierz rozwidlone repozytorium, a następnie wybierz plik index.js. Wybierz ikonę ołówka, aby edytować ten plik tak, aby wiersz 6 wyglądał tak:
response.end("Hello World!");
Aby zatwierdzić zmiany, wybierz przycisk Zatwierdź zmiany u dołu.
W usłudze Jenkins nowa kompilacja zaczyna się w sekcji Historia kompilacji w lewym dolnym rogu strony zadania. Wybierz link numeru kompilacji i wybierz pozycję Dane wyjściowe konsoli po lewej stronie. Możesz wyświetlić kroki, które usługa Jenkins podejmuje, gdy kod jest ściągany z usługi GitHub, a akcja kompilacji generuje komunikat wyjściowy Test
do konsoli. Za każdym razem, gdy w usłudze GitHub przeprowadzane jest zatwierdzenie, element webhook łączy się z usługą Jenkins i wyzwala w ten sposób nową kompilację.
Definiowanie obrazu kompilacji platformy Docker
Aby wyświetlić aplikację Node.js działającą w oparciu o zatwierdzenia GitHub, skompilujmy obraz platformy Docker w celu uruchomienia aplikacji. Obraz jest kompilowany z pliku Dockerfile, który definiuje sposób konfigurowania kontenera uruchamiającego aplikację.
Z poziomu połączenia protokołu SSH z maszyną wirtualną przejdź do katalogu obszaru roboczego usługi Jenkins o nazwie odpowiadającej zadaniu utworzonemu w poprzednim kroku. W tym przykładzie była to nazwa HelloWorld.
cd /var/lib/jenkins/workspace/HelloWorld
Utwórz plik w bieżącym katalogu obszaru roboczego przy użyciu elementu sudo sensible-editor Dockerfile
i wklej poniższą zawartość. Upewnij się, że skopiowano cały plik Dockerfile, a szczególnie pierwszy wiersz:
FROM node:alpine
EXPOSE 1337
WORKDIR /var/www
COPY package.json /var/www/
RUN npm install
COPY index.js /var/www/
Ten plik Dockerfile używa obrazu podstawowego środowiska Node.js przy użyciu systemu Alpine Linux, uwidacznia port 1337, w którym działa aplikacja Hello World, a następnie kopiuje pliki aplikacji i inicjuje ją.
Tworzenie reguł kompilacji usługi Jenkins
W poprzednim kroku utworzono podstawową regułę kompilacji usługi Jenkins, która generuje komunikat wyjściowy w konsoli. Utwórzmy krok kompilacji, aby użyć naszego pliku Dockerfile i uruchomić aplikację.
Po powrocie do wystąpienia usługi Jenkins wybierz zadanie utworzone w poprzednim kroku. Wybierz pozycję Konfiguruj po lewej stronie i przewiń w dół do sekcji Kompilacja:
Usuń istniejący krok kompilacji
echo "Test"
. Wybierz czerwony krzyżyk w prawym górnym rogu pola istniejącego kroku kompilacji.Wybierz pozycję Dodaj krok kompilacji, a następnie wybierz pozycję Wykonaj powłokę
W polu Polecenie wprowadź następujące polecenia platformy Docker, a następnie wybierz pozycję Zapisz:
docker build --tag helloworld:$BUILD_NUMBER . docker stop helloworld && docker rm helloworld docker run --name helloworld -p 1337:1337 helloworld:$BUILD_NUMBER node /var/www/index.js &
Kroki procesu kompilacji platformy Docker powodują utworzenie obrazu i oznaczenie go numerem kompilacji usługi Jenkins, dzięki czemu można zachować historię obrazów. Istniejące kontenery z działającą aplikacją są zatrzymywane, a następnie usuwane. Nowy kontener jest następnie uruchamiany przy użyciu obrazu i uruchamia aplikację Node.js w oparciu o najnowsze zatwierdzenia w witrynie GitHub.
Testowanie potoku
Aby zobaczyć cały potok w akcji, edytuj ponownie plik index.js w rozwidlonym repozytorium GitHub, a następnie wybierz pozycję Zatwierdź zmianę. Nowe zadanie zostanie uruchomione w usłudze Jenkins w obrębie elementu webhook powiązanego z usługą GitHub. Utworzenie obrazu platformy Docker i uruchomienie aplikacji w nowym kontenerze trwa kilka sekund.
W razie potrzeby ponownie pobierz publiczny adres IP maszyny wirtualnej:
az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv
Otwórz przeglądarkę internetową i wprowadź http://<publicIps>:1337
. Zostanie wyświetlona aplikacja Node.js odzwierciedlająca najnowsze zatwierdzenia w rozwidleniu GitHub w następujący sposób:
Teraz wprowadź kolejną modyfikację pliku index.js w usłudze GitHub i zatwierdź zmianę. Poczekaj kilka sekund na ukończenie zadania w usłudze Jenkins, a następnie odśwież przeglądarkę internetową, aby wyświetlić zaktualizowaną wersję aplikacji uruchomionej w nowym kontenerze w następujący sposób:
Następne kroki
W tym samouczku skonfigurowano usługę GitHub do uruchomienia zadania kompilacji usługi Jenkins przy każdym zatwierdzeniu kodu, a następnie wdrożono kontener platformy Docker w celu testowania aplikacji. W tym samouczku omówiono:
- Tworzenie maszyny wirtualnej usługi Jenkins
- Instalowanie i konfigurowanie usługi Jenkins
- Tworzenie integracji elementu webhook między usługami GitHub i Jenkins
- Tworzenie i wyzwalanie zadań kompilacji usługi Jenkins z poziomu zatwierdzeń usługi GitHub
- Tworzenie obrazu platformy Docker dla aplikacji
- Sprawdzanie, czy zatwierdzenia GitHub tworzą nowy obraz platformy Docker i aktualizują działającą aplikację
Przejdź do następnego samouczka, aby dowiedzieć się więcej na temat sposobu integrowania usługi Jenkins z usługami Azure DevOps Services.