การดำเนินการนี้ช่วยให้คุณสามารถอัปโหลดแพ็คเกจการแจกจ่าย Python ของคุณในไดเร็กทอรี dist/
ไปยัง PyPI ข้อความนี้แนะนำภาพรวมการใช้งานที่เรียบง่าย สำหรับคำแนะนำแบบละเอียดเพิ่มเติม โปรดดูคู่มือ PyPA
หากคุณมีคำติชมเกี่ยวกับเวอร์ชันแอ็กชันเฉพาะ โปรดแสดงความคิดเห็นในการอภิปรายเกี่ยวกับการประกาศในแต่ละรุ่นที่เกี่ยวข้อง
master
เวอร์ชันสาขา master
พระอาทิตย์ตกแล้ว โปรดเปลี่ยนเวอร์ชัน GitHub Action ที่คุณใช้จาก master
เป็น release/v1
หรือใช้แท็กที่ตรงกันทุกประการ หรือเลือกใช้ Git Commit SHA และ Dependabot แบบเต็ม
บันทึก
ไม่สามารถใช้การเผยแพร่ที่เชื่อถือได้จากภายในเวิร์กโฟลว์ที่ใช้ซ้ำได้ในขณะนี้ ขอแนะนำให้สร้างเวิร์กโฟลว์ที่ไม่สามารถใช้ซ้ำได้ซึ่งมีงานที่เรียกใช้เวิร์กโฟลว์ที่นำกลับมาใช้ใหม่แทน จากนั้นทำขั้นตอนการเผยแพร่ที่เชื่อถือได้จากงานที่แยกต่างหากภายในเวิร์กโฟลว์ที่ไม่สามารถใช้ซ้ำได้ หรือคุณสามารถใช้ชื่อผู้ใช้/โทเค็นภายในเวิร์กโฟลว์ที่นำมาใช้ซ้ำได้
บันทึก
การเผยแพร่ที่เชื่อถือได้บางครั้งอ้างอิงถึงเทคโนโลยีพื้นฐาน - OpenID Connect หรือเรียกสั้น ๆ ว่า OIDC หากคุณเห็นการอ้างอิงถึง "การเผยแพร่ OIDC" ในบริบทของ PyPI นี่คือสิ่งที่พวกเขาอ้างถึง
ตัวอย่างนี้เจาะลึกถึงแนวทางปฏิบัติที่ดีที่สุดในปัจจุบัน หากคุณต้องการใช้โทเค็น API โดยตรง หรือใช้ชื่อผู้ใช้และรหัสผ่านที่มีความปลอดภัยน้อยกว่า โปรดดูวิธีระบุชื่อผู้ใช้และรหัสผ่าน
การดำเนินการนี้รองรับการใช้งานการเผยแพร่ที่เชื่อถือได้ของ PyPI ซึ่งอนุญาตการตรวจสอบสิทธิ์กับ PyPI โดยไม่ต้องใช้โทเค็น API หรือชุดชื่อผู้ใช้/รหัสผ่านที่กำหนดค่าด้วยตนเอง หากต้องการดำเนินการเผยแพร่ที่เชื่อถือได้ด้วยการดำเนินการนี้ ผู้เผยแพร่โครงการของคุณจะต้องได้รับการกำหนดค่าบน PyPI แล้ว
หากต้องการเข้าสู่ขั้นตอนการเผยแพร่ที่เชื่อถือได้ ให้กำหนดค่างานของการดำเนินการนี้ด้วย id-token: write
และ ไม่มี ชื่อผู้ใช้หรือรหัสผ่านที่ชัดเจน:
# .github/workflows/ci-cd.ymljobs: pypi-publish:name: อัปโหลดรุ่นไปยัง PyPIruns-on: ubuntu-latestenvironment: ชื่อ: pypi url: https://pypi.org/p/<your-pypi-project -ชื่อ>สิทธิ์: id-token: เขียน # สำคัญ: การอนุญาตนี้จำเป็นสำหรับการเผยแพร่ที่เชื่อถือได้ขั้นตอน:# ดึงข้อมูลการแจกแจงของคุณที่นี่- ชื่อ: เผยแพร่การแจกจ่ายแพ็คเกจไปยัง PyPI ใช้: pypa/gh-action-pypi-publish@release/v1
บันทึก
เคล็ดลับสำหรับมือโปร: แทนที่จะใช้ตัวชี้สาขา เช่น unstable/v1
ให้ปักหมุดเวอร์ชันของ Actions ที่คุณใช้กับเวอร์ชันที่แท็กหรือยืนยันตัวระบุ sha1 สิ่งนี้จะทำให้ขั้นตอนการทำงานของคุณปลอดภัยมากขึ้นและสามารถทำซ้ำได้ดีขึ้น ช่วยให้คุณประหยัดจากความประหลาดใจที่ไม่พึงประสงค์กะทันหัน
สามารถใช้ดัชนีอื่นๆ ที่รองรับการเผยแพร่ที่เชื่อถือได้ เช่น TestPyPI:
- ชื่อ: เผยแพร่การแจกแจงแพ็คเกจไปยัง TestPyPI การใช้งาน: pypa/gh-action-pypi-publish@release/v1 ด้วย: repository-url: https://test.pypi.org/legacy/
(อย่าลืมอัปเดตชื่อสภาพแวดล้อมเป็น testpypi
หรือคล้ายกัน!)
บันทึก
เคล็ดลับสำหรับมืออาชีพ: ตั้งค่าเฉพาะ id-token: write
ในงานที่เผยแพร่ ไม่ใช่ทั่วโลก นอกจากนี้ พยายามแยกสิ่งปลูกสร้างจากการเผยแพร่ ซึ่งจะทำให้แน่ใจได้ว่าสคริปต์ใดๆ ที่ถูกแทรกเข้าไปในสภาพแวดล้อมการสร้างหรือทดสอบอย่างประสงค์ร้าย จะไม่สามารถยกระดับสิทธิ์ในขณะที่แอบมองได้
กรณีการใช้งานทั่วไปคือการอัปโหลดแพ็คเกจบนคอมมิตที่ติดแท็กเท่านั้น โดยเพิ่มตัวกรองให้กับงาน:
ถ้า: github.event_name == 'push' && startWith (github.ref, 'refs/tags')
สำคัญ
ขณะนี้การสนับสนุนสำหรับการสร้างและการอัปโหลดเอกสารรับรองดิจิทัลอยู่ในขั้นทดลองและจำกัดเฉพาะขั้นตอนการเผยแพร่ที่เชื่อถือได้โดยใช้ PyPI หรือ TestPyPI เท่านั้น การสนับสนุนคุณสมบัตินี้ยังไม่เสถียร การตั้งค่าและลักษณะการทำงานที่อธิบายไว้ด้านล่างอาจเปลี่ยนแปลงได้โดยไม่ต้องแจ้งให้ทราบล่วงหน้า
บันทึก
การสร้างและการอัปโหลดเอกสารรับรองดิจิทัลในปัจจุบันต้องมีการตรวจสอบสิทธิ์กับผู้เผยแพร่ที่เชื่อถือได้
ขณะนี้การสร้างการรับรองดิจิทัลที่ลงนามสำหรับไฟล์การแจกจ่ายทั้งหมดและการอัปโหลดทั้งหมดเข้าด้วยกันจะเปิดใช้งานตามค่าเริ่มต้นสำหรับทุกโปรเจ็กต์ที่ใช้ Trusted Publishing หากต้องการปิดใช้งาน ให้ตั้งค่า attestations
ดังต่อไปนี้:
ด้วย: การรับรอง: เท็จ
ออบเจ็กต์การรับรองถูกสร้างขึ้นโดยใช้ Sigstore สำหรับแพ็คเกจการแจกจ่ายแต่ละรายการ โดยเซ็นชื่อด้วยข้อมูลประจำตัวที่ได้รับจากโทเค็น OIDC ของ GitHub ที่เชื่อมโยงกับเวิร์กโฟลว์ปัจจุบัน ซึ่งหมายความว่าทั้งการตรวจสอบสิทธิ์การเผยแพร่ที่เชื่อถือได้และเอกสารรับรองจะเชื่อมโยงกับข้อมูลประจำตัวเดียวกัน
GitHub Action นี้ไม่มีส่วนเกี่ยวข้องกับ การสร้างการกระจายแพ็คเกจ ผู้ใช้มีหน้าที่รับผิดชอบในการเตรียม dists สำหรับการอัปโหลดโดยใส่ลงใน dist/
โฟลเดอร์ก่อนที่จะเรียกใช้การดำเนินการนี้
สำคัญ
เนื่องจาก GitHub Action นี้เป็นแบบอิงนักเทียบท่า จึงสามารถใช้ได้จากภายในงานที่ใช้ GNU/Linux ในเวิร์กโฟลว์ CI/CD ของ GitHub Actions เท่านั้น นี่เป็นเพราะการออกแบบและไม่น่าจะเปลี่ยนแปลงได้เนื่องจากการพิจารณาหลายประการที่เราพึ่งพา
สิ่งนี้ไม่ควรหยุดการเผยแพร่แพ็คเกจการแจกจ่ายเฉพาะแพลตฟอร์ม ขอแนะนำอย่างยิ่งให้แยกงานสำหรับการสร้างวงล้อเฉพาะ OS ออกจากงานเผยแพร่ วิธีนี้ช่วยให้สามารถ (1) ทดสอบสิ่งประดิษฐ์เดียวกันกับที่กำลังจะอัปโหลดไปยัง PyPI (2) ป้องกันงานที่ไม่ซิงโครไนซ์แบบขนานจากการเผยแพร่เพียงส่วนหนึ่งของ dists แบบอะซิงโครนัส (ในกรณีที่งานบางส่วนล้มเหลวและงานอื่น ๆ ประสบความสำเร็จ ด้วยการเปิดตัวที่ไม่สมบูรณ์บน PyPI) และ (3) ทำการอัปโหลดแบบอะตอมมิกไปยัง PyPI (เมื่อส่วนหนึ่งของ dists ปรากฏบน PyPI โปรแกรมติดตั้งเช่น pip จะใช้เวอร์ชันนั้นสำหรับการแก้ไขการพึ่งพา แต่สิ่งนี้ อาจทำให้สภาพแวดล้อมบางอย่างใช้ sdists ในขณะที่วงล้อสำหรับรันไทม์ยังไม่พร้อมใช้งาน)
หากต้องการใช้การเรียบเรียงประเภทนี้ โปรดใช้ actions/upload-artifact
และ actions/download-artifact
สำหรับการแชร์ dists ที่สร้างขึ้นระหว่างขั้นตอนและงาน จากนั้น ใช้การตั้ง needs
เพื่อสั่งลำดับขั้นตอนการสร้าง ทดสอบ และเผยแพร่
เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด ให้พิจารณาว่าเวิร์กโฟลว์ประเภทใดที่เหมาะกับความต้องการเฉพาะของโครงการของคุณ
ตัวอย่างเช่น คุณสามารถใช้งานแบบขนานที่ส่งทุกคอมมิตไปยัง TestPyPI หรือเซิร์ฟเวอร์ดัชนีของคุณเอง เช่น devpi
สำหรับสิ่งนี้ คุณจะต้อง (1) ระบุค่า repository-url
ที่กำหนดเอง และ (2) สร้างหมายเลขเวอร์ชันที่ไม่ซ้ำกันสำหรับการอัปโหลดแต่ละครั้ง เพื่อไม่ให้สร้างข้อขัดแย้ง อย่างหลังเป็นไปได้หากคุณใช้แพ็คเกจ setuptools_scm
แต่คุณสามารถประดิษฐ์โซลูชันของคุณเองโดยพิจารณาจากระยะห่างถึงการคอมมิตที่ติดแท็กล่าสุด
คุณจะต้องสร้างโทเค็นอื่นสำหรับโฮสต์แยกต่างหาก จากนั้นบันทึกเป็นความลับ repo GitHub ภายใต้สภาพแวดล้อมที่ใช้ในงานของคุณ แม้ว่าการส่งรหัสผ่านจะปิดใช้งานการเผยแพร่แบบ Secretless Trusted ดังนั้นจึงควรกำหนดค่าแทนเมื่อเผยแพร่ไปยัง TestPyPI ไม่ใช่แบบกำหนดเอง
การร้องขอการดำเนินการในกรณีนี้จะมีลักษณะดังนี้:
- ชื่อ: เผยแพร่แพ็คเกจไปยัง TestPyPI การใช้งาน: pypa/gh-action-pypi-publish@release/v1 ด้วย:รหัสผ่าน: ${{ secrets.TEST_PYPI_API_TOKEN }}repository-url: https://test.pypi.org/legacy/
คุณสามารถเปลี่ยนไดเร็กทอรีเป้าหมายเริ่มต้นของ dist/
เป็นไดเร็กทอรีใดก็ได้ที่คุณต้องการ การร้องขอการดำเนินการตอนนี้จะมีลักษณะดังนี้:
- ชื่อ: เผยแพร่แพ็คเกจไปยัง PyPI การใช้งาน: pypa/gh-action-pypi-publish@release/v1 ด้วย: แพ็คเกจ-dir: กำหนดเอง-dir/
ขอแนะนำให้คุณเรียกใช้ twine check
หลังจากสร้างไฟล์ของคุณแล้ว แต่ยังเรียกใช้ twine check
ก่อนอัปโหลดด้วย คุณยังสามารถปิดการใช้งานการตรวจสอบเกลียวด้วย:
ด้วย: ตรวจสอบข้อมูลเมตา: เท็จ
บางครั้ง เมื่อคุณเผยแพร่ผลงานจากหลายแห่ง ขั้นตอนการทำงานของคุณอาจกระทบต่อสภาวะการแข่งขัน ตัวอย่างเช่น เมื่อเผยแพร่จาก CI หลายรายการ หรือแม้แต่มีเวิร์กโฟลว์ที่มีขั้นตอนเดียวกันถูกทริกเกอร์ภายใน GitHub Actions CI/CD สำหรับเหตุการณ์ที่แตกต่างกันที่เกี่ยวข้องกับการกระทำระดับสูงเดียวกัน
เพื่ออำนวยความสะดวกในการใช้งานนี้ คุณอาจใช้การตั้งค่า skip-existing
(ปิดใช้งานโดยค่าเริ่มต้น) ได้ดังนี้:
ด้วย: ข้ามที่มีอยู่: จริง
บันทึก
เคล็ดลับสำหรับมืออาชีพ: พยายามหลีกเลี่ยงการเปิดใช้งานการตั้งค่านี้หากเป็นไปได้ หากคุณมีขั้นตอนในการเผยแพร่ไปยังทั้ง PyPI และ TestPyPI ให้พิจารณาใช้เฉพาะขั้นตอนหลังเท่านั้น โดยที่ขั้นตอนแรกล้มเหลวอย่างดังในการทำซ้ำ
บางครั้ง twine upload
อาจล้มเหลว และในการแก้ไขข้อบกพร่องให้ใช้การตั้งค่า verbose
ดังต่อไปนี้:
ด้วย: verbose: จริง
คุณอาจต้องการตรวจสอบว่าไฟล์บน PyPI ได้รับการอัปโหลดโดยอัตโนมัติโดยสคริปต์ CI หรือไม่ มันจะแสดงค่า SHA256, MD5, BLAKE2-256 ของไฟล์ที่จะอัปโหลด
ด้วย: พิมพ์แฮช: จริง
ชื่อผู้ใช้เริ่มต้นคือ __token__
หากคุณเผยแพร่ไปยังรีจิสทรีที่กำหนดเองซึ่งไม่มีโทเค็น API เช่น devpi
คุณอาจต้องระบุคู่ชื่อผู้ใช้และรหัสผ่านที่กำหนดเอง นี่คือวิธีการทำ
ด้วย: ผู้ใช้: guidopassword: ${{ Secrets.DEVPI_PASSWORD }}
ข้อมูลลับที่ใช้ใน ${{ secrets.DEVPI_PASSWORD }}
จะต้องถูกสร้างขึ้นบนหน้าสภาพแวดล้อมภายใต้การตั้งค่าของโครงการของคุณบน GitHub ดูการสร้างและใช้ข้อมูลลับ
ในอดีต เมื่อเผยแพร่ไปยัง PyPI วิธีที่ปลอดภัยที่สุดในการกำหนดขอบเขตการเข้าถึงสำหรับการเผยแพร่อัตโนมัติคือการใช้คุณสมบัติโทเค็น API ของ PyPI เราจะทำให้โปรเจ็กต์มีขอบเขตและบันทึกเป็นความลับที่เชื่อมโยงกับสภาพแวดล้อมในการตั้งค่าที่เก็บ GitHub โดยตั้งชื่อว่า ${{ secrets.PYPI_API_TOKEN }}
เป็นต้น ดูการสร้างและใช้ข้อมูลลับ แม้ว่าจะยังคงปลอดภัย แต่ขณะนี้การเผยแพร่ที่เชื่อถือได้ได้รับการสนับสนุนผ่านโทเค็น API เพื่อเป็นแนวทางปฏิบัติที่ดีที่สุดบนแพลตฟอร์มที่รองรับ (เช่น GitHub)
Dockerfile และสคริปต์และเอกสารที่เกี่ยวข้องในโปรเจ็กต์นี้เผยแพร่ภายใต้สิทธิ์การใช้งาน BSD 3-clause