Udostępnij za pośrednictwem


Poradnik: tworzenie potoku Jenkins przy użyciu GitHub i Docker

Ważne

Podczas gdy wiele usług platformy Azure ma wtyczki Jenkins, większość z tych wtyczek zakończyła wsparcie 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 usługi Azure.

Aby zautomatyzować fazę kompilowania i testowania tworzenia aplikacji, możesz użyć potoku ciągłej integracji i wdrażania (CI/CD). W tym samouczku utworzysz pipeline CI/CD na maszynie wirtualnej Azure, który obejmuje:

  • Tworzenie maszyny wirtualnej serwera Jenkins
  • Instalowanie i konfigurowanie usługi Jenkins
  • Tworzenie integracji webhooku między GitHubem a Jenkinsem
  • Tworzenie i wyzwalanie zadań kompilacji usługi Jenkins na podstawie zatwierdzeń usługi GitHub
  • Tworzenie obrazu platformy Docker dla aplikacji
  • Weryfikowanie zatwierdzeń usługi GitHub kompilowanie nowego obrazu platformy Docker i aktualizacji uruchomionej aplikacji

Ten samouczek używa wiersza polecenia w usłudze Azure Cloud Shell, który jest stale aktualizowany do najnowszej wersji. Aby otworzyć Cloud Shell, wybierz opcję Wypróbuj w górnej części dowolnego bloku kodu.

Jeśli zdecydujesz się zainstalować i używać CLI lokalnie, ten samouczek wymaga, abyś miał zainstalowaną wersję Azure CLI 2.0.30 lub nowszą. Uruchom az --version, aby znaleźć wersję. Jeśli konieczna będzie instalacja lub uaktualnienie, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.

Tworzenie wystąpienia narzędzia Jenkins

W poprzednim samouczku dotyczącym dostosowywania maszyny wirtualnej z systemem Linux podczas pierwszego rozruchu przedstawiono sposób automatyzowania dostosowywania maszyny wirtualnej przy użyciu pakietu cloud-init. W tym samouczku użyto pliku cloud-init do zainstalowania serwera Jenkins i platformy Docker na maszynie wirtualnej. Jenkins to popularny serwer automatyzacji typu open source, który bezproblemowo integruje się z platformą Azure, aby umożliwić ciągłą integrację i ciągłe dostarczanie (CD). Aby uzyskać więcej samouczków dotyczących korzystania z usługi Jenkins, zobacz narzędzie Jenkins w usłudze Azure Hub.

W bieżącej powłoce utwórz plik o nazwie cloud-init-jenkins.txt i wklej następującą konfigurację. Na przykład utwórz plik w usłudze Cloud Shell, a nie na maszynie lokalnej. Wprowadź sensible-editor cloud-init-jenkins.txt polecenie , aby utworzyć plik i wyświetlić listę dostępnych edytorów. Upewnij się, że cały plik cloud-init został poprawnie skopiowany, zwłaszcza pierwsza linia.

#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 tworzy grupę zasobów o nazwie myResourceGroupJenkins w lokalizacji eastus :

az group create --name myResourceGroupJenkins --location eastus

Teraz utwórz maszynę wirtualną za pomocą az vm create. Użyj parametru --custom-data do przekazania swojego pliku konfiguracyjnego cloud-init. Podaj pełną ścieżkę do cloud-init-jenkins.txt , jeśli plik został zapisany poza obecnym katalogem 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, aby otworzyć port 8080 dla ruchu usługi Jenkins oraz port 1337 dla aplikacji Node.js wykorzystywanej do uruchamiania przykładowej aplikacji.

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 Jenkins, zdobądź publiczny adres IP maszyny wirtualnej.

az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv

W celach bezpieczeństwa należy wprowadzić początkowe hasło administratora przechowywane w pliku tekstowym na maszynie wirtualnej, aby rozpocząć instalację serwera Jenkins. Użyj publicznego adresu IP uzyskanego w poprzednim kroku do protokołu SSH na maszynie wirtualnej:

ssh azureuser@<publicIps>

Sprawdź, czy narzędzie Jenkins jest uruchomione przy użyciu service polecenia :

$ 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 plik initialAdminPassword dla instalacji narzędzia Jenkins i skopiuj go:

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

Jeśli plik nie jest jeszcze dostępny, poczekaj kilka minut, aż pakiet cloud-init ukończy instalację serwera Jenkins i platformy Docker.

Teraz otwórz przeglądarkę internetową i przejdź do strony http://<publicIps>:8080. Wykonaj początkową konfigurację serwera Jenkins w następujący sposób:

  • Wybierz Wybierz wtyczki do zainstalowania
  • Wyszukaj ciąg GitHub w polu tekstowym u góry. Zaznacz pole wyboru dla usługi GitHub, a następnie wybierz pozycję Zainstaluj
  • Utwórz pierwszego użytkownika administratora. Wprowadź nazwę użytkownika, taką jak administrator, a następnie podaj własne 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 usługi Jenkins
    • Jeśli przeglądarka internetowa wyświetli pustą stronę po rozpoczęciu korzystania z serwera Jenkins, uruchom ponownie usługę Jenkins. W sesji SSH wpisz sudo service jenkins restart, a następnie odśwież przeglądarkę internetową.
  • W razie potrzeby zaloguj się do serwera Jenkins przy użyciu utworzonej nazwy użytkownika i hasła.

Utwórz webhook GitHub

Aby skonfigurować integrację z usługą GitHub, otwórz przykładową aplikacjęNode.js Hello World z repozytorium przykładów platformy Azure. Aby sforkować repozytorium na własne konto GitHub, wybierz przycisk Fork w prawym górnym rogu.

Utwórz webhook wewnątrz utworzonego forku.

  • Wybierz Ustawienia, a następnie wybierz Webhooki na lewej stronie.
  • Wybierz Dodaj webhook, a następnie wpisz Jenkins w polu filtrowania.
  • W polu Adres URL ładunku wprowadź http://<publicIps>:8080/github-webhook/. Upewnij się, że dołączysz ciąg końcowy /
  • W polu Typ zawartości wybierz pozycję application/x-www-form-urlencoded.
  • Które zdarzenia chcesz użyć do uruchomienia tego webhooka?, wybierz Tylko zdarzenie push.
  • Ustaw opcję Aktywna jako zaznaczoną.
  • Kliknij Dodaj webhook.

Dodaj webhooka GitHub do rozwidlononego repozytorium

Tworzenie zadania narzędzia Jenkins

Aby Jenkins odpowiedział na zdarzenie w GitHub, takie jak zatwierdzenie kodu, utwórz zadanie w Jenkinsie. Użyj adresów URL dla własnego rozwidlenia usługi GitHub.

W witrynie internetowej usługi Jenkins wybierz pozycję Utwórz nowe zadania na stronie głównej:

  • Wprowadź HelloWorld jako nazwę zadania. Wybierz pozycję Projekt Freestyle, a następnie wybierz przycisk OK.
  • W sekcji Ogólne wybierz Projekt GitHub i wprowadź adres URL rozwidlonemu repozytorium, taki jak https://github.com/cynthn/nodejs-docs-hello-world
  • W sekcji Zarządzanie kodem źródłowym wybierz opcję Git, wprowadź adres URL swojego rozwidlenia repozytorium .git, na przykład https://github.com/cynthn/nodejs-docs-hello-world.git
  • W sekcji Build Triggers (Wyzwalacze kompilacji) wybierz GitHub hook trigger for GITscm polling.
  • W sekcji Kompilacja wybierz pozycję Dodaj krok kompilacji. Wybierz pozycję Uruchom powłokę, a następnie wprowadź echo "Test" w oknie polecenia.
  • Wybierz pozycję Zapisz w dolnej części okna zadań.

Testowanie integracji z usługą GitHub

Aby przetestować integrację usługi GitHub z usługą Jenkins, zatwierdź zmianę w rozwidleniu.

Wróć do webowego interfejsu GitHub, wybierz sforkowane repozytorium, a następnie wybierz plik index.js. Wybierz ikonę ołówka, aby edytować ten plik i zrobić tak, żeby wiersz 6 brzmiał:

response.end("Hello World!");

Aby zatwierdzić zmiany, wybierz przycisk Zatwierdź zmiany u dołu.

W usłudze Jenkins nowa kompilacja rozpoczyna się w sekcji Historia kompilacji w lewym dolnym rogu strony zadania. Wybierz link numeru kompilacji i z lewej strony wybierz Dane wyjściowe konsoli. Możesz wyświetlić kroki wykonywane przez narzędzie Jenkins, gdy kod jest ściągany z usługi GitHub, a akcja kompilacji generuje komunikat Test do konsoli. Za każdym razem, gdy commit jest wykonywany w GitHub, webhook dociera do serwera Jenkins i wyzwala nową kompilację.

Definiowanie obrazu kompilacji platformy Docker

Aby zobaczyć aplikację Node.js uruchomioną na podstawie zatwierdzeń w GitHub, zbudujmy obraz Docker, aby uruchomić aplikację. Obraz jest tworzony na podstawie pliku Dockerfile, który definiuje sposób konfigurowania kontenera uruchamianego przez aplikację.

Z poziomu połączenia SSH z maszyną wirtualną przejdź do katalogu obszaru roboczego serwera Jenkins o nazwie po zadaniu utworzonym w poprzednim kroku. Przykład o nazwie HelloWorld.

cd /var/lib/jenkins/workspace/HelloWorld

Utwórz plik w tym katalogu obszaru roboczego z sudo sensible-editor Dockerfile i wklej do niego następującą zawartość. Upewnij się, że cały plik Dockerfile został poprawnie skopiowany, zwłaszcza w pierwszym wierszu:

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 Node.js przy użyciu systemu Alpine Linux, uwidacznia port 1337 uruchomiony przez aplikację Hello World, a następnie kopiuje pliki aplikacji i inicjuje go.

Tworzenie reguł kompilacji usługi Jenkins

W poprzednim kroku utworzono podstawową regułę kompilacji serwera Jenkins, która generuje komunikat do konsoli. Utwórzmy krok kompilacji, aby użyć naszego pliku Dockerfile i uruchomić aplikację.

Po powrocie do wystąpienia narzędzia Jenkins wybierz zadanie utworzone w poprzednim kroku. Wybierz pozycję Konfiguruj po lewej stronie i przewiń w dół do sekcji Kompilacja :

  • Usuń istniejący echo "Test" krok kompilacji. Wybierz czerwony X w prawym górnym rogu istniejącego pola etapu kompilacji.

  • Wybierz Dodaj krok kompilacji, a następnie wybierz Uruchom w powłoce systemowej

  • 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 kompilacji platformy Docker tworzą obraz i tagują go przy użyciu numeru kompilacji narzędzia Jenkins, aby można było zachować historię obrazów. Wszystkie istniejące kontenery z uruchomioną aplikacją zostaną zatrzymane, a następnie usunięte. Nowy kontener jest następnie uruchamiany przy użyciu obrazu i uruchamia aplikację Node.js na podstawie najnowszych zatwierdzeń w usłudze GitHub.

Testowanie potoku

Aby zobaczyć cały potok w akcji, ponownie zmodyfikuj plik index.js w rozwidlonym repozytorium GitHub i wybierz Zatwierdź zmianę. Nowe zadanie jest uruchamiane w usłudze Jenkins na podstawie webhooka z GitHub. Utworzenie obrazu platformy Docker i uruchomienie aplikacji w nowym kontenerze potrwa kilka sekund.

W razie potrzeby ponownie uzyskaj 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. Aplikacja Node.js jest wyświetlana i odzwierciedla najnowsze zatwierdzenia w fork GitHub w następujący sposób:

Uruchamianie aplikacji Node.js

Teraz wprowadź kolejną edycję 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:

Uruchamianie aplikacji Node.js po kolejnym zatwierdzeniu w GitHub

Dalsze kroki

W tym samouczku skonfigurowano usługę GitHub do uruchamiania zadania kompilacji narzędzia Jenkins w każdym zatwierdzeniu kodu, a następnie wdrażania kontenera platformy Docker w celu przetestowania aplikacji. Nauczyłeś się, jak:

  • Tworzenie maszyny wirtualnej serwera Jenkins
  • Instalowanie i konfigurowanie usługi Jenkins
  • Tworzenie integracji webhooku między GitHubem a Jenkinsem
  • Tworzenie i wyzwalanie zadań kompilacji usługi Jenkins na podstawie zatwierdzeń usługi GitHub
  • Tworzenie obrazu platformy Docker dla aplikacji
  • Weryfikowanie zatwierdzeń usługi GitHub kompilowanie nowego obrazu platformy Docker i aktualizacji uruchomionej aplikacji

Przejdź do następnego samouczka, aby dowiedzieć się więcej o tym, jak zintegrować usługę Jenkins z usługą Azure DevOps Services.