bitbucket.org - czyli jak rozleniwiłem bloga post

Automatyzacja zadań, to nie tylko przysłowiowe "lenistwo", ale przede wszystkim oszczędność czasu. Przekonałem się o tym parę dni temu, kiedy chciałem zaktualizować swojego bloga.

tl;tr

Dzięki wykorzystaniu takich narzędzi jak sculpin.io, bitbucket.org oraz Bitbucket Pipelines zautomatyzowałem budowanie bloga i wdrażanie go na serwer.

Krok po kroku

  1. Użycie generatora stycznych stron - sculpin.io
  2. Wrzucenie zmian do repo na bitbucket.org
  3. Podpięcie Bitbucket Pipelines do budowania i wdrażania

Użycie generatora sculpin.io

Na stronie projektu można znaleźć instrukcje jak pracować z generatorem, jak definiować własne szablony etc. Ja zacząłem swoją przygodę od przeglądnięcia githuba. Możemy tam znaleźć szkielet aplikacji, który będzie naszym punktem wyjściowym.

https://github.com/sculpin/sculpin-blog-skeleton

Wybrałem sobie szablon o nazwie Clean Blog. Jego integracja jest stosunkowa prosta, wystarczy podążać zgodnie z instrukcją na stronie projektu sculpin.io.

Automatyczne budowanie

Sposobów na automatyzację procesu budowania jest bardzo dużo. Z racji tego, że repo jest na razie prywatne nie mogłem użyć narzędzi typu travis-ci.org. Potrzebowałem czegoś co obsługuje prywatne repozytoria.

Pozostały mi dwie możliwości:

Wybrałem tę drugą, ponieważ mój hosting to typowy shared hosting i nie posiadam na nim dockera, a lokalnie cały process odbywa się przy użyciu linuksowych kontenerów. Spójność w narzędziach pozwoliła mi znacznie przyśpieszyć wdrożenie automatycznych buildów na bitbucket.org

Po przestudiowaniu dokumentacji napisałem pierwszą wersję pliku bitbucket-pipelines.yml, wyglądała ona następująco:

pipelines: # główny klucz
  default: # domyślna definicja budowania aplikacji, dla wszystkich branchy etc.
    - step: # krok w naszym pipeline
        image: composer # obraz dockera z hub.docker.com lub store.docker.com
        caches:
          - composer # informacja o tym, jakie zależności chcemy cache'ować
        script:
          - composer install
          - vendor/bin/sculpin generate --env=prod --url "https://michal.kruczek.it"
          - chmod -R 777 output_prod/
        artifacts: # lista plików/mapa o tym, co jako artefakt ma być zarchiwizowane po danym kroku, będzie to przekazane do kolejnego kroku
          - output_prod/**

Linki:

Wynikiem powyższego pliku jest pipeline pokazany na poniższym obrazku. Takie zbudowanie bloga dla każdej gałęzi pozwala mi zweryfikować czy moje zmiany nie popsują strony.

Sculpin Bitbucket Pipeline

Ale co dalej?

Wdrożenie zmian na serwer

W przypadku strony, która jest statyczna wdrożenie aplikacji na serwer może odbywać się na wiele sposobów. Moim celem było przekopiowanie wersji zbudowanej na bb.org na mój hosting. Możemy do tego wykorzystać takie rozwiązania jak:

  • scp
  • rsync
  • mc
  • ftp
  • capistrano
  • ansistrano

Z tych wszystkich opcji najprostszym rozwiązaniem było wykorzystanie rsync'a. Sama komenda do wdrożenia wygląda następująco:

rsync -acvzh output_prod/ $DESTINATION_ADDRESS

Pewnie się zastanawiacie, dlaczego $DESTINATION_ADDRESS to zmienna. A to dlatego, że w zależności gdzie będę uruchamiał skrypt mogę użyć lokalnego adresu lub adresu zdalnego. Znacznie ułatwia to testy i pozwala na przenoszalność rozwiązania pomiędzy różne środowiska. W moim przypadku adres to inny serwer [email protected]:/adres/do/mojego/public/roota

Koniecznie zaglądnijcie na stronę 12factor.net na której znajdziecie opis 12 zasad, które pomogą Wam tworzyć lepsze aplikacje.

Jak dodać taki krok do naszego pipeline'u?

pipelines: # główny klucz
  default: # domyślna definicja budowania aplikacji, dla wszystkich branchy etc.
    - step: # krok w naszym pipeline
        image: composer # obraz dockera z hub.docker.com lub store.docker.com
        caches:
          - composer # informacja o tym, jakie zależności chcemy cache'ować
        script:
          - composer install
          - vendor/bin/sculpin generate --env=prod --url "https://michal.kruczek.it"
          - chmod -R 777 output_prod/
        artifacts: # lista plików/mapa o tym, co jako artefakt ma być zarchiwizowane po danym stepie, będzie to przekazane do kolejnego kroku
          - output_prod/**
    - step:
      image: atlassian/default-image:2
      script:
        - rsync -acvzh output_prod/ $DESTINATION_ADDRESS

W drugim kroku bitbucket automatycznie weźmie i skopiuje do naszej przestrzeni roboczej pliki zdefiniowane jako artefakty po kroku pierwszym (artifacts: ...).

Automatycznie generowane CV

Aktualne CV, to coś, co każdy z nas chciałby mieć. Wymaga to dyscypliny i systematyczności. A że ciągle miałem problem z szukaniem starej wersji, wersjonowaniem mojego CV oraz jego aktualizacją, proces ten w ramach strony także postanowiłem zautomatyzować.

Przeglądając różne narzędzia i szablony do CV miałem mieszane odczucia. Z wielu propozycji wybrałem Awesome-CV. Jest to szablon przygotowany i napisany w LaTeX z dodatkiem LaTeX FontAwesome, Roboto oraz Source Sans Pro.

Następnie używając git subtree dołączyłem ww. projekt do mojego repo, usunąłem zbędne zasoby, dostosowałem go do swoich potrzeb i miałem prawie gotową wersję. Kolejnym krokiem było samo budowanie. Niestety Awesome-CV wymaga sporo narzędzi, których instalacja lokalnie nie była możliwa na moim sprzęcie. Zamiast tego całość zamknąłem za obrazem dockerowym, dzięki czemu wdrożenie do bb.org było znacznie prostsze. Poprzednio pipeline zawierał 2 kroki: budowanie strony i wdrażanie na serwer. Od tego momentu pomiędzy tymi dwoma krokami musiał pojawić się nowy, który polegał na wygenerowaniu PDFa.

Ostateczny plik bitbucket-pipelines.yaml wygląda następująco:

pipelines: # główny klucz
  default: # domyślna definicja budowania aplikacji, dla wszystkich branchy etc.
    - step: # krok w naszym pipeline
        image: composer # obraz dockera z hub.docker.com lub store.docker.com
        caches:
          - composer # informacja o tym, jakie zależności chcemy cache'ować
        script:
          - composer install
          - vendor/bin/sculpin generate --env=prod --url "https://michal.kruczek.it"
          - chmod -R 777 output_prod/
        artifacts: # lista plików/mapa o tym, co jako artefakt ma być zarchiwizowane po danym stepie, będzie to przekazane do kolejnego kroku
          - output_prod/**
    - step:
      image: ablu/ubuntu-texlive-full
      script:
        - cd cv
        - make clean examples
        - cp cv.pdf ../output_prod/
      artifacts:
        - output_prod/**
    - step:
      image: atlassian/default-image:2
      script:
        - rsync -acvzh output_prod/ $DESTINATION_ADDRESS

Sculpin Bitbucket Pipeline - part 2

Plany na przyszłość

  • Zastąpić ablu/ubuntu-texlive-full przez swój własny obraz partikus/texlive
  • Uporządkować wszystkie lokalne obrazy i dockerfile
  • Dla lokalnego środowiska deweloperskiego dodać docker-compose
  • zredukować liczbę kroków w sekcji script: na bb.org na poczet gotowych skryptów typu deploy.sh build.sh pdf i build.sh website

Gotowe CV

Moje CV na podstawie ww rozwiązania znajdziecie tutaj.

Kategorie: php

Tagi: php, docker, bitbucket, pipelines, sculpin