Cara Memasang dan Mengkonfigurasi Concourse CI di CentOS 7

Pengenalan

Integrasi Berterusan adalah praktik pembangunan perisian DevOps yang membolehkan para pemaju sering menggabungkan kod yang diubahsuai ke repositori bersama berkali-kali setiap hari. Selepas setiap gabungan, terbina dan ujian automatik dilakukan untuk mengesan masalah dalam kod. Ia membolehkan pemaju untuk mencari dan menyelesaikan kesilapan dengan cepat untuk meningkatkan kualiti perisian dan menyediakan penghantaran berterusan perisian. Beralih ke dan dari Concourse sangat mudah kerana ia menyimpan semua konfigurasi dalam fail deklaratif yang boleh diperiksa ke dalam kawalan versi. Ia juga menyediakan antara muka pengguna web yang memaparkan maklumat bina secara interaktif.

Komponen Concourse.
  • ATC adalah komponen utama Concourse. Ia bertanggungjawab untuk menjalankan UI dan API Web. Ia juga menjaga semua penjadualan paip.
  • TSA adalah pelayan SSH yang dibina khas. Ia bertanggungjawab untuk mendaftarkan pekerja dengan ATC dengan selamat.
  • Pekerja seterusnya menjalankan dua perkhidmatan yang berbeza:
    1. Garden adalah waktu operasi kontena dan antara muka untuk mengatur kontena dari jarak jauh pada pekerja.
    2. Baggageclaim adalah pelayan pengurusan cache dan artifak.
  • Fly adalah antara muka baris perintah yang digunakan untuk berinteraksi dengan ATC untuk mengkonfigurasi saluran saluran.

Prasyarat

  • Contoh server Vultr CentOS 7.
  • Pengguna sudo .

Pastikan anda menggantikan semua kejadian 192.0.2.1dan ci.example.comdengan alamat IP awam Vultr sebenar anda dan nama domain sebenar anda.

Kemas kini sistem asas anda menggunakan panduan Cara Mengemas kini CentOS 7 . Setelah sistem anda dikemas kini, terus pasang PostgreSQL.

Pasang dan Konfigurasikan Pangkalan Data PostgreSQL

PostgreSQL adalah sistem pangkalan data hubungan objek. Concourse menyimpan data saluran paipnya ke dalam pangkalan data PostgreSQL. Tambahkan repositori 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

Pasang pelayan pangkalan data PostgreSQL.

sudo yum -y install postgresql96-server postgresql96-contrib

Inisialkan pangkalan data.

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

initdbmembuat kluster pangkalan data PostgreSQL baru, yang merupakan kumpulan pangkalan data yang diuruskan oleh satu contoh pelayan. Edit pg_hba.conffail untuk mengaktifkan pengesahan berasaskan MD5.

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

Cari baris berikut dan tukar nilai peerdan identdalam METHODruang kepada trustdan md5, masing-masing.

# 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

Setelah dikemas kini, konfigurasi harus kelihatan seperti ini.

# 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

Mulakan pelayan PostgreSQL dan dayakannya secara automatik pada masa boot.

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

Tukar kata laluan untuk pengguna PostgreSQL lalai.

sudo passwd postgres

Log masuk sebagai pengguna PostgreSQL:

sudo su - postgres

Buat pengguna PostgreSQL baru untuk Concourse CI.

createuser concourse

Catatan : Pengguna PostgreSQL lalai dapat digunakan untuk pengesahan pangkalan data, tetapi disarankan untuk menggunakan pengguna khusus untuk pengesahan pangkalan data Concourse dalam persediaan produksi.

PostgreSQL menyediakan shell untuk menjalankan pertanyaan pada pangkalan data. Tukar ke shell PostgreSQL dengan menjalankan:

psql

Tetapkan kata laluan untuk pengguna pangkalan data Concourse yang baru dibuat.

ALTER USER concourse WITH ENCRYPTED password 'DBPassword';

Penting : Ganti DBPassworddengan kata laluan yang kuat. Buat nota kata laluan kerana ia akan diperlukan kemudian dalam tutorial.

Buat pangkalan data baru untuk Concourse.

CREATE DATABASE concourse OWNER concourse;

Keluar dari psqlcangkerang.

\q

Beralih ke pengguna sudo dari pengguna postgres semasa.

exit

Muat turun dan Pasang Concourse CI

Muat turun versi terbaru dari Concourse yang dapat dilaksanakan dan simpan /usr/binsehingga dapat dilaksanakan secara langsung. Versi terbaru binari Concourse and Fly boleh didapati di halaman muat turun Concourse . Keluaran baru sangat kerap. Gantikan pautan di bawah dengan pautan baru untuk versi terkini.

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

Begitu juga, muat turun versi terbaru lalat yang boleh dieksekusi dan simpan di dalamnya /usr/bin.

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

Fly adalah antara muka baris perintah untuk menyambung ke API ATC Concourse CI. Fly tersedia untuk pelbagai platform seperti Linux, Windows dan MacOS.

Tentukan kebenaran pelaksanaan untuk dimuat turun concoursedan flybinari.

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

Semak sama ada Concourse and Fly berfungsi dengan betul dengan menyemak versi mereka.

concourse -version
fly -version

Buat dan Atur Kekunci RSA

Pasangan utama RSA menyediakan cara untuk menyulitkan komunikasi antara komponen Concourse.

Untuk Concourse untuk bekerja, sekurang-kurangnya tiga pasang kunci mesti dihasilkan. Untuk menyulitkan data sesi, menjana a session_signing_key. Kunci ini juga akan digunakan oleh TSA untuk menandatangani permintaan yang dibuat kepada ATC. Untuk melindungi pelayan TSA SSH, buat a tsa_host_key. Akhirnya, hasilkan worker_keyuntuk setiap pekerja.

Buat direktori baru untuk menyimpan kunci dan konfigurasi yang berkaitan dengan Concourse CI.

sudo mkdir /opt/concourse

Hasilkan kunci yang diperlukan.

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

Memberi kebenaran kunci awam pekerja dengan menyalin kandungannya ke authorized_worker_keysfail:

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

Memulakan Konsert

Concourse menyediakan dua komponen berasingan yang perlu dimulakan, web dan pekerja. Mulakan laman web Concourse.

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

Tukar nama pengguna dan kata laluan basic-authjika dikehendaki. Pastikan laluan ke fail utama adalah betul dan pastikan nilai yang betul untuk nama pengguna dan kata laluan dalam konfigurasi pangkalan data PostgreSQL disediakan.

Catatan : ATC akan mendengar port lalai 8080dan TSA akan mendengar port 2222. Sekiranya pengesahan tidak diingini, lulus --no-really-i-dont-want-any-authpilihan setelah membuang pilihan autentikasi asas.

Setelah pelayan web dimulakan, output berikut harus dipaparkan.

{"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"}}

Hentikan pelayan buat masa sekarang, kerana beberapa perkara lagi mesti ditetapkan.

Mulakan 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

Perintah di atas akan menganggap bahawa TSA berjalan di localhost dan mendengar port lalai 2222.

Walaupun web dan pekerja Concourse boleh dimulakan dengan mudah menggunakan arahan di atas, disyorkan untuk menggunakan Systemd untuk menguruskan pelayan.

Konfigurasi Persekitaran dan Perkhidmatan Sistem

Menggunakan perkhidmatan Systemd untuk mengurus aplikasi memastikan bahawa aplikasi secara automatik dimulakan pada kegagalan dan pada waktu boot. Server Concourse tidak mengambil data dari sebarang fail konfigurasi, tetapi ia boleh mengakses data dari pembolehubah persekitaran. Daripada menetapkan pembolehubah persekitaran global, buat fail baru untuk menyimpan pembolehubah persekitaran dan kemudian lulus pembolehubah ke Concourse CI menggunakan perkhidmatan Systemd.

Buat fail persekitaran baru untuk web Concourse.

sudo nano /opt/concourse/web.env

Isi fail.

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

Tukar nama pengguna dan kata laluan BASIC_AUTHjika dikehendaki. Pastikan laluan ke fail utama adalah betul dan pastikan nilai yang betul untuk nama pengguna dan kata laluan dalam konfigurasi pangkalan data PostgreSQL disediakan.

Begitu juga, buat file persekitaran untuk pekerja.

sudo nano /opt/concourse/worker.env

Isi fail.

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

Oleh kerana fail persekitaran mengandungi nama pengguna dan kata laluan, ubah izinnya sehingga tidak dapat diakses oleh pengguna lain.

sudo chmod 600 /opt/concourse/*.env

Sekarang buat pengguna baru untuk Concourse untuk menjalankan persekitaran web. Ini akan memastikan pelayan web berjalan di persekitaran terpencil.

sudo adduser --system concourse

Berikan hak milik pengguna concourse atas direktori fail Concourse CI.

sudo chown -R concourse:concourse /opt/concourse

Buat fail perkhidmatan systemd baru untuk perkhidmatan web Concourse.

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

Isi fail.

[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

Simpan dan tutup fail. Buat fail perkhidmatan baru untuk perkhidmatan pekerja Concourse.

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

Isi fail.

[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

Perkhidmatan web dan pekerja kini boleh dimulakan secara langsung dengan menjalankan:

sudo systemctl start concourse-web concourse-worker

Untuk membolehkan proses pekerja dan web bermula secara automatik pada waktu boot, jalankan:

sudo systemctl enable concourse-worker concourse-web

Untuk memeriksa status perkhidmatan, jalankan:

sudo systemctl status concourse-worker concourse-web

Jika perkhidmatan tidak dimulakan, atau dalam FAILEDkeadaan, alih keluar cache dari /tmpdirektori.

sudo rm -rf /tmp/*

Mulakan semula perkhidmatan.

sudo systemctl restart concourse-worker concourse-web

Perhatikan bahawa kali ini perkhidmatan telah bermula dengan betul. Hasil apabila mengesahkan status perkhidmatan harus serupa.

[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.

Laraskan firewall anda untuk membolehkan port 8080, di mana ATS berjalan dan port 2222, di mana TSA berjalan.

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

Menyambung ke Pelayan

Apabila pelayan dimulakan, antara muka web Concourse CI boleh diakses dengan pergi ke http://192.0.2.1:8080mana-mana penyemak imbas. Log masuk menggunakan nama pengguna dan kata laluan yang disediakan dalam fail persekitaran.

Untuk menyambung ke pelayan menggunakan Fly, jalankan:

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

Perintah di atas digunakan untuk masuk awal ke pelayan. -tdigunakan untuk memberikan nama sasaran. ganti my-cidengan nama sasaran yang dikehendaki. Perintah di atas akan log masuk ke pasukan lalai main. Ia akan meminta nama pengguna dan kata laluan yang disediakan dalam fail persekitaran.

Keluarannya akan seperti berikut.

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

username: admin
password:

target saved

Log masuk sasaran akan disimpan selama sehari. Selepas itu, ia akan tamat tempoh.

Untuk log keluar segera.

fly -t my-ci logout

fly boleh digunakan untuk masuk ke pelayan di luar rangkaian, tetapi hanya jika pelayan mempunyai alamat IP awam dan dapat diakses dari luar rangkaian. Binari Windows atau MacOS boleh dimuat turun dari tapak muat turun atau dari UI web pelayan.

Menyediakan Proxy Reverse Nginx

Log masuk, dan maklumat lain yang dihantar melalui UI web ke pelayan Concourse tidak selamat. Sambungan tidak disulitkan. Proksi terbalik Nginx boleh disediakan dengan SSL Let's Encrypt percuma.

Pasang pelayan web Nginx dan Certbot, yang merupakan aplikasi pelanggan untuk Let's Encrypt CA.

sudo yum -y install certbot-nginx nginx

Mulakan dan aktifkan Nginx secara automatik pada waktu boot:

sudo systemctl start nginx
sudo systemctl enable nginx

Sebelum permintaan dibuat untuk sijil, port 80 dan 443, atau perkhidmatan HTTP dan HTTPS standard, mesti diaktifkan melalui firewall. Certbot akan memeriksa pihak berkuasa domain sebelum mengeluarkan sijil.

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

Port 8080 tidak perlu lagi dibenarkan melalui firewall lagi kerana Concourse kini akan dijalankan pada port HTTPS standard. Keluarkan entri firewall untuk membenarkan port 8080.

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

Nota

Untuk mendapatkan sijil dari Let's Encrypt CA, domain yang akan dibuat sijil mesti diarahkan ke pelayan. Sekiranya tidak, buat perubahan yang diperlukan pada rekod DNS domain dan tunggu DNS disebarkan sebelum membuat permintaan sijil lagi. Certbot memeriksa pihak berkuasa domain sebelum memberikan sijil.

Menjana sijil SSL.

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

Sijil yang dihasilkan kemungkinan akan disimpan dalam /etc/letsencrypt/live/ci.example.com/direktori. Sijil SSL akan disimpan sebagai fullchain.pemdan kunci persendirian akan disimpan sebagai privkey.pem.

Let's Encrypt certificates expire in 90 days, jadi ia disyorkan pembaharuan auto untuk sijil ditetapkan menggunakan cronjobs. Cron adalah perkhidmatan sistem yang digunakan untuk menjalankan tugas berkala.

Buka fail kerja cron.

sudo crontab -e

Tambahkan garisan berikut pada akhir fail.

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

Pekerjaan cron di atas akan dijalankan setiap hari Isnin jam 5:30 pagi. Sekiranya sijil perlu tamat tempoh, ia akan diperbaharui secara automatik.

Buat tuan rumah maya yang baru.

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

Isi fail.

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;
    }
  }

Catatan : Ganti ci.example.comdengan domain sebenar.

Edit fail Persekitaran yang dibuat untuk Web konsert.

sudo nano /opt/concourse/web.env

Tukar nilai CONCOURSE_EXTERNAL_URLdan tambahkan dua baris lagi di hujung fail.

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

Simpan fail dan mulakan semula pelayan web Concourse Web, Worker dan Nginx:

sudo systemctl restart concourse-worker concourse-web nginx

Semua data yang dihantar ke dan dari penyemak imbas kini diamankan dengan penyulitan SSL.



Leave a Comment

Pandangan tentang 26 Teknik Analisis Data Besar: Bahagian 1

Pandangan tentang 26 Teknik Analisis Data Besar: Bahagian 1

Pandangan tentang 26 Teknik Analisis Data Besar: Bahagian 1

6 Perkara Yang Sangat Menggila Tentang Nintendo Switch

6 Perkara Yang Sangat Menggila Tentang Nintendo Switch

Ramai daripada anda tahu Switch akan keluar pada Mac 2017 dan ciri baharunya. Bagi yang tidak tahu, kami telah menyediakan senarai ciri yang menjadikan 'Tukar' sebagai 'gajet yang mesti ada'.

Janji Teknologi Yang Masih Tidak Ditepati

Janji Teknologi Yang Masih Tidak Ditepati

Adakah anda menunggu gergasi teknologi memenuhi janji mereka? semak apa yang masih belum dihantar.

Fungsi Lapisan Seni Bina Rujukan Data Besar

Fungsi Lapisan Seni Bina Rujukan Data Besar

Baca blog untuk mengetahui lapisan berbeza dalam Seni Bina Data Besar dan fungsinya dengan cara yang paling mudah.

Bagaimana AI Boleh Mengambil Automasi Proses ke Tahap Seterusnya?

Bagaimana AI Boleh Mengambil Automasi Proses ke Tahap Seterusnya?

Baca ini untuk mengetahui cara Kecerdasan Buatan semakin popular di kalangan syarikat berskala kecil dan cara ia meningkatkan kebarangkalian untuk menjadikan mereka berkembang dan memberikan pesaing mereka kelebihan.

CAPTCHA: Berapa Lama Ia Boleh Kekal Sebagai Teknik Berdaya maju Untuk Perbezaan Manusia-AI?

CAPTCHA: Berapa Lama Ia Boleh Kekal Sebagai Teknik Berdaya maju Untuk Perbezaan Manusia-AI?

CAPTCHA telah menjadi agak sukar untuk diselesaikan oleh pengguna dalam beberapa tahun kebelakangan ini. Adakah ia dapat kekal berkesan dalam pengesanan spam dan bot pada masa hadapan?

Keunikan Teknologi: Masa Depan Tamadun Manusia yang Jauh?

Keunikan Teknologi: Masa Depan Tamadun Manusia yang Jauh?

Apabila Sains Berkembang pada kadar yang pantas, mengambil alih banyak usaha kita, risiko untuk menundukkan diri kita kepada Ketunggalan yang tidak dapat dijelaskan juga meningkat. Baca, apakah makna ketunggalan bagi kita.

Teleperubatan Dan Penjagaan Kesihatan Jauh: Masa Depan Ada Di Sini

Teleperubatan Dan Penjagaan Kesihatan Jauh: Masa Depan Ada Di Sini

Apakah teleperubatan, penjagaan kesihatan jauh dan impaknya kepada generasi akan datang? Adakah ia tempat yang baik atau tidak dalam situasi pandemik? Baca blog untuk mencari paparan!

Pernahkah Anda Terfikir Bagaimana Penggodam Mendapatkan Wang?

Pernahkah Anda Terfikir Bagaimana Penggodam Mendapatkan Wang?

Anda mungkin pernah mendengar bahawa penggodam memperoleh banyak wang, tetapi pernahkah anda terfikir bagaimana mereka memperoleh wang seperti itu? Mari berbincang.

Kemas Kini Tambahan macOS Catalina 10.15.4 Menyebabkan Lebih Banyak Isu Daripada Penyelesaian

Kemas Kini Tambahan macOS Catalina 10.15.4 Menyebabkan Lebih Banyak Isu Daripada Penyelesaian

Baru-baru ini Apple mengeluarkan macOS Catalina 10.15.4 kemas kini tambahan untuk menyelesaikan masalah tetapi nampaknya kemas kini itu menyebabkan lebih banyak masalah yang membawa kepada pemusnahan mesin mac. Baca artikel ini untuk mengetahui lebih lanjut