Automatyzacja procesów budowania, testowania i wdrażania aplikacji 

Paweł Łukasik

Plan

  • SQL
  • Testy
  • Deployment
  • Automatyzacja
  • Test (na zaliczenie!)

Test (na ocenę)

  • jutro, na koniec dnia (~25-30 minut)
  • z 25 pytań
  • pytania (bez odpowiedzi ;)) na forum
  • tylko jednokrotnego wyboru
  • każde ma taką samą wagę

SQL

  • SQL - structured query language
  • różne dialekty (MySQL, SQL Server, Oracle)
  • zapytania SQL
    • SELECT, INSERT, DELETE, UPDATE
  • ORM (Object-relationship mapper)
    • dapper
    • entity framework

Przykład zapytania

CREATE TABLE Prowadzacy
(
	Id int NOT NULL identity(1,1),
	Imie NVARCHAR(50) NOT NULL,
	Nazwisko NVARCHAR(50) NOT NULL,
	PRIMARY KEY (Id)
)

CREATE TABLE Kierunki
(
	Id int NOT NULL identity(1,1),
	Nazwa NVARCHAR(255) NOT NULL,
	PRIMARY KEY (Id)
)

CREATE TABLE ProwadzacyKierunek
(
	Id int NOT NULL identity(1,1),
	IdProwadzacego int NOT NULL,
	IdKierunku int NOT NULL,
	PRIMARY KEY(Id),
	FOREIGN KEY (IdProwadzacego) REFERENCES Prowadzacy(Id),
	FOREIGN KEY (IdKierunku) REFERENCES Kierunki(Id)
)
GO

Baza danych

INSERT

INSERT INTO dbo.Prowadzacy(Imie, Nazwisko) VALUES ('Pweł', 'Łukasik');
INSERT INTO dbo.Prowadzacy(Imie, Nazwisko) VALUES ('Piotr', 'Gankiewicz');

INSERT INTO Kierunki(Nazwa) VALUES ('Programista platformy .NET');

INSERT INTO ProwadzacyKierunek(IdProwadzacego, IdKierunku) VALUES (1,1);
INSERT INTO ProwadzacyKierunek(IdProwadzacego, IdKierunku) VALUES (2,1);

UPDATE

UPDATE Prowadzacy SET Imie = 'Paweł' WHERE Id = 1

DELETE

DELETE FROM ProwadzacyKierunek WHERE id = 1

Demo

Adres: https://phpadmin.webio.pl/signon.php

User: 50_wszib_user

Pass: wszib2017_2018

Webio: mysql

Zadanie cd.

Do zrobienia:

Napisz zapytani(e/a), które:
- stworzą strukturę tabel jak pokazano wcześniej
- dodadzą dane o kierunku, prowadzących i powiążą je ze sobą
- doda jeszcze jeden kierunek
- doda jeszcze jednego prowadzącego (np. Ciebie)
- powiąże nowego prowadzącego z nowym kierunkiem

Użyć unikalnego prefixu w nazwach tabel np. PL_Kierunki zamiast Kierunki.

Kilka różnic między MySQL a SQL Server:

- IDENTITY(1,1) == AUTO_INCREMENT
- nie ma NVARCHAR, używamy po prostu VARCHAR

Przykład klucza obcego:
CONSTRAINT FOREIGN KEY (column) REFERENCES table(column)

Dostęp do bazy z kodu

  • połączenie do bazy (connection) -> connection string
  • zapytania - bezpośrednie lub poprzez ORM
SqlConnection lub generyczne DbConnection
  • pomoc przy connection stringach - http://connectionstrings.com

Zadanie

Server: mssql.webio.pl,2401
Baza danych: pawlos_wszib2017_2018 (MSSQL)
user: pawlos_wszib2017_2018
pass: Wszib2017_2018


Jaki będzie connection string?
Jak napiszemy kod, który wyciągnie dane z bazy danych? A jaki, który skasuje?

Zadanie 2

Server: mssql.webio.pl,2401
Baza danych: pawlos_wszib2017_2018
user: pawlos_wszib2017_2018
pass: Wszib2017_2018


Napisz kod, który umożliwi zapisanie przesyłek (Parcel) do bazy danych?

ORM

  • ​Object-Relationship mapping
  • umożliwiają operowanie na danych bez czystych zapytań (dobrze napisane, uniemożliwiają SQL Injection)
  • Przykłady:
    • Dapper
    • EntityFramework
    • nHibernate (klon Hibernate z Java)
    • NReco.Data
    • inne

Zadanie

Baza danych: pawlos_wszib2017_2018
user: pawlos_wszib2017_2018
pass: Wszib2017_2018

- przerobić wcześniej napisany kod przy użyciu ORMa

Dlaczego automatyzacja jest ważna?

  • człowiek jest omylny
  • zapomina o niezbędnych/rutynowych czynnościach
  • build once, run everywere

Jak automatyzować?

  • *.bat
  • PowerShell
  • DeploymentProfile
  • narzędzia firm trzecich

Testowanie

  • ręczne z poziomu VS, zewnątrzna aplikacja
  • automatyczne np. w ramach CI (np. TeamCity)
  • różne testy: jednostkowe, integracyjne, UI, etc.

Deployment

  • IIS / IIS Express
  • inne web serwery (nginx, Apache)
  • Docker (kontenery)
  • self-hosted
  • chmury

IIS

  • tylko Windows
UseIISIntegration()

Inne webserwery

  • nginx
  • Apache

Docker (kontenery)

FROM microsoft/dotnet:latest
COPY . /app
WORKDIR /app

RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]

EXPOSE 5000/tcp
ENV ASPNETCORE_URLS http://*:5000

ENTRYPOINT ["dotnet", "run"]

DEMO

Self-hosted

  • Windows Service

Chmury

  • np. azure

Continuous Integration

 

  • łączenie własnych zmian ze zmianami innych programistów
  • budowanie całego projektu wraz ze zmianami
  • uruchamianie testów
  • publikacja artefaktów

TeamCity

AppVeyor

Continuous Deployment

  • to samo co CI plus
  • automatyczny deploy

CI/CD

  • Continuous Integration
  • Continuous Deployment

from: https://puppet.com/blog/continuous-delivery-vs-continuous-deployment-what-s-diff

Podsumowanie