Si të instaloni dhe konfiguroni Concourse CI në CentOS 7

Prezantimi

Integrimi i vazhdueshëm është një praktikë e zhvillimit të softuerit DevOps e cila u mundëson zhvilluesve të bashkojnë shpesh kodin e modifikuar në depon e përbashkët shumë herë në ditë. Pas çdo bashkimi, kryhen ndërtime dhe teste automatike për të zbuluar problemet në kod. Ai u mundëson zhvilluesve të gjejnë dhe zgjidhin gabimet shpejt për të përmirësuar cilësinë e softuerit dhe për të ofruar shpërndarje të vazhdueshme të softuerit. Kalimi andej-këtej nga Concourse është shumë i lehtë pasi ruan të gjithë konfigurimin e tij në skedarë deklarativë që mund të kontrollohen në kontrollin e versionit. Ai gjithashtu siguron një ndërfaqe të përdoruesit në ueb që shfaq informacionin e ndërtimit në mënyrë interaktive.

Komponentët e Konkursit.
  • ATC është komponenti kryesor i Konkursit. Ai është përgjegjës për ekzekutimin e ndërfaqes së internetit dhe API-së. Ai gjithashtu kujdeset për të gjithë planifikimin e tubacionit.
  • TSA është një server SSH i ndërtuar me porosi. Ai është përgjegjës për regjistrimin e sigurt të një punonjësi në ATC.
  • Punëtorët më tej drejtojnë dy shërbime të ndryshme:
    1. Garden është një kohëzgjatje e kontejnerëve dhe një ndërfaqe për orkestrimin e kontejnerëve nga distanca në një punëtor.
    2. Bagageclaim është një server i menaxhimit të memories dhe objekteve.
  • Fly është një ndërfaqe e linjës komanduese e përdorur për të bashkëvepruar me ATC për të konfiguruar Tubacionet Concourse.

Parakushtet

Sigurohuni që të zëvendësoni të gjitha dukuritë 192.0.2.1dhe ci.example.comme adresën tuaj aktuale IP publike Vultr dhe emrin aktual të domenit.

Përditësoni sistemin tuaj bazë duke përdorur udhëzuesin Si të përditësoni CentOS 7 . Pasi sistemi juaj të jetë përditësuar, vazhdoni të instaloni PostgreSQL.

Instaloni dhe konfiguroni bazën e të dhënave PostgreSQL

PostgreSQL është një sistem bazë të dhënash relacionale objektesh. Concourse ruan të dhënat e tij të tubacionit në një bazë të dhënash PostgreSQL. Shtoni depon e PostgreSQL.

sudo rpm -Uvh https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm

Instaloni serverin e bazës së të dhënave PostgreSQL.

sudo yum -y install postgresql96-server postgresql96-contrib

Inicializoni bazën e të dhënave.

sudo /usr/pgsql-9.6/bin/postgresql96-setup initdb

initdbkrijon një grup të ri të bazës së të dhënave PostgreSQL, i cili është një koleksion bazash të dhënash që menaxhohen nga një shembull i vetëm server. Ndryshoni pg_hba.confskedarin për të aktivizuar vërtetimin e bazuar në MD5.

sudo nano /var/lib/pgsql/9.6/data/pg_hba.conf

Gjeni rreshtat e mëposhtëm dhe ndryshoni vlerat peerdhe identMETHODkolonën në trustdhe md5, përkatësisht.

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident

Pasi të përditësohet, konfigurimi duhet të duket kështu.

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

Nisni serverin PostgreSQL dhe aktivizoni atë të fillojë automatikisht në kohën e nisjes.

sudo systemctl start postgresql-9.6
sudo systemctl enable postgresql-9.6

Ndryshoni fjalëkalimin për përdoruesin e paracaktuar të PostgreSQL.

sudo passwd postgres

Identifikohu si përdorues i PostgreSQL:

sudo su - postgres

Krijo një përdorues të ri PostgreSQL për Concourse CI.

createuser concourse

Shënim : Përdoruesi i parazgjedhur i PostgreSQL mund të përdoret për vërtetimin e bazës së të dhënave, por rekomandohet përdorimi i një përdoruesi të dedikuar për vërtetimin e bazës së të dhënave Concourse në një konfigurim prodhimi.

PostgreSQL ofron një guaskë për të ekzekutuar pyetje në bazën e të dhënave. Kaloni në guaskën PostgreSQL duke ekzekutuar:

psql

Vendosni një fjalëkalim për përdoruesin e sapokrijuar të bazës së të dhënave të Concourse.

ALTER USER concourse WITH ENCRYPTED password 'DBPassword';

E rëndësishme : Zëvendësojeni DBPasswordme një fjalëkalim të fortë. Shënoni fjalëkalimin pasi do të kërkohet më vonë në tutorial.

Krijo një bazë të dhënash të re për Concourse.

CREATE DATABASE concourse OWNER concourse;

Dilni nga psqlguaska.

\q

Kalo te përdoruesi sudo nga përdoruesi aktual i postgres.

exit

Shkarkoni dhe instaloni Concourse CI

Shkarkoni versionin më të fundit të ekzekutueshëm Concourse dhe ruajeni në /usr/binmënyrë që të mund të ekzekutohet drejtpërdrejt. Versioni më i fundit i binarëve Concourse dhe Fly mund të gjendet në faqen e shkarkimit të Concourse . Publikimet e reja janë shumë të shpeshta. Zëvendësoni lidhjen e mëposhtme me lidhjen e re për versionin më të fundit.

sudo wget https://github.com/concourse/concourse/releases/download/v3.4.1/concourse_linux_amd64 -O /usr/bin/concourse

Në mënyrë të ngjashme, shkarkoni versionin më të fundit të skedarit të ekzekutueshëm dhe ruajeni në /usr/bin.

sudo wget https://github.com/concourse/concourse/releases/download/v3.4.1/fly_linux_amd64 -O /usr/bin/fly

Fly është ndërfaqja e linjës së komandës për t'u lidhur me ATC API të Concourse CI. Fly është i disponueshëm për platforma të shumta si Linux, Windows dhe MacOS.

Cakto lejen e ekzekutimit për skedarët e shkarkuar concoursedhe flybinare.

sudo chmod +x /usr/bin/concourse /usr/bin/fly

Kontrolloni nëse Concourse and Fly po funksionojnë siç duhet duke kontrolluar versionin e tyre.

concourse -version
fly -version

Gjeneroni dhe konfiguroni çelësat RSA

Çiftet e çelësave RSA ofrojnë një mënyrë për të koduar komunikimin midis komponentëve të Konkursit.

Që Concourse të funksionojë, duhet të gjenerohen të paktën tre palë çelësa. Për të enkriptuar të dhënat e sesionit, krijoni një session_signing_key. Ky çelës do të përdoret gjithashtu nga TSA për të nënshkruar kërkesat që i bën ATC-së. Për të siguruar serverin TSA SSH, gjeneroni një tsa_host_key. Së fundi, krijoni një worker_keypër çdo punëtor.

Krijo një direktori të re për të ruajtur çelësat dhe konfigurimin në lidhje me Concourse CI.

sudo mkdir /opt/concourse

Gjeneroni çelësat e kërkuar.

sudo ssh-keygen -t rsa -q -N '' -f /opt/concourse/session_signing_key
sudo ssh-keygen -t rsa -q -N '' -f /opt/concourse/tsa_host_key
sudo ssh-keygen -t rsa -q -N '' -f /opt/concourse/worker_key

Autorizoni çelësin publik të punëtorëve duke kopjuar përmbajtjen e tij në authorized_worker_keysskedar:

sudo cp /opt/concourse/worker_key.pub /opt/concourse/authorized_worker_keys

Fillimi i Konkursit

Concourse ofron dy komponentë të veçantë që duhen nisur, web-i dhe punëtori. Filloni uebfaqen e Konkursit.

sudo concourse web \
  --basic-auth-username admin \
  --basic-auth-password StrongPass \
  --session-signing-key /opt/concourse/session_signing_key \
  --tsa-host-key /opt/concourse/tsa_host_key \
  --tsa-authorized-keys /opt/concourse/authorized_worker_keys \
  --postgres-user=concourse \
  --postgres-password=DBPassword \
  --postgres-database=concourse \
  --external-url http://192.0.2.1:8080

Ndryshoni emrin e përdoruesit dhe fjalëkalimin basic-authnëse dëshironi. Sigurohuni që shtegu i skedarëve kyç është i saktë dhe sigurohuni që të jepet vlera e saktë për emrin e përdoruesit dhe fjalëkalimin në konfigurimin e bazës së të dhënave PostgreSQL.

Shënim : ATC do të dëgjojë portin e paracaktuar 8080dhe TSA do të dëgjojë portin 2222. Nëse vërtetimi nuk është i dëshiruar, kaloni --no-really-i-dont-want-any-authopsionin pasi të keni hequr opsionet bazë të vërtetimit .

Once the web server is started, the following output should be displayed.

{"timestamp":"1503657859.661247969","source":"tsa","message":"tsa.listening","log_level":1,"data":{}}
{"timestamp":"1503657859.666907549","source":"atc","message":"atc.listening","log_level":1,"data":{"debug":"127.0.0.1:8079","http":"0.0.0.0:8080"}}

Stop the server for now, as a few more things still must be setup.

Start the Concourse CI Worker.

sudo concourse worker \
  --work-dir /opt/concourse/worker \
  --tsa-host 127.0.0.1 \
  --tsa-public-key /opt/concourse/tsa_host_key.pub \
  --tsa-worker-private-key /opt/concourse/worker_key

The above command will assume that the TSA is running on localhost and listening to the default port 2222.

Though the Concourse web and worker can be started easily using the commands above, it is recommended to use Systemd to manage the server.

Configure Environment and Systemd Service

Using Systemd service for managing the application ensures that the application is automatically started on failures and at boot time. The Concourse server does not take data from any configuration file, but it can access the data from environment variables. Instead of setting global environment variables, create a new file to store the environment variables and then pass the variables to the Concourse CI using the Systemd service.

Create a new environment file for Concourse web.

sudo nano /opt/concourse/web.env

Populate the file.

CONCOURSE_SESSION_SIGNING_KEY=/opt/concourse/session_signing_key
CONCOURSE_TSA_HOST_KEY=/opt/concourse/tsa_host_key
CONCOURSE_TSA_AUTHORIZED_KEYS=/opt/concourse/authorized_worker_keys

CONCOURSE_POSTGRES_USER=concourse
CONCOURSE_POSTGRES_PASSWORD=DBPassword
CONCOURSE_POSTGRES_DATABASE=concourse

CONCOURSE_BASIC_AUTH_USERNAME=admin
CONCOURSE_BASIC_AUTH_PASSWORD=StrongPass
CONCOURSE_EXTERNAL_URL=http://192.0.2.1:8080

Change the username and password of the BASIC_AUTH if desired. Make sure that the path to the key files are correct and make sure that the correct value for username and password in the PostgreSQL database configuration is provided.

Similarly, create an environment file for the worker.

sudo nano /opt/concourse/worker.env

Populate the file.

CONCOURSE_WORK_DIR=/opt/concourse/worker
CONCOURSE_TSA_WORKER_PRIVATE_KEY=/opt/concourse/worker_key
CONCOURSE_TSA_PUBLIC_KEY=/opt/concourse/tsa_host_key.pub
CONCOURSE_TSA_HOST=127.0.0.1

As the environment files contain username and passwords, change its permissions so that it cannot be accessed by other users.

sudo chmod 600 /opt/concourse/*.env

Now create a new user for Concourse to run the web environment. This will ensure that the web server is running in an isolated environment.

sudo adduser --system concourse

Give the concourse user ownership over Concourse CI file's directory.

sudo chown -R concourse:concourse /opt/concourse

Create a new systemd service file for the Concourse web service.

sudo nano /etc/systemd/system/concourse-web.service

Populate the file.

[Unit]
Description=Concourse CI web server
After=postgresql-9.6.service

[Service]
Type=simple
User=concourse
Group=concourse
Restart=on-failure
EnvironmentFile=/opt/concourse/web.env
ExecStart=/usr/bin/concourse web
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=concourse_web

[Install]
WantedBy=multi-user.target

Save and close the file. Create a new service file for the Concourse worker service.

sudo nano /etc/systemd/system/concourse-worker.service

Populate the file.

[Unit]
Description=Concourse CI worker process
After=concourse-web.service

[Service]
Type=simple
User=root
Group=root
Restart=on-failure
EnvironmentFile=/opt/concourse/worker.env
ExecStart=/usr/bin/concourse worker
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=concourse_worker

[Install]
WantedBy=multi-user.target

The web and worker service can now be started directly by running:

sudo systemctl start concourse-web concourse-worker

To enable the worker and web process to automatically start at boot time, run:

sudo systemctl enable concourse-worker concourse-web

To check the status of services, run:

sudo systemctl status concourse-worker concourse-web

If the service is not started, or in the FAILED state, remove the cache from the /tmp directory.

sudo rm -rf /tmp/*

Restart the services.

sudo systemctl restart concourse-worker concourse-web

Notice that this time the services have started correctly. The output upon verifying the status of the services should be simil.

[user@vultr ~]$ sudo systemctl status concourse-worker concourse-web
● concourse-worker.service - Concourse CI worker process
   Loaded: loaded (/etc/systemd/system/concourse-worker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2017-08-26 07:27:37 UTC; 55s ago
 Main PID: 3037 (concourse)
   CGroup: /system.slice/concourse-worker.service
           └─3037 /usr/bin/concourse worker

Aug 26 07:27:42 vultr.guest concourse_worker[3037]: {"timestamp":"1503732462.934722900","source":"tsa","message":"t...""}}
Aug 26 07:27:42 vultr.guest concourse_worker[3037]: {"timestamp":"1503732462.941227913","source":"guardian","messag...0"}}
...

● concourse-web.service - Concourse CI web server
   Loaded: loaded (/etc/systemd/system/concourse-web.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2017-08-26 07:27:37 UTC; 55s ago
 Main PID: 3036 (concourse)
   CGroup: /system.slice/concourse-web.service
           └─3036 /usr/bin/concourse web

Aug 26 07:27:57 vultr.guest concourse_web[3036]: {"timestamp":"1503732477.925554752","source":"tsa","message":"tsa...ve"}}
Aug 26 07:28:02 vultr.guest concourse_web[3036]: {"timestamp":"1503732482.925430775","source":"tsa","message":"tsa...ve"}}
...
Hint: Some lines were ellipsized, use -l to show in full.

Adjust your firewall to allow port 8080, on which ATS is running and port 2222, on which TSA is running.

sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --zone=public --add-port=2222/tcp --permanent
sudo firewall-cmd --reload

Connecting to the Server

Once the server is started, the web interface of the Concourse CI can be accessed by going to http://192.0.2.1:8080 in any browser. Log in using the username and password provided in the environment file.

To connect to the server using Fly, run:

fly -t my-ci login -c http://192.0.2.1:8080

The above command is used for initial login to the server. -t is used to provide a target name. replace my-ci with any desired target name. The above command will log in to the default team main. It will ask for the username and password provided in the environment file.

The output will look like the following.

[user@vultr ~]$ fly -t my-ci login -c http://192.0.2.1:8080
logging in to team 'main'

username: admin
password:

target saved

The target login will be saved for a day. After that, it will expire.

To log out immediately.

fly -t my-ci logout

fly can be used to login to the server outside of the network, but only if the server has a public IP address and it is accessible from outside the network. The Windows or MacOS binary can be downloaded from the download site or from the web UI of the server.

Setting Up Nginx Reverse Proxy

Logins, and other information sent through the web UI to the Concourse server is not secured. The connection is not encrypted. An Nginx reverse proxy can be set up with a Let's Encrypt free SSL.

Install the Nginx web server and Certbot, which is the client application for the Let's Encrypt CA.

sudo yum -y install certbot-nginx nginx

Start and enable Nginx to automatically start at boot time:

sudo systemctl start nginx
sudo systemctl enable nginx

Përpara se të bëhet një kërkesë për certifikatat, portet 80 dhe 443, ose shërbimet standarde HTTP dhe HTTPS, duhet të aktivizohen përmes murit të zjarrit. Certbot do të kontrollojë autoritetin e domenit përpara se të lëshojë certifikata.

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent

Porta 8080 nuk duhet të lejohet më përmes murit të zjarrit sepse Concourse tani do të ekzekutohet në portën standarde HTTPS. Hiqni hyrjen e murit të zjarrit për të lejuar portin 8080.

sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload

shënim

To obtain certificates from Let's Encrypt CA, the domain for which the certificates are to be generated must be pointed towards the server. If not, make the necessary changes to the DNS records of the domain and wait for the DNS to propagate before making the certificate request again. Certbot checks the domain authority before providing the certificates.

Gjeneroni certifikatat SSL.

sudo certbot certonly --webroot -w /usr/share/nginx/html -d ci.example.com

Certifikatat e krijuara ka të ngjarë të ruhen në /etc/letsencrypt/live/ci.example.com/drejtori. Certifikata SSL do të ruhet si fullchain.pemdhe çelësi privat do të ruhet si privkey.pem.

Le të Enkriptojmë certifikatat skadojnë për 90 ditë, prandaj rekomandohet rinovimi automatik për certifikatat të konfigurohet duke përdorur cronjobs. Cron është një shërbim sistemi që përdoret për të ekzekutuar detyra periodike.

Hapni skedarin e punës cron.

sudo crontab -e

Shtoni rreshtin e mëposhtëm në fund të skedarit.

30 5 * * 1 /usr/bin/certbot renew --quiet

Puna e mësipërme do të funksionojë çdo të hënë në orën 5:30 të mëngjesit. Nëse certifikata duhet të skadojë, ajo do të rinovohet automatikisht.

Krijo një host të ri virtual.

sudo nano /etc/nginx/conf.d/concourse-ssl.conf

Plotësoni skedarin.

server {
    listen 80;
    server_name ci.example.com;
    return 301 https://$host$request_uri;
}
server {

    listen 443;
    server_name ci.example.com;

    ssl_certificate           /etc/letsencrypt/live/ci.example.com/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/ci.example.com/privkey.pem;

    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    access_log    /var/log/nginx/concourse.access.log;

    location / {

      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;
      proxy_pass          http://localhost:8080;
      proxy_read_timeout  90;

      proxy_redirect      http://localhost:8080 https://ci.example.com;
    }
  }

Shënim : Zëvendësojeni ci.example.comme domenin aktual.

Redaktoni skedarin e mjedisit të krijuar për web concourse.

sudo nano /opt/concourse/web.env

Ndryshoni vlerën e CONCOURSE_EXTERNAL_URLdhe shtoni edhe dy rreshta të tjerë në fund të skedarit.

CONCOURSE_EXTERNAL_URL=https://ci.example.com
CONCOURSE_BIND_IP=127.0.0.1
CONCOURSE_BIND_PORT=8080

Ruani skedarin dhe rinisni serverin në internet Concourse Web, Worker dhe Nginx:

sudo systemctl restart concourse-worker concourse-web nginx

Të gjitha të dhënat e dërguara në dhe nga shfletuesi tani janë të siguruara me kriptime SSL.


Ngritja e makinave: Aplikimet në botën reale të AI

Ngritja e makinave: Aplikimet në botën reale të AI

Inteligjenca Artificiale nuk është në të ardhmen, është këtu në të tashmen Në këtë blog Lexoni se si aplikacionet e inteligjencës artificiale kanë ndikuar në sektorë të ndryshëm.

Sulmet DDOS: Një përmbledhje e shkurtër

Sulmet DDOS: Një përmbledhje e shkurtër

A jeni edhe ju viktimë e Sulmeve DDOS dhe jeni konfuz në lidhje me metodat e parandalimit? Lexoni këtë artikull për të zgjidhur pyetjet tuaja.

A e keni pyetur ndonjëherë veten se si fitojnë para hakerët?

A e keni pyetur ndonjëherë veten se si fitojnë para hakerët?

Ju mund të keni dëgjuar se hakerët fitojnë shumë para, por a keni menduar ndonjëherë se si i fitojnë ato para? Le te diskutojme.

Shpikjet revolucionare nga Google që do tju bëjnë të lehtë jetën tuaj.

Shpikjet revolucionare nga Google që do tju bëjnë të lehtë jetën tuaj.

Dëshironi të shihni shpikjet revolucionare nga Google dhe se si këto shpikje ndryshuan jetën e çdo njeriu sot? Më pas lexoni në blog për të parë shpikjet nga Google.

E Premte Thelbësore: Çfarë ndodhi me Makinat e drejtuara nga AI?

E Premte Thelbësore: Çfarë ndodhi me Makinat e drejtuara nga AI?

Koncepti i makinave vetë-drejtuese për të dalë në rrugë me ndihmën e inteligjencës artificiale është një ëndërr që e kemi prej kohësh. Por, pavarësisht nga disa premtime, ato nuk shihen askund. Lexoni këtë blog për të mësuar më shumë…

Singulariteti teknologjik: Një e ardhme e largët e qytetërimit njerëzor?

Singulariteti teknologjik: Një e ardhme e largët e qytetërimit njerëzor?

Ndërsa Shkenca evoluon me një ritëm të shpejtë, duke marrë përsipër shumë nga përpjekjet tona, rriten edhe rreziqet për t'iu nënshtruar një Singulariteti të pashpjegueshëm. Lexoni, çfarë mund të thotë singulariteti për ne.

Evolucioni i ruajtjes së të dhënave - Infografik

Evolucioni i ruajtjes së të dhënave - Infografik

Metodat e ruajtjes së të dhënave kanë evoluar mund të jenë që nga lindja e të dhënave. Ky blog mbulon evolucionin e ruajtjes së të dhënave në bazë të një infografike.

Funksionalitetet e shtresave të arkitekturës së referencës së të dhënave të mëdha

Funksionalitetet e shtresave të arkitekturës së referencës së të dhënave të mëdha

Lexoni blogun për të njohur shtresat e ndryshme në arkitekturën e të dhënave të mëdha dhe funksionalitetet e tyre në mënyrën më të thjeshtë.

6 Përfitimet e mahnitshme të të pasurit pajisje shtëpiake inteligjente në jetën tonë

6 Përfitimet e mahnitshme të të pasurit pajisje shtëpiake inteligjente në jetën tonë

Në këtë botë të drejtuar nga dixhitali, pajisjet inteligjente të shtëpisë janë bërë një pjesë thelbësore e jetës. Këtu janë disa përfitime të mahnitshme të pajisjeve shtëpiake inteligjente se si ato e bëjnë jetën tonë të vlefshme dhe më të thjeshtë.

Përditësimi shtesë i macOS Catalina 10.15.4 po shkakton më shumë probleme sesa zgjidhja

Përditësimi shtesë i macOS Catalina 10.15.4 po shkakton më shumë probleme sesa zgjidhja

Së fundmi Apple lëshoi ​​macOS Catalina 10.15.4 një përditësim shtesë për të rregulluar problemet, por duket se përditësimi po shkakton më shumë probleme që çojnë në bricking të makinerive mac. Lexoni këtë artikull për të mësuar më shumë