Layout go pet project di VPS

Halo, Habr! Nama saya Artyom Zheltak , saya seorang pemimpin tim, dan juga seorang guru di kursus "Pengembang Golang" di OTUS. Untuk mengantisipasi dimulainya aliran baru kursus , saya ingin berbagi artikel saya dengan Anda.


Saya percaya bahwa Golang itu hebat, tetapi masih ada banyak php dan proyek lain yang mengerjakan VPS, VDS di dunia. Anda dapat meletakkan buruh pelabuhan di sana, tetapi ini (menurut penulis) adalah komplikasi ulang dari tugas tersebut. Anda dapat mengkompilasi file dan mengunggah melalui FTP - itu tidak aman dan tidak feng shui, SFTP lebih aman, tetapi jangan feng shui lagi. Kemudian mari kita mengotomatisasi proses ini melalui CircleCI . Kami akan menulis file konfigurasi untuk CI langkah demi langkah, pada akhirnya kami akan mengumpulkan hasilnya dan menjalankan penyebaran.




Persyaratan implementasi


  1. Inovasi server minimal
  2. Penyebaran harus otomatis
  3. Titik masuk untuk penempatan adalah penandaan untuk perakitan dev dan konfirmasi manual tambahan untuk prod
  4. Majelis harus lulus pengujian otomatis
  5. Versi mekanisme rollback manual

Mengapa CircleCI?


Sejak awal, proyek ini menggunakan repositori bitbucket pribadi. (Sekarang repositori pribadi sudah ada di github.) Tanpa meninggalkan ekosistem, Atlasian memutuskan untuk menggunakan CircleCI (selanjutnya disebut CI). Saya suka itu:

  • pengaturan minimum
  • fitur ssh debug
  • versi gratis tetapi dengan keterbatasan
    • 2500 kredit / per minggu (penyelesaian sekitar 250 menit) #go dikumpulkan dan digunakan dengan cepat, kami sudah cukup
    • eksekusi berurutan tunggal # kami tidak memiliki banyak proyek kesayangan
    • hanya linux dan windows # kita perlu linux

Bagian Satu, alur kerja


Buat folder .circle dan buat file config.yml di dalamnya dan jelaskan alur kerja yang diharapkan di sana (urutan pelaksanaan tugas)

workflows: version: 2 tagged-build: jobs: - test - dev_deploy: requires: - test - approve_master_deploy: type: approval requires: - test - dev_deploy - prod_deploy: requires: - dev_deploy - approve_master_deploy 

Inilah hasilnya:

gambar

Kami menggambarkan pola yang menurutnya setiap komit akan diperiksa pertama kali dengan tes, kemudian diluncurkan ke dev, kemudian, dengan konfirmasi manual, dikirim ke server pertempuran. Untuk memandu gloss, tambahkan filter sehingga tugas hanya bekerja dengan tag.

 - dev_deploy: requires: - test filters: branches: ignore: /.*/ tags: only: /.*/ 

Langkah kedua, yang paling mudah


Mari kita mulai dengan menjalankan tes, akan ada kode minimum.

 jobs: test: docker: - image: circleci/golang:1.12 working_directory: ~/go-example/ steps: - checkout #   linter'   - run: go test -cover -v ./... 

Setelah kode kami diuji dan lulus pemeriksaan gaya kode, Anda dapat melakukan penerapan pada dev. Saya sarankan menggunakan supervisor (ver 3.1.4 pada saat penulisan) untuk memulai layanan go, kami akan mengumpulkan log untuk mereka.

Tambahkan file supervisor_ph.conf ke folder .circleci, dalam CI PH_NAME akan berubah menjadi nama proyek. Dan pada file yang sama kita akan menulis output dari log.

 [program:PH_NAME] stopasgroup=true user=deploy-user autostart=true autorestart=true stdout_logfile=/var/log/supervisor/PH_NAME.log stderr_logfile=/var/log/supervisor/PH_NAME.log redirect_stderr=true 

Semua yang membedakan proyek kami dari yang lain:



Sebarkan Waktu


Untuk dev dan prod, hanya server yang diubah dan sufiks ditambahkan ke nama aplikasi. Konfigurasi disimpan dalam variabel lingkungan. ( Aplikasi 12 faktor ) Kami akan mengambil bagian ini ke lingkungan, kami akan menggandakan sisanya.

 prod_deploy: environment: TARGET_IP: 0.0.0.0 TARGET_DIR: /var/www/deploy-user/go-example REMOTE_USER: deploy-user SERVICE_NAME: go_example_prod docker: - image: circleci/golang:1.12 working_directory: ~/go-example/ steps: - checkout - add_ssh_keys #   ci ,    - run: go build -ldflags "-X main.version=$CIRCLE_TAG" -o ./main ./src/main - run: ssh -o "StrictHostKeyChecking=no" $REMOTE_USER@$TARGET_IP "mkdir $TARGET_DIR/v$CIRCLE_TAG" #    ,        - run: scp main $REMOTE_USER@$TARGET_IP:$TARGET_DIR/v$CIRCLE_TAG/ #       - run: sed "s/PH_NAME/$SERVICE_NAME/g" .circleci/supervisor_ph.conf > .circleci/$SERVICE_NAME.conf - run: echo command=$TARGET_DIR/v$CIRCLE_TAG/main >> .circleci/$SERVICE_NAME.conf - run: scp .circleci/$SERVICE_NAME.conf $REMOTE_USER@$TARGET_IP:$TARGET_DIR/v$CIRCLE_TAG/ - run: ssh $REMOTE_USER@$TARGET_IP "ln -sf $TARGET_DIR/v$CIRCLE_TAG/$SERVICE_NAME.conf /etc/supervisord.d" - run: ssh $REMOTE_USER@$TARGET_IP "supervisorctl -c /etc/supervisord.conf reread && supervisorctl -c /etc/supervisord.conf update" - run: curl "$TELEGRAM_SERVICE?msg=$SERVICE_NAME%20v$CIRCLE_TAG%20deployed&channel=go_deploy" 

Untuk pemberitahuan, kami menggunakan bot kami sendiri, yang disebut melalui curl. Perintah `when: on_fail` berfungsi jika terjadi kesalahan, itu juga dapat digunakan untuk mengembalikan perubahan. Meskipun kami memiliki bot telegram, tetapi secara umum Anda dapat melakukannya tanpa itu dan menggunakan pemberitahuan standar: Slack, IRC. Plus notifikasi kesalahan masuk ke email.

Variabel `$ TELEGRAM_SERVICE` ditambahkan melalui bagian BUILD SETTING → Variabel Lingkungan.

 - run: command: curl "$TELEGRAM_SERVICE?msg=$SERVICE_NAME%20v$CIRCLE_TAG%20failed&channel=go_deploy" when: on_fail 

Garis finish


Kami mendorong di github atau di bitbucket. Setelah kita pergi ke CircleCI di proyek Add item



Kemudian pilih Mulai membangun. Langkah terakhir adalah menambahkan kunci ssh untuk otorisasi di server di bawah pengguna yang dipilih.



Semuanya bisa dilakukan menyebarkan, memberi tag dan mulai menikmati hidup. Versi terakhir ./.circleci/config.yml - di sini

Source: https://habr.com/ru/post/id485240/


All Articles